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 Sub
Sub 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 Sub

Bonjour 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 Sub
Option 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 Sub

L'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 Sub

Si 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 = False

Placer cette instruction à la fin devrait suffire

klin89

Bonsoir Klin89,

Tu as tout à fait raison ! je l'avais zappé ! je viens de corriger les 3 codes VBA de mon message précédent selon ton indication.

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

Rechercher des sujets similaires à "ordre lignes"