Problème pour faire fonctionner une boucle For/If [Résolu/Fermé]

Signaler
Messages postés
29
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
10 juillet 2014
-
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
-
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

Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 164
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.


Messages postés
29
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
10 juillet 2014

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 :/
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 164
Sans voir tout le code pas facile de dire où est le problème
Messages postés
29
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
10 juillet 2014

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.
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 164
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.
Messages postés
29
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
10 juillet 2014

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
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 164
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

Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 164
J'ai vraiment la tête dans le luc ce matin ...

Ca devrait être mieux.
Sheets("MACRO").Range("B" & derlig2).Value = Sheets("MACRO").Range("E" & j).Value
            Sheets("MACRO").Range("C" & derlig2).Value = Sheets("MACRO").Range("F" & j).Value


Pour commencer à la ligne 1, il faut mettre
For j = 1 To derligE
Messages postés
29
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
10 juillet 2014

C'est pas grave :) c'est le matin !
ça marche là sauf que ça se répète tout le temps jusqu'a la ligne 600 et des brouettes alors que j'en ai qu'une quarantaine!
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 164
Là je ne sais pas ... il faudrait passer le code au pas à pas pour voir ce qui se passe exactement et pourquoi ça se répète plus qu'il ne faudrait.
Messages postés
29
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
10 juillet 2014

Okay ça marche, merci beaucoup !
Vraiment Merci , vous ne savez pas à quel point vous m'avez aidé !

Bonne journée

A bientôt
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 164
De rien :0)

N'hésite pas à revenir au besoin.

Bonne journée également.
Messages postés
16477
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
10 juin 2021
3 189
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
Messages postés
29
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
10 juillet 2014

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.
Messages postés
16477
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
10 juin 2021
3 189
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
Messages postés
29
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
10 juillet 2014

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!