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 -
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!! :) )
Merci beaucoup d'avance de l'aide que vous pourrez m'apporter,
Bonne journée.
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
-
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.
-
-
-
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.
-
-
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 lesActiveWindow.ScrollColumn
qui ne servent à rien.
-
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
-
-
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
-
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 :) ) -
-
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... -
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 ? -
-
-
Bonjour,
excusez l'incruste
Excuses moi Polux, je n'avais pas rafraichi
si résolu le problème du compteur "i"
j'aurais écritDim 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-
-
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 -
-