[VBA] Problème matching à 3 critères

Bonjour,

J'ai créé une macro avec l'aide d'une personne sur le forum et je me retrouve bloqué avec un problème de matching.

Dans le fichier joint, j'ai filtré un exemple du problème, lorsque que la macro se fait sur l'une des feuilles il y a un problème de matching et j'ai l'impression que c'est toujours au niveau de la Cle 2.

J'ai laissé les macros qui nous intéressent dans le fichier Excel, si quelqu'un pourrait m'aider et m'expliquer le problème ce serait super !

16matching-cyo-ihm.zip (224.29 Ko)

PS: Pour savoir si le matching effectué est correct, il faut qu'à la fin sur la feuille CYO et IHM, ils aient le même nombre de Matched.

Bonjour Mastho15

Il va falloir nous en dire plus ou est le souci et surtout comment ça s'articule

A+

Bonjour Bruno,

Je vais essayer de t'expliquer clairement. La macro dans le fichier n'est pas complète en premier lieu elle va se sourcer dans des fichiers mais cela n'importe peu pour ma question du coup j'ai supprimé cette partie, ensuite elle va sélectionner trois critères qui deviendront CLE 1, CLE 2 et CLE 3, puis ces trois CLE vont être utilisées pour faire une recherche de la feuille CYO à la feuille IHM et vice-versa pour chaque ligne pour savoir si les lignes sont "Matched" ou "Unmatched".

Dans le cas où les trois CLE sont trouvées d'une même ligne d'une feuille à l'autre, on est en "Matched".

Dans le cas contraire, s'il y a un problème à la CLE 1, ce sera indiqué en "Unmatched" et dans la colonne DISCREPANCY ce sera noté "UTI", lié à la CLE 2 ce sera noté "ACTION_TYPE" et lié à la CLE 3 ce sera noté "EVENT_DATE" pour savoir d'où le problème provient.

Maintenant mon problème est que une ligne est bien présente dans les deux feuilles avec les mêmes CLE cependant dans une des feuilles ce sera noté "Matched" alors que dans l'autre elle sera en "Unmatched" et régulièrement c'est en "Unmatched" lié à la CLE 2. Je n'arrive donc pas à comprendre pourquoi la macro fonctionne dans la très grosse majorité des cas mais que pour certaines lignes elle note une différence de CLE alors que la ligne est bien présente sur les deux feuilles.

J'espère avoir été plus clair cette fois-ci, n'hésites pas à me poser d'autres questions si nécessaire

bonjour,

il y a un bug dans cette fonction voici une correction

'FONCTION POUR EFFECTUER LE MATCHING
Function matching(UTI, ACTION_TYPE, EVENT_DATE, col1, col2, col3)
    Set re = col1.Find(UTI, lookat:=xlWhole)
    If Not re Is Nothing Then
        fa = re.Address
        lvl = 1
        Do
            i = re.Row
            If ACTION_TYPE = col2.Parent.Cells(i, col2.Column) Then
                If EVENT_DATE = col3.Parent.Cells(i, col3.Column) Then
                    matching = "Matched"
                    Exit Function
                Else
                    lvl = 3
                End If
            Else
                lvl = 2
            End If
            If lvl > blvl Then blvl = lvl
            Set re = col1.FindNext(re)
            If re Is Nothing Then Exit Do
        Loop Until re.Address = fa
    Else
        blvl = 1
    End If
    matching = "Unmatched " & blvl
End Function

Boniour h2so4,

Merci encore à toi pour ton aide, malheureusement, j'ai relancé la procédure de Matching avec ta nouvelle formule et j'ai encore le même problème sur les mêmes lignes.

Si on filtre sur la CLE 2 "MODI", on voit bien encore que les cas de "Unmatched" sont présents alors qu'ils doivent être "Matched".

Bonjour,

En effet il semble qu'il ait un problème avec la fonction find et findnext. voici un code alternatif

'FONCTION POUR EFFECTUER LE MATCHING
Function matching(UTI, ACTION_TYPE, EVENT_DATE, col1, col2, col3)
    dl = col1.Parent.Cells(Rows.Count, col1.Column).End(xlUp).Row
    tabval = col1.Cells(1, 1).Resize(dl, 1)
    i = findrow(UTI, tabval)
    If i <> -1 Then
        lvl = 1
        Do
            If ACTION_TYPE = col2.Parent.Cells(i, col2.Column) Then
                If EVENT_DATE = col3.Parent.Cells(i, col3.Column) Then
                    matching = "Matched"
                    Exit Function
                Else
                    lvl = 3
                End If
            Else
                lvl = 2
            End If
            If lvl > blvl Then blvl = lvl
            i = findrow(UTI, tabval, i)
            If i = -1 Then Exit Do
        Loop
    Else
        blvl = 1
    End If
    matching = "Unmatched " & blvl
End Function

Private Function findrow(tofind, tabval, Optional nextrow = 0)
    For i = nextrow + 1 To UBound(tabval)
        If tabval(i, 1) = tofind Then findrow = i: Exit Function
    Next i
    findrow = -1
End Function

Que dire à part un grand bravo h2so4 !

Merci beaucoup ça fonctionne

Rechercher des sujets similaires à "vba probleme matching criteres"