Evaluation paresseuse avec Or ?
Bonjour a tous.
Je possède 2 colonne
Colonne A avec environ 40 lignes
Colonne B avec environ 11 240
A chaque ligne de la Colonne B se trouve une cellule dont le contenu est dans la colonne A et j'applique un traitement.
Je voulais que, dans une ligne B, dés qu'on trouve la correspondance, on ne rentre pas dans la boucle While.
Cela aurait été une évaluation paresseuse (si le booléen IsFind est à True, alors je ne rentre pas la suite).
La, la macro rentre tout le temps dans la boucle (car iLigneA <= last_Ligne_A)
Comment faire pour éviter d'y rentrer dés lors que IsFind passe à True ?
Merci d'avance ;)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| For iLigneB = 2 To last_Ligne_B ' 2 à 11 240
iLigneA = 2 ' Ré-initialise début de A
IsFind = False ' Ré-initialise bool
Do While IsFind = False Or iLigneA <= last_Ligne_A ' Eval non paresseuse
If Range("B" & iLigneOnglet).Text = variable_txt Then
IsFind = True ' Ligne trouvée donc pas besoin de tester les autres valeur de A
' Traitement
End If
iLigneA = iLigneA + 1 'iLigneA ++
Loop
Next iLigneB |
Optimiser la boucle imbriquée
D'Ores et déjà la sortie Exit For
IsFind dans un Do While puis à la fin l'incrémentation iLigneA = iLigneA + 1 'iLigneA ++
cela ressemble fort à un For Next.
C'est par là la sortie avec Exit For.
Code:
1 2 3 4 5
| Option Explicit
Const colA = 1
Const colB = colA + 1
Const last_Ligne_A = 40
Const last_Ligne_B = 11240 |
Les deux boucles For ... Next imbriquées :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Sub LazyGoldenEval()
Dim iLigneA As Integer, iLigneB As Integer, iLigneOnglet As Integer
Dim tStart As Double, tEnd As Double
'... calcul de iLigneOnglet éventuellement à l'intérieur d'une boucle
tStart = Time
For iLigneB = 2 To last_Ligne_B ' 2 à 11 240
For iLigneA = 2 To last_Ligne_A ' Eval non paresseuse
If Cells(iLigneOnglet, colB) = variable_txt Then
' Traitement
Exit For ' Ligne trouvée. Pas besoin de tester les autres valeur de A
End If
Next
Next
tEnd = Time
Debug.Print Format(tEnd - tStart, "HH:MM:SS")
End Sub |
Il faudrait voir si on arrive à grignoter une seconde voire une micro-seconde ;-) en remplaçant dans le test du If :
Code:
If Range("B" & iLigneOnglet).Text = variable_txt Then
par :
Code:
If Cells(iLigneOnglet, colB) = variable_txt Then