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.
Mon but est d'attribuer l'identifiant unique correspondant à chaque ligne de la feuille Feuil1 en vérifiant parmi les colonnes B à U que les informations sont identiques à la feuille Outcrop_Reservoir_Modern.

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

Rechercher des sujets similaires à "probleme bloc"