Ordre des lignes avec plusieurs If
Bonjour à toutes et tous,
J'ai fait un 1er code qui ne fonctionne pas, alors que cela semble fonctionner en faisant une simple modification de l'ordre (Test2), .
Pouvez-vous m'indiquer ce qui peut expliquer que le Test2 fonctionne mais pas le Test1 ?
Cela fait seulement quelques semaines que je fais des macros, grâce à différents forums et j'ai peut-être zappé quelque chose.
Je vous remercie par avance pour vos retours
Kn+
Objectif de cet extrait :
sur les lignes de 2208 à 2256 (variable h) dans la feuille "PROJET"
Si la colonne 1 contient 1, je fige en valeur les colonnes 5 à 17 pour la ligne h
Si colonne 1 contient 1 et la colonne 4 ne commence par TEMP, je vide la colonne 4 pour la ligne h
Si la colonne 1 contient 2, je copie les colonnes 5 à 91 (formules de secours) de la ligne 2257 sur la ligne h
Mon fichier contient beaucoup de données, donc pour gagner en temps de réponse je ne laisse que quelques formules qui se rajoute au fur et à mesure que j'en ai besoin
Sub test1() 'ne fonctionne pas !!!!!!!! => revoir le +lignes et actualiser
Calculate
Sheets("PROJET").Select
For h = 2208 To 2256
If Cells(h, 1) = 1 Then
Range(Cells(h, 5), Cells(h, 17)).Value = Range(Cells(h, 5), Cells(h, 17)).Value
End If
If Cells(h, 1) = 1 And Left(Cells(h, 4), 4) <> "TEMP" Then
Cells(h, 4).ClearContents
End If
If Cells(h, 1) = 2 Then
Range(Cells(2257, 5), Cells(2257, 91)).Copy
Range(Cells(h, 5), Cells(h, 91)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
End If
Next h
End SubSub test2() 'fonctionne
Calculate
Sheets("PROJET").Select
For h = 2208 To 2256 'waste flow sortants
If Cells(h, 1) = 1 Then
Range(Cells(h, 5), Cells(h, 17)).Value = Range(Cells(h, 5), Cells(h, 17)).Value
End If
If Cells(h, 1) = 2 Then
Range(Cells(2257, 5), Cells(2257, 91)).Copy
Range(Cells(h, 5), Cells(h, 91)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
End If
If Cells(h, 1) = 1 And Left(Cells(h, 4), 4) <> "TEMP" Then
Cells(h, 4).ClearContents
End If
Next h
End SubBonjour Kn+,
Ta façon d'indenter est bizarre ! ce n'est pas la façon habituelle, et je te déconseille vivement de continuer de cette façon : c'est aller au devant d'ennuis, car quand il y aura plusieurs imbrications les unes dans les autres, ce sera très difficile de s'y retrouver ! même pour le Next h qu'on a l'habitude de voir situé au même niveau que le For correspondant, ça gêne la compréhension du code ! j'ai donc utilisé l'indentation habituelle pour tes 2 codes VBA :
Option Explicit
Sub test2()
Dim h&: Worksheets("PROJET").Select: Calculate: Application.ScreenUpdating = False
For h = 2208 To 2256 'waste flow sortants
If Cells(h, 1) = 1 Then
Range(Cells(h, 5), Cells(h, 17)).Value = Range(Cells(h, 5), Cells(h, 17)).Value
End If
If Cells(h, 1) = 2 Then
Range(Cells(2257, 5), Cells(2257, 91)).Copy: Cells(h, 5).PasteSpecial -4123
End If
If Cells(h, 1) = 1 And Left$(Cells(h, 4), 4) <> "TEMP" Then
Cells(h, 4).ClearContents
End If
Next h
Application.CutCopyMode = False
End SubOption Explicit
Sub test1()
Dim h&: Worksheets("PROJET").Select: Calculate: Application.ScreenUpdating = False
For h = 2208 To 2256
If Cells(h, 1) = 1 Then
Range(Cells(h, 5), Cells(h, 17)).Value = Range(Cells(h, 5), Cells(h, 17)).Value
End If
If Cells(h, 1) = 1 And Left$(Cells(h, 4), 4) <> "TEMP" Then
Cells(h, 4).ClearContents
End If
If Cells(h, 1) = 2 Then
Range(Cells(2257, 5), Cells(2257, 91)).Copy: Cells(h, 5).PasteSpecial -4123
End If
Next h
Application.CutCopyMode = False
End SubL'ordre n'a pas d'incidence :
1) Dans les 2 cas, le 1er test If est le même, et il est effectué en premier
2) Dans test2() : pour le 2ème If : si en colonne 1 il y a 2, ça copie en colonnes 5 à 91 les formules de la ligne 2257 ; le test If suivant n'est pas effectué pour ces mêmes lignes puisque ce n'est pas pour 2 en colonne 1 ; et même si c'était pour 1, du fait que les colonnes modifiées sont 5 à 91, ça fait que les colonnes 1 et 4 du 3ème test If ne sont pas touchées ➯ le 2ème If et le 3ème If sont totalement indépendants l'un de l'autre !
3) Dans test1() : pour le 2ème If : si en colonne 1 il y a 2, rien n'est fait ; et si les 2 conditions sont remplies, ça modifie que la colonne 4 ; le 3ème test If s'occupe des colonnes 5 à 91, donc la colonne 4 n'est pas concernée ➯ le 2ème If et le 3ème If sont totalement indépendants l'un de l'autre !
Enfin, je te propose d'essayer ce 3ème code VBA :
Option Explicit
Sub test3()
Dim h&: Worksheets("PROJET").Select: Calculate: Application.ScreenUpdating = False
For h = 2208 To 2256
If Cells(h, 1) = 1 Then
Range(Cells(h, 5), Cells(h, 17)).Value = Range(Cells(h, 5), Cells(h, 17)).Value
If Left$(Cells(h, 4), 4) <> "TEMP" Then Cells(h, 4).ClearContents
ElseIf Cells(h, 1) = 2 Then
Range(Cells(2257, 5), Cells(2257, 91)).Copy: Cells(h, 5).PasteSpecial -4123
End If
Next h
Application.CutCopyMode = False
End SubSi en colonne 1 il y a 1, alors :
a) on fige les colonnes 5 à 17
b) si en colonne 4 ça ne commence pas par "TEMP", on l'efface
Sinon si en colonne 1 il y a 2 :
recopie des formules de la ligne 2257
Note bien que ça évite de faire 2× le même test : If Cells(h, 1) = 1 ; je dis ceci par rapport à :
If Cells(h, 1) = 1 And Left$(Cells(h, 4), 4) <> "TEMP" Then
De plus, pour If Cells(h ,1) = 2 : ça évite de faire inutilement ce test par rapport à 2
quand il était à 1, cela grâce au ElseIf
Si ça marche : ok (et merci de passer le sujet en résolu
Sinon : envoie ton fichier (sans données confidentielles)
dhany
Bonsoir à tous,
Juste de passage
dhany, je ne pense pas qu'il soit nécessaire d'inclure ceci dans la boucle
Application.CutCopyMode = FalsePlacer cette instruction à la fin devrait suffire
klin89
Bonsoir Klin89,
Tu as tout à fait raison !
Merci pour ton intervention rectificative !
En plus, j'en ai profité pour ajouter, avant la boucle : Application.ScreenUpdating = False ; c'est volontairement que je ne mets pas Application.ScreenUpdating = True car c'est fait automatiquement, de façon implicite, juste avant le End Sub
dhany