Problème pour faire fonctionner une boucle For/If

Résolu
lauraSoe Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   -  
Polux31 Messages postés 7219 Statut Membre -
Bonjour, je suis stagiaire et on m'a demandé de réaliser une Macro sur Excel (j'en avais jamais fait jusqu'à présent)

Voici mon problème:

Je voudrai vérifier les dates de deux colonnes différentes B et E sur la même feuille.

Si elles sont identiques alors je fais un copier/coller de la valeur de F (sur la même ligne de E) sur la colonne C (à côté de la valeur de B correspondante).
Sinon la date de Ei n'existe pas dans B alors je fais un Copier/Coller de Ei et Fi sur la première ligne vide de la colonne B.

Je ne sais pas si j'ai été très claire.
Voici le code que j'ai fait (Ils disent qu'il y a un problème avec If que je n'arrive pas à résoudre).

J'ai déjà cherché pas mal depuis hier après-midi, je n'ai pas trouvé la réponse qu'il me fallait! (Au secours! vous êtes mon dernier espoir!! :) )

    
Dim i As Byte
Dim j As Byte
Dim derlig As Integer
derlig = Sheets("MACRO").Range("E65536").End(xlUp).Row
derlig2 = Sheets("MACRO").Range("B65536").End(xlUp).Row

For j = 2 To derlig

If Bi = Ej = True Then ActiveWindow.SmallScroll Down:=-12
Range("Fi").Select
Application.CutCopyMode = False
Selection.Copy
ActiveWindow.SmallScroll Down:=0
Range("C(i+1)").Select
ActiveSheet.Paste

End If

If Bi = Ej = False Then Do
ActiveWindow.SmallScroll Down:=-18
Range("Ej:Fj").Select
Selection.Copy
ActiveWindow.SmallScroll Down:=12
Range("derlig2").Select
ActiveSheet.Paste

End If


Merci beaucoup d'avance de l'aide que vous pourrez m'apporter,

Bonne journée.

4 réponses

  1. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Le problème vient de la syntaxe de tes If :
    If Bi = Ej = True Then
    n'est pas correct. Il faut faire :
    If Bi = Ej Then
    . Si la condition est vraie Alors il exécute le code jusqu'à la fin du If.

    0
    1. lauraSoe Messages postés 29 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour, merci d'avoir répondu si rapidement!

      Je viens de corriger le problème maintenant ils marquent: Erreur de compilation: End if sans bloc If.

      j'ai regardé dans d'autres post mais j'ai toujours pas compris ce que ça voulait dire :/
      0
    2. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Sans voir tout le code pas facile de dire où est le problème
      0
    3. lauraSoe Messages postés 29 Date d'inscription   Statut Membre Dernière intervention  
       
      oui je comprends, voilà

      Sub Macro1()
      '
      ' Macro1 Macro
      '

      '
      Columns("C:C").Select
      Selection.Copy
      Sheets("MACRO").Select
      Columns("A:A").Select
      ActiveSheet.Paste

      Sheets("CRNET-CDE").Select
      Columns("F:F").Select
      Selection.Copy
      Sheets("MACRO").Select
      Columns("B:B").Select
      ActiveSheet.Paste

      Sheets("CRNET-CDE").Select
      ActiveWindow.ScrollColumn = 3
      ActiveWindow.ScrollColumn = 4
      ActiveWindow.ScrollColumn = 5
      ActiveWindow.ScrollColumn = 6
      ActiveWindow.ScrollColumn = 7
      ActiveWindow.ScrollColumn = 8
      ActiveWindow.ScrollColumn = 7
      ActiveWindow.ScrollColumn = 6
      ActiveWindow.ScrollColumn = 5
      ActiveWindow.ScrollColumn = 4
      ActiveWindow.ScrollColumn = 3
      ActiveWindow.ScrollColumn = 4

      Range("G1:AH29").Select
      Selection.Copy
      Sheets("MACRO").Select
      Range("I1").Select
      ActiveSheet.Paste

      ActiveWindow.ScrollColumn = 2
      ActiveWindow.ScrollColumn = 3
      ActiveWindow.ScrollColumn = 4
      ActiveWindow.ScrollColumn = 6
      ActiveWindow.ScrollColumn = 7
      ActiveWindow.ScrollColumn = 8
      ActiveWindow.ScrollColumn = 9
      ActiveWindow.ScrollColumn = 10
      ActiveWindow.ScrollColumn = 11
      ActiveWindow.ScrollColumn = 12
      ActiveWindow.ScrollColumn = 13
      ActiveWindow.ScrollColumn = 14
      ActiveWindow.ScrollColumn = 15
      ActiveWindow.ScrollColumn = 16
      ActiveWindow.ScrollColumn = 17
      ActiveWindow.ScrollColumn = 18
      ActiveWindow.ScrollColumn = 19
      Range("AE23").Select
      ActiveWindow.ScrollColumn = 18
      ActiveWindow.ScrollColumn = 17
      ActiveWindow.ScrollColumn = 16
      ActiveWindow.ScrollColumn = 15
      ActiveWindow.ScrollColumn = 14
      ActiveWindow.ScrollColumn = 13
      ActiveWindow.ScrollColumn = 12
      ActiveWindow.ScrollColumn = 11
      ActiveWindow.ScrollColumn = 10
      ActiveWindow.ScrollColumn = 9
      ActiveWindow.ScrollColumn = 8
      ActiveWindow.ScrollColumn = 7
      ActiveWindow.ScrollColumn = 6
      ActiveWindow.ScrollColumn = 5
      ActiveWindow.ScrollColumn = 4
      ActiveWindow.ScrollColumn = 3
      ActiveWindow.ScrollColumn = 2
      ActiveWindow.ScrollColumn = 1

      Range("I21").Select
      Application.CutCopyMode = False
      ActiveCell.FormulaR1C1 = "=SUM(R[-19]C:R[-1]C)"
      Range("I21").Select
      Selection.AutoFill Destination:=Range("I21:AJ21"), Type:=xlFillDefault
      Range("I21:AJ21").Select
      Range("AG22").Select
      ActiveWindow.ScrollColumn = 19
      ActiveWindow.ScrollColumn = 18
      ActiveWindow.ScrollColumn = 17
      ActiveWindow.ScrollColumn = 16
      ActiveWindow.ScrollColumn = 15
      ActiveWindow.ScrollColumn = 14
      ActiveWindow.ScrollColumn = 13
      ActiveWindow.ScrollColumn = 12
      ActiveWindow.ScrollColumn = 11
      ActiveWindow.ScrollColumn = 10
      ActiveWindow.ScrollColumn = 9
      ActiveWindow.ScrollColumn = 8
      ActiveWindow.ScrollColumn = 7
      ActiveWindow.ScrollColumn = 6
      ActiveWindow.ScrollColumn = 5
      ActiveWindow.ScrollColumn = 4
      ActiveWindow.ScrollColumn = 3
      ActiveWindow.ScrollColumn = 2
      ActiveWindow.ScrollColumn = 3

      Range("I21:AJ21").Select
      Selection.Copy
      Range("I22").Select
      Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False
      Range("I2:AJ21").Select
      Range("I21").Activate
      Application.CutCopyMode = False
      Selection.Delete Shift:=xlUp
      Range("I1:AJ2").Select
      Selection.Copy
      Range("E1").Select
      Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
      False, Transpose:=True

      ActiveWindow.ScrollColumn = 2
      ActiveWindow.ScrollColumn = 3
      ActiveWindow.ScrollColumn = 5
      ActiveWindow.ScrollColumn = 6
      ActiveWindow.ScrollColumn = 8
      ActiveWindow.ScrollColumn = 9
      ActiveWindow.ScrollColumn = 11
      ActiveWindow.ScrollColumn = 12
      ActiveWindow.ScrollColumn = 13
      ActiveWindow.ScrollColumn = 14
      ActiveWindow.ScrollColumn = 15
      ActiveWindow.ScrollColumn = 16
      ActiveWindow.ScrollColumn = 17
      ActiveWindow.ScrollColumn = 18
      ActiveWindow.ScrollColumn = 19
      ActiveWindow.ScrollColumn = 17
      ActiveWindow.ScrollColumn = 16
      ActiveWindow.ScrollColumn = 14
      ActiveWindow.ScrollColumn = 12
      ActiveWindow.ScrollColumn = 11
      ActiveWindow.ScrollColumn = 9
      ActiveWindow.ScrollColumn = 8
      ActiveWindow.ScrollColumn = 7
      ActiveWindow.ScrollColumn = 6
      ActiveWindow.ScrollColumn = 5
      ActiveWindow.ScrollColumn = 4
      ActiveWindow.ScrollColumn = 3
      ActiveWindow.ScrollColumn = 2
      ActiveWindow.ScrollColumn = 1

      Range("H1:AO2").Select
      Selection.Delete Shift:=xlToLeft

      Dim i As Byte
      Dim j As Byte
      Dim derlig As Integer
      derlig = Sheets("MACRO").Range("E65536").End(xlUp).Row
      derlig2 = Sheets("MACRO").Range("B65536").End(xlUp).Row

      For j = 2 To derlig


      If Bi = Ej Then ActiveWindow.SmallScroll Down:=-12
      Range("Fi").Select
      Application.CutCopyMode = False
      Selection.Copy
      ActiveWindow.SmallScroll Down:=0
      Range("C(i+1)").Select
      ActiveSheet.Paste

      End If

      If Bi = Ej = False Then ActiveWindow.SmallScroll Down:=-18
      Range("Ej:Fj").Select
      Selection.Copy
      ActiveWindow.SmallScroll Down:=12
      Range("derlig2").Select
      ActiveSheet.Paste

      End If

      'mise en page (supression colonnes, ordre chrono, retirer la mise en forme


      ActiveCell.Range("A1:B28").Select
      Application.CutCopyMode = False
      Selection.Delete Shift:=xlToLeft

      ActiveCell.Range("A1:C29").Select
      ActiveWorkbook.Worksheets("MACRO").Sort.SortFields.Clear
      ActiveWorkbook.Worksheets("MACRO").Sort.SortFields.Add Key:=ActiveCell. _
      Offset(0, 1).Range("A1:A28"), SortOn:=xlSortOnValues, Order:=xlAscending, _
      DataOption:=xlSortNormal
      With ActiveWorkbook.Worksheets("MACRO").Sort
      .SetRange ActiveCell.Range("A1:C29")
      .Header = xlYes
      .MatchCase = False
      .Orientation = xlTopToBottom
      .SortMethod = xlPinYin
      .Apply
      End With

      ActiveWindow.SmallScroll Down:=-18
      ActiveCell.Range("A1:C31").Select
      Selection.ClearFormats
      Next

      End Sub

      C'est surtout la boucle qui déconne je pense.
      Merci.
      0
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    C'est surtout la boucle qui déconne je pense.
    Non, tu n'as pas bien lu mon post ... j'avais pourtant dit : syntaxe de tes If .
    Tu as modifié le premier If mais pas le 2ème ...

    Il faut faire:
    Si Bi = Ej Alors fait
    ' ... le code qui va bien si la condition est vraie
    Sinon fait
    ' ... le code qui va bien si la condition est fausse
    Fin Si

    Tu peux également supprimer tous les
    ActiveWindow.ScrollColumn
    qui ne servent à rien.
    0
    1. lauraSoe Messages postés 29 Date d'inscription   Statut Membre Dernière intervention  
       
      Hum... Voilà j'ai corrigé comme vous avez dit, mais c'est toujours pareil "Erreur de compilation: else sans bloc If".

      Dim i As Byte
      Dim j As Byte
      Dim derlig As Integer
      derlig = Sheets("MACRO").Range("E65536").End(xlUp).Row
      derlig2 = Sheets("MACRO").Range("B65536").End(xlUp).Row

      For j = 2 To derlig


      If Bi = Ej Then Range("Fi").Select
      Selection.Copy
      Range("C(i+1)").Select
      ActiveSheet.Paste

      Else: Range("Ej:Fj").Select
      Selection.Copy
      Range("derlig2").Select
      ActiveSheet.Paste

      End If
      0
  3. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Il y a des erreurs de syntaxe ...

    Que sont Bi et Ej ? Des cellules ? Si oui

    If Range("B" & i).Value = Range("E" & j).Value Then
         Range("F" & i).Copy Destination:=Range("C" & i +1)
    Else
         Range("E" & j & ":F" & j).Copy Destination:=Range("B" & derlig2)
    End If

    0
    1. lauraSoe Messages postés 29 Date d'inscription   Statut Membre Dernière intervention  
       
      Oui ce sont des cellules, merci!

      Alors j'ai remplacé, et il y avait un problème "Methode Range de l'objet global a échoué"
      J'ai cherché , apparemment ça vient qu'on a pas précisé où on le fait du coup j'ai rajouté Worksheet. avant le Range.

      maintenant nouveau truc, ils marquent erreur 424 objet requis. Je pas comment on peut solutionner le problème...

      (J'ai vraiment du mal, désolé et merci de votre patience :) )
      0
    2. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Il faut s'assurer que i soit initialisé ... je ne vois pas dans ton code où i est initialisé. Il a donc la valeur de 0 !!! la ligne 0 n'existe pas dans Excel ...

      Ensuite il faut mettre, si l'on n'est pas sur la feuille concernée quand on lance la macro:
      Worksheets("MACRO").Range( ... etc
      0
    3. lauraSoe Messages postés 29 Date d'inscription   Statut Membre Dernière intervention  
       
      J'ai initialisé je pense, ça donne ça?

      Dim i As Integer
      Dim j As Integer
      Dim derlig As Integer
      derlig = Sheets("MACRO").Range("E65536").End(xlUp).Row
      derlig2 = Sheets("MACRO").Range("B65536").End(xlUp).Row
      i = 2

      For j = 2 To derlig


      If Range("B" & i).Value = Range("E" & j).Value Then
      Range("F" & i).Copy Destination:=Range("C" & i + 1)
      Else
      Range("E" & j & ":F" & j).Copy Destination:=Range("B" & derlig2)
      End If

      Enfin du coup au niveau du débogage ça marche, mais quand j'exécute la macro ça marche pas (désespoir total)

      ça a pas copier les éléments de E sur la colonne C ni même les dates manquantes...
      0
    4. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Tu dis : ça a pas copier les éléments de E sur la colonne C
      A aucun moment tu demandes de le faire dans le code !!!

      Moi je lis :
      Si ma cellule Bx est égale à Ey Alors je copie la cellule Fx dans la cellule C x+1 Sinon je copie la plage de cellule Ey:Fy sur la dernière ligne de la colonne B.

      Pourquoi mettre i en variable si on copie toujours la cellule "F2" pour la copier en "C3" ??? Ne manque-t-il pas une incrémentation de i ?
      0
    5. lauraSoe Messages postés 29 Date d'inscription   Statut Membre Dernière intervention  
       
      Oh pardon excusez-moi, je voulais dire les éléments de F dans la colonne C !!

      Ce que je veux faire c'est si Bx=Ey alors je copie Fy sur Cx
      Bx différent de Ey alors je copie Ey et Fy sur la première ligne non vide.

      Et en faite je ne comprends pas votre histoire incrémentation de i ...
      0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,
    excusez l'incruste
    Excuses moi Polux, je n'avais pas rafraichi

    si résolu le problème du compteur "i"
    j'aurais écrit
    Dim i As Integer, j As Integer
    Dim Derlig As Integer, Ligvide As Integer

    Application.ScreenUpdating = False
    With Sheets("MACRO")
    Derlig = .Range("E65536").End(xlUp).Row
    For j = 3 To Derlig
    If .Range("B" & i) = .Range("E" & j) Then
    .Range("C" & i + 1) = .Range("F" & i).Value
    Else
    Ligvide = .Range("B65536").End(xlUp).Row + 1
    .Cells(Ligvide, "B").Resize(1, 2) = .Range(.Cells(j, "E"), .Cells(j, "E")).Value
    End If
    End With
    Next


    remarque: supprimer tous les
    ActiveWindow.ScrollColumn=xxx inutiles et ralentisseurs de la macro
    0
    1. lauraSoe Messages postés 29 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour michel_m, merci de m'aider

      j'ai inséré votre idée pour voir si ça marchait mais ça marche pas! un problème avec le with.

      Mais aussi est-ce que vous pouvez m'expliquer pourquoi vous avez mit "with" s'il vous plait?

      Merci beaucoup de votre aide.
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      With Sheets("MACRO")
      Derlig = .Range("E65536").End(xlUp).Row
      For j = 3 To Derlig
      If .Range("B" & i) = .Range("E" & j) Then
      .Range("C" & i + 1) = .Range("F" & i).Value
      Else
      Ligvide = .Range("B65536").End(xlUp).Row + 1
      .Cells(Ligvide, "B").Resize(1, 2) = .Range(.Cells(j, "E"), .Cells(j, "E")).Value
      End If
      Next
      End With


      Comme je n'ai pas pu tester j'ai fais un bug excuse moi

      With........end with

      Ce la s'appelle un bloc, cad que entre le début et la fin du bloc tout ce qui précédé du point appartient au bloc, per ex:

      With sheets("macro"):
      tu peux voir que toutes les cellules de de la feuille sont précédés d'un point; c'est l'équivalent de sheets("macro").range("machin")

      L'avantage est une écriture + claire, une fiabilité du traitement
      Avec wirth sheets("truc") tu n'as plus besoin de faire des "select" ou "activate" toujours très lents
      (les select-selection sont à éviter en VBA)


      un tuto très complet mais qui ne se lit pas comme un roman policier:
      https://bidou.developpez.com/article/VBA/

      cela te permettra de passer de l'enregistreur de macros au VBA
      0
    3. lauraSoe Messages postés 29 Date d'inscription   Statut Membre Dernière intervention  
       
      Okay, ça ressemble pas mal a ce qu'a écrit polux! ça veut dire qu'on est sur la bonne voix!
      Ils marquent qu'il y a un problème: "End with sans with"

      Merci beaucoup pour l'explication!
      0