OVH Cloud OVH Cloud

Macro loop trop lent

5 réponses
Avatar
Nono
Bonjour =E0 tous et toutes,

j'utilise excel pour obtenir des statistiques sur une=20
feuille regroupant de nombreuses donn=E9es (un=20
enregistrement par ligne). J'ai besoin de sortir des=20
statistiques en fonction de plusieurs crit=E8res, ces=20
derniers =E9tant variables. J'utilise donc une fonction VBA=20
qui parcourt les plages sur lesquels les crit=E8res=20
s'appliquent, et v=E9rifient les correspondances, en=20
incr=E9mentant un compteur.

Or au calcul, cela prend beaucoup de temps. J'ai lu que=20
les boucles =E9taient tr=E8s lentes mais je ne vois pas=20
comment faire autrement.

Pouvez-vous m'aider

Voici la fonction que j'utilise :

Function rech2inf(test1 As Range, test2 As Range, seuil=20
As Range) As Integer
=20
Dim slt As Integer
slt =3D seuil.Value
=20
Dim i As Integer
Dim j As Integer
Dim countt As Integer
Dim value1 As String
Dim value2 As String
=20
value1 =3D test1.Value
value2 =3D test2.Value

counttt =3D 0
=20
For i =3D 1 To Range("DP").Rows.Count
For j =3D 1 To Range("DP").Columns.Count
If Range("DP").Cells(i, j).Value =3D value1 _
And Range("e_statuts").Cells(i).Value =3D value2 _
And Range("e_anciennet=E9s").Cells(i).Value <=3D slt=20
Then
countt =3D countt + 1
End If
Next j
Next i
=20
rech2inf =3D countt
=20
End Function

Merci d'avance

Arnaud

5 réponses

Avatar
Clément Marcotte
Bonjour,

Pourquoi pas un filtre élaboré ?



"Nono" a écrit dans le message de
news:08e801c3861b$ed3a0f30$
Bonjour à tous et toutes,

j'utilise excel pour obtenir des statistiques sur une
feuille regroupant de nombreuses données (un
enregistrement par ligne). J'ai besoin de sortir des
statistiques en fonction de plusieurs critères, ces
derniers étant variables. J'utilise donc une fonction VBA
qui parcourt les plages sur lesquels les critères
s'appliquent, et vérifient les correspondances, en
incrémentant un compteur.

Or au calcul, cela prend beaucoup de temps. J'ai lu que
les boucles étaient très lentes mais je ne vois pas
comment faire autrement.

Pouvez-vous m'aider

Voici la fonction que j'utilise :

Function rech2inf(test1 As Range, test2 As Range, seuil
As Range) As Integer

Dim slt As Integer
slt = seuil.Value

Dim i As Integer
Dim j As Integer
Dim countt As Integer
Dim value1 As String
Dim value2 As String

value1 = test1.Value
value2 = test2.Value

counttt = 0

For i = 1 To Range("DP").Rows.Count
For j = 1 To Range("DP").Columns.Count
If Range("DP").Cells(i, j).Value = value1 _
And Range("e_statuts").Cells(i).Value = value2 _
And Range("e_anciennetés").Cells(i).Value <= slt
Then
countt = countt + 1
End If
Next j
Next i

rech2inf = countt

End Function

Merci d'avance

Arnaud
Avatar
AV
Donne un exemple clair de ce que tu veux décompter et tes critères
M'est avis (à vue de nez) qu'un SP ou similaire va remplacer avantageusement les
bouclettes !

AV
Avatar
Modeste
Tsss... Tsss.... AV !!!
;-)))

l'exemple était pourtant limpide :

va falloir quand même un jour que tu t'y mettes à
déchiffrer l'anglo-saxon ;-)))

=SOMMEPROD(1*(DP=test1)*(e_status=test2)*
(e_anciennetés<=seuil1))

;-)))
@+




-----Message d'origine-----
Donne un exemple clair de ce que tu veux décompter et tes
critères

M'est avis (à vue de nez) qu'un SP ou similaire va
remplacer avantageusement les

bouclettes !

AV


.



Avatar
AV
Pffff...
va falloir quand même un jour que tu t'y mettes à
déchiffrer l'anglo-saxon ;-)))
Si tu crois que je vais m'amuser à déchiffrer la macro pour faire un SP derrière

!
rePfff....Une simple lecture en diagonale m'a fait subodorer le SP !
Pour l'exécution des basses oeuvres, je pensais que le secrétaire s'en serait
chargé !
Je sais pas ce qu'il fout celui-là mais la lettre recommandée ne devrait pas
tarder !

;-)
AV

Avatar
AV
peut-être un peu HS ma réponse, mais j'ai lu dans
l'excellent site de Laurent Longre (dans la partie
optimisation VBA) qu'il y avait moyen d'accélerer le
business (time is money :-) ), en opérant comme suit :
for each Truc in Range("XX:XX")
'------- traitement --------
next

qu'en penses-tu ?


Bien que n'étant pas interpellé, je pense que le meilleur moyen d'accéler les
bouclettes c'est (quand c'est possible) de ne pas en faire !
;-)
AV