VBA Excel, plage trop grande pour calculer ?

Fermé
dr_doak Messages postés 3 Date d'inscription dimanche 29 juin 2008 Statut Membre Dernière intervention 25 septembre 2008 - 25 sept. 2008 à 19:48
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 - 15 oct. 2008 à 23:28
Bonjour,

J'ai rédigé une petite fonction Excel pour calculer une statistique à partir d'un échantillon, d'une plage de données dans ma feuille.
Les calculs sont simples, mais nombreux et fastidieux.
J'ai donc fait ce module ci-dessous :

************************************************************************

Function STATAGOSTINO(rPlage As Range)

Dim n As Long
Dim A As Double
Dim B As Double
Dim C As Double
Dim D As Double
Dim E As Double
Dim F As Double
Dim G As Double
Dim H As Double
Dim J As Double
Dim K As Double
Dim L As Double
Dim Z As Double
Dim Y As Double
Dim O As Double
Dim T As Double
Dim p As Double
Dim q As Double
Dim r As Double
Dim X As Double
Dim s As Double
Dim stat As Double
Dim i As Long

n = rPlage.Cells.Count
A = 0
B = 0
C = 0
D = 0
E = 0
F = 0
G = 0
H = 0
J = 0
K = 0
L = 0
Z = 0
Y = 0
O = 0
T = 0
p = 0
q = 0
r = 0
X = 0
s = 0
stat = 0

For i = 1 To n
X = X + (rPlage.Cells(i) / n)
Next i

For i = 1 To n
s = s + (rPlage.Cells(i) - X) ^ 2
Next i
s = s / (n - 1)
s = s ^ (1 / 2)

For i = 1 To n
p = p + (((rPlage.Cells(i) - X) ^ 3) / n)
Next i

For i = 1 To n
q = q + (((rPlage.Cells(i) - X) ^ 2) / n)
Next i

For i = 1 To n
r = r + ((((rPlage.Cells(i) - X) / s) ^ 4))
Next i

O = p / (q ^ (3 / 2))
A = O * (((n + 1) * (n + 3)) / (6 * (n - 2))) ^ (1 / 2)
B = (3 * (n ^ 2 + 27 * n - 70) * (n + 1) * (n + 3)) / ((n - 2) * (n + 5) * (n + 7) * (n + 9))
C = (2 * (B - 1)) ^ (1 / 2) - 1
D = C ^ (1 / 2)
E = 1 / ((Log(D)) ^ (1 / 2))
F = A / (2 / (C - 1)) ^ (1 / 2)
Z = E * Log((F + (F ^ 2 + 1) ^ (1 / 2)))

T = r * (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3)) - (3 * (n - 1) ^ 2) / ((n - 2) * (n - 3))
G = (24 * n * (n - 2) * (n - 3)) / (((n + 1) ^ 2) * (n + 3) * (n + 5))
H = (T * (n - 2) * (n - 3)) / ((n + 1) * (n - 1) * (G ^ (1 / 2)))
J = ((6 * (n ^ 2 - 5 * n + 2)) / ((n + 7) * (n + 9))) * (((6 * (n + 3) * (n + 5)) / (n * (n - 2) * (n - 3))) ^ (1 / 2))
K = 6 + (8 / J) * ((2 / J) + ((1 + (4 / (J ^ 2))) ^ (1 / 2)))
L = (1 - (2 / K)) / (1 + H * ((2 / (K - 4)) ^ (1 / 2)))
Y = ((1 - (2 / (9 * K)) - (L ^ (1 / 3))) / ((2 / (9 * K)) ^ (1 / 2)))

stat = (Z ^ 2) + (Y ^ 2)

STATAGOSTINO = stat

End Function

***********************************************************************

Cette fonction marche bien, MAIS ! si et seulement si je lui donne une plage de moins de 210 valeurs seulement ; autrement, Excel m'assène sa "#VALUE!".

Est-ce que ce sont les premières étapes itératives qui le limitent ?
Je vois bien qu'elles sont laborieuses, mais je n'ai pas trouvé plus simple.

Merci d'avance,
A voir également:

1 réponse

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
15 oct. 2008 à 23:28
Bonjour,

Pour quelle ne reste pas sans réponse, je réponds à cette question bien qu'elle soit ancienne.

Mais pour info, c'est le calcul de la variable B qui provoque une erreur
En effet, au cours du calcul le dénominateur ((n - 2) * (n + 5) * (n + 7) * (n + 9)) dépasse la capacité des entiers long (2 147 483 647) dés que n>210 . Bien que B soit déclaré en Double, comme n est déclaré en long, VBA fait une erreur.

Pour résoudre le Problème, il suffit de passer n en Double également. C'est un peu ésotérique mais c'est du à la méthode de résolution des expressions arithmétiques par VBA comme il n'y a que n dans le calcul, c'est lui qui donne la limite.

Cordialement,
-1