Problème bloc IF
Bonjour, je débute en VBA.
J'ai un Excel à 2 feuilles:
- une première (Outcrop_Reservoir_Modern) contenant 21 colonnes et dans la seconde un identifiant unique pour chacune des 8146 lignes.
- une deuxième (Feuil1) contenant les 21 premières colonnes + d'autres et dont la deuxième colonne est vide contenant 35 541 lignes.
J'ai pensé à ce code:
Sub Macro1()
Dim i As Long
Dim j As Long
Worksheets("Feuil1").Active
For i = 1 To 35541
For j = 1 To 8146
If Cells(i, 3) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 3)).Value _
And Cells(i, 4) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 4)).Value _
And Cells(i, 5) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 5)).Value _
And Cells(i, 6) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 6)).Value _
And Cells(i, 7) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 7)).Value _
And Cells(i, 8) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 8)).Value _
And Cells(i, 9) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 9)).Value _
And Cells(i, 10) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 10)).Value _
And Cells(i, 11) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 11)).Value _
And Cells(i, 12) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 12)).Value _
And Cells(i, 13) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 13)).Value _
And Cells(i, 14) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 14)).Value _
And Cells(i, 15) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 15)).Value _
And Cells(i, 16) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 16)).Value _
And Cells(i, 17) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 17)).Value _
And Cells(i, 18) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 18)).Value _
And Cells(i, 19) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 19)).Value _
And Cells(i, 20) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 20)).Value _
And Cells(i, 21) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 21)).Value Then _
Cells(i, 2) = Worksheets("Outcrop_Reservoir_Modern").Range(Cells(j, 2)).Value
End If
Next j
Next i
End Sub
Quand j'éxécute la macro, j'ai ce message d'erreur "Erreur de Compilation End If sans Bloc If". Je ne comprends pas d'où vient mon erreur et me demande si mon code est juste.
Je vous remercie pour votre aide.
BOnjour,
peut-être en déplaçant le end if actuel juste avant le end sub ?
Merci mais non ça ne fonctionne pas...
Bonjour
un peux de ménage a voir
Sub Macro1()
Dim i As Long
Dim j As Long
Worksheets("Feuil1").Active
With Worksheets("Outcrop_Reservoir_Modern")
For i = 1 To 35541
For j = 1 To 8146
If Cells(i, 3) = .Range(Cells(j, 3)).Value _
And Cells(i, 4) = .Range(Cells(j, 4)).Value _
And Cells(i, 5) = .Range(Cells(j, 5)).Value _
And Cells(i, 6) = .Range(Cells(j, 6)).Value _
And Cells(i, 7) = .Range(Cells(j, 7)).Value _
And Cells(i, 8) = .Range(Cells(j, 8)).Value _
And Cells(i, 9) = .Range(Cells(j, 9)).Value _
And Cells(i, 10) = .Range(Cells(j, 10)).Value _
And Cells(i, 11) = .Range(Cells(j, 11)).Value _
And Cells(i, 12) = .Range(Cells(j, 12)).Value _
And Cells(i, 13) = .Range(Cells(j, 13)).Value _
And Cells(i, 14) = .Range(Cells(j, 14)).Value _
And Cells(i, 15) = .Range(Cells(j, 15)).Value _
And Cells(i, 16) = .Range(Cells(j, 16)).Value _
And Cells(i, 17) = .Range(Cells(j, 17)).Value _
And Cells(i, 18) = .Range(Cells(j, 18)).Value _
And Cells(i, 19) = .Range(Cells(j, 19)).Value _
And Cells(i, 20) = .Range(Cells(j, 20)).Value _
And Cells(i, 21) = .Range(Cells(j, 21)).Value Then
Cells(i, 2) = .Range(Cells(j, 2)).Value
End If
Next j
Next i
End With
End Sub
A+
Maurice
Bonjour, salut Xmenpl, archer !
Proposition pour gagner en clarté :
Sub Macro1()
Dim i As Long, j As Long, k As Integer, Res As Integer
Res = 1
Worksheets("Feuil1").Activate
With Worksheets("Outcrop_Reservoir_Modern")
For i = 1 To 35541
For j = 1 To 8146
For k = 3 To 21
Res = Res * (Cells(i, k) = .Range(Cells(j, k))) 'Res prend la valeur 0 si au moins 1 inégalité
Next k
If Res Then Cells(i, 2) = .Range(Cells(j, 2))
Next j
Next i
End With
End Sub
Bonjour,
Merci pour vos réponses à tous deux. J'ai essayé d'appliquer mon code. Lorsque je veux executer la Macro, j'ai l'erreur 438. J'ai change le Worksheets("Feuil1").Active en Worksheets("Feuil1").Activate en allant chercher un peu sur les forums. Mais maintenant, j'ai l'erreur 1004 avec cette portion de code de surlignée. A quoi peut-elle être due?
Res = Res * (Cells(i, k) = .Range(Cells(j, k))) 'Res prend la valeur 0 si au moins 1 inégalité
Bonjour,
Merci pour vos réponses à tous deux. J'ai essayé d'appliquer mon code. Lorsque je veux executer la Macro, j'ai l'erreur 438. J'ai change le Worksheets("Feuil1").Active en Worksheets("Feuil1").Activate en allant chercher un peu sur les forums. Mais maintenant, j'ai l'erreur 1004 avec cette portion de code de surlignée. A quoi peut-elle être due?
Res = Res * (Cells(i, k) = .Range(Cells(j, k))) 'Res prend la valeur 0 si au moins 1 inégalité
Bonjour,
Tu as bien fait, je n'avais pas repéré l'erreur.
L'erreur 1004 signifie que tu fais référence à un élément qui n'existe pas (ou pas là où tu le cherche), par exemple une feuille nommée "Feuil1" dans un classeur qui n'en comporte pas.
Attention, c'est probablement lié à ta syntaxe :
.Range(Cells(j, k))
équivaut implicitement à Worksheets("Outcrop_Reservoir_Modern").Range(Worksheets("Feuil1").Cells(j, k))
Ce qui signifie que tu cherches une cellule en feuille "Outcrop_Reservoir_Modern" qui porte le nom stockée dans une cellule en feuille "Feuil1".
Je t'invite à détailler davantage l'intérêt / le mode de fonctionnement escompté pour cette partie précise de la macro.
Désolée pour la manqué de clarté dans ma demande.
En gros ma feuille "Outcrop_Reservoir_Modern" est l'équivalent d'une table "mère" qui contient les ID uniques en colonne 2. La feuille "Feuil1" est la table "fille" qui contient chaque ID unique plusieurs lignes d'enregistrements. Pour attribuer l'ID de la feuille mère à la feuille fille, j'ai laissé les 21 colonnes qui composent la table mère à la table fille et je veux que pour chaque combinaison des valeurs dans ces colonnes, la macro permette d'attribuer le bon ID venant de la table mère.
Est-ce que c'est plus clair comme cela?
Désolée pour la manqué de clarté dans ma demande.
En gros ma feuille "Outcrop_Reservoir_Modern" est l'équivalent d'une table "mère" qui contient les ID uniques en colonne 2. La feuille "Feuil1" est la table "fille" qui contient chaque ID unique plusieurs lignes d'enregistrements. Pour attribuer l'ID de la feuille mère à la feuille fille, j'ai laissé les 21 colonnes qui composent la table mère à la table fille et je veux que pour chaque combinaison des valeurs dans ces colonnes, la macro permette d'attribuer le bon ID venant de la table mère.
Est-ce que c'est plus clair comme cela?
Ok, alors plus simple :
Tu ne gardes qu'une seule boucle sur l'une des 2 tables, et tu utilises la fonction "Find" de VBA pour retrouver la correspondance avec ton ID unique.
https://docs.microsoft.com/fr-FR/office/vba/api/Excel.Range.Find
Je suis désolée mais je suis complètement perdue... j'essaie depuis plusieurs heures de revoir le code avec Find mais je ne comprends pas comment on peut faire Find sur une combinaison de valeurs et comment récupérer le numéro de la ligne ensuite.
Je suis désolée mais je suis complètement perdue... j'essaie depuis plusieurs heures de revoir le code avec Find mais je ne comprends pas comment on peut faire Find sur une combinaison de valeurs et comment récupérer le numéro de la ligne ensuite.
Aujourd'hui tu as 2 boucles :
- i pour parcourir la table 1
- j pour parcourir la table 2 (à chaque valeur de i) et trouver une correspondance
La seconde est inutile dans la mesure où on peut utiliser la fonction find (syntaxe type à adapter) :
Sub Correspondance()
Dim CelluleResultat As Range, i As Long
For i = 1 To 100 'Parcourir la table située en "Feuille1"
Set CelluleResultat = Sheets("Feuille2").Range("A:A").Find(What:=Sheets("Feuille1").Range("A" & i), LookIn:=xlValues, LookAt:=xlWhole)
If Not CelluleResultat Is Nothing Then 'Si correspondance trouvée...
'Instruction(s)
End If
Next i
End Sub
Merci beaucoup, je vais tenter ça