Comparaison complexe

Bonjour,

J'ai créé un code VBA qui permet de comparer 2 colonnes dans des tableaux structurés différents et qui revoie la valeur du composant de "Note" inférieure via l'ajout d'une colonne dans tableau2. Malheureusement, mon code ne prends en compte que le cas où la note de la ligne supérieure est inférieure stricte à la note de la valeur concernée. Je souhaiterai que dans le cas où par exemple : Note 4 = Note 3 alors comparer Note 4 avec Note 2... jusqu'à trouver la note inférieure. Jusque là toutes mes tentatives ne fonctionnent pas. Avez vous des idées ?

Je vous joins un exemple dans un Excel pour comprendre le soucis. Ce dessous le code également.

Merci d'avance !

Sub ComparerColonnes()
    Dim tbl1 As ListObject
    Dim tbl2 As ListObject
    Dim resultat As Range
    Dim i As Long, j As Long, k As Long
    Dim trouve As Boolean
    Dim noteMin As Long
    Dim valeurMin As String
    Dim Col1 As Range
    Dim Col2 As Range
    Dim ColNote As Range

    ' Spécifiez les tableaux structurés à comparer
    Set tbl1 = Sheets("Feuil1").ListObjects("Tableau1")
    Set tbl2 = Sheets("Feuil2").ListObjects("Tableau2")

    ' Récupère les plages des colonnes à comparer dans le tableau 1
    Set Col1 = tbl1.ListColumns("Structure1").DataBodyRange
    Set ColNote = tbl1.ListColumns("Note").DataBodyRange

    ' Récupère la colonne à comparer dans le tableau 2
    Set Col2 = tbl2.ListColumns("Structure2").DataBodyRange

    ' Ajoute une nouvelle colonne à droite du Tableau2 pour les résultats
    tbl2.ListColumns.Add
    Set resultat = tbl2.ListColumns(tbl2.ListColumns.Count).DataBodyRange
    resultat.NumberFormat = "@"

    ' Boucle à travers chaque valeur de la deuxième plage
    For j = 1 To Col2.Rows.Count
        trouve = False
        noteMin = 0
        valeurMin = ""

        ' Vérifie si la valeur actuelle de plage2 existe dans la première plage
        For i = 1 To Col1.Rows.Count
            If CStr(Col2.Cells(j).Value) = CStr(Col1.Cells(i).Value) Then
                trouve = True

                ' Vérifie la note la plus proche inférieure stricte
                For k = i - 1 To ColNote.Rows.Count
                    If IsNumeric(ColNote.Cells(i).Value) Then
                        If ColNote.Cells(k).Value < ColNote.Cells(i).Value Then
                            noteMin = ColNote.Cells(k).Value
                            valeurMin = CStr(Col1.Cells(k).Value)
                            Else
                            Exit For
                        End If
                    End If
                Next k
            End If
        Next i

        ' Écrit la valeur de plage1 correspondante dans la colonne de sortie
        resultat.Cells(j).Value = valeurMin
    Next j
End Sub
10new-test.xlsm (25.57 Ko)

bonjour,

proposition de correction de ton code.

Sub ComparerColonnes()
    Dim tbl1 As ListObject
    Dim tbl2 As ListObject
    Dim resultat As Range
    Dim i As Long, j As Long, k As Long
    Dim trouve As Boolean
    Dim noteMin As Long
    Dim valeurMin As String
    Dim difMin As Long
    Dim Col1 As Range
    Dim Col2 As Range
    Dim ColNote As Range

    ' Spécifiez les tableaux structurés à comparer
    Set tbl1 = Sheets("Feuil1").ListObjects("Tableau1")
    Set tbl2 = Sheets("Feuil2").ListObjects("Tableau2")

    ' Récupère les plages des colonnes à comparer dans le tableau 1
    Set Col1 = tbl1.ListColumns("Structure1").DataBodyRange
    Set ColNote = tbl1.ListColumns("Note").DataBodyRange

    ' Récupère la colonne à comparer dans le tableau 2
    Set Col2 = tbl2.ListColumns("Structure2").DataBodyRange

    ' Ajoute une nouvelle colonne à droite du Tableau2 pour les résultats
    tbl2.ListColumns.Add
    Set resultat = tbl2.ListColumns(tbl2.ListColumns.Count).DataBodyRange
    resultat.NumberFormat = "@"

    ' Boucle à travers chaque valeur de la deuxième plage
    For j = 1 To Col2.Rows.Count
        trouve = False
        difMin = 100000
        noteMin = 0
        valeurMin = ""

        ' Vérifie si la valeur actuelle de plage2 existe dans la première plage
        For i = 1 To Col1.Rows.Count
            If CStr(Col2.Cells(j).Value) = CStr(Col1.Cells(i).Value) Then
                trouve = True
                If IsNumeric(ColNote.Cells(i).Value) Then
                    ' Vérifie la note la plus proche inférieure stricte
                    For k = 1 To ColNote.Rows.Count
                        If i <> k Then
                            dif = ColNote.Cells(i).Value - ColNote.Cells(k).Value
                            If dif > 0 Then
                                If dif < difMin Then difMin = dif: noteMin = ColNote.Cells(k).Value: valeurMin = CStr(Col1.Cells(k).Value)
                            End If
                        End If
                    Next k
                End If
            End If
        Next i

        ' Écrit la valeur de plage1 correspondante dans la colonne de sortie
        resultat.Cells(j).Value = valeurMin
    Next j
End Sub

ps: quelle valeur attends-tu pour Tete ? Titi,Tata ou les 2 ?

Bonjour H2So4,

Merci pour ce premier élément de réponse.

Pour "Tete", il faut qu'il affiche "Titi". Il doit afficher la première valeur inférieure qu'il trouve en remontant la liste vers le haut.

Dans ton code il affiche Tata. Comment faire pour afficher Titi ?

Merci d'avance!

Bonjour

Personne n'a d'idée ?

merci

bonjour,

je croyais avoir répondu ...

Sub ComparerColonnes()
    Dim tbl1 As ListObject
    Dim tbl2 As ListObject
    Dim resultat As Range
    Dim i As Long, j As Long, k As Long
    Dim trouve As Boolean
    Dim noteMin As Long
    Dim valeurMin As String
    Dim Col1 As Range
    Dim Col2 As Range
    Dim ColNote As Range

    ' Spécifiez les tableaux structurés à comparer
    Set tbl1 = Sheets("Feuil1").ListObjects("Tableau1")
    Set tbl2 = Sheets("Feuil2").ListObjects("Tableau2")

    ' Récupère les plages des colonnes à comparer dans le tableau 1
    Set Col1 = tbl1.ListColumns("Structure1").DataBodyRange
    Set ColNote = tbl1.ListColumns("Note").DataBodyRange

    ' Récupère la colonne à comparer dans le tableau 2
    Set Col2 = tbl2.ListColumns("Structure2").DataBodyRange

    ' Ajoute une nouvelle colonne à droite du Tableau2 pour les résultats
    tbl2.ListColumns.Add
    Set resultat = tbl2.ListColumns(tbl2.ListColumns.Count).DataBodyRange
    resultat.NumberFormat = "@"

    ' Boucle à travers chaque valeur de la deuxième plage
    For j = 1 To Col2.Rows.Count
        trouve = False
        noteMin = 0
        valeurMin = ""

        ' Vérifie si la valeur actuelle de plage2 existe dans la première plage
        For i = 1 To Col1.Rows.Count
            If CStr(Col2.Cells(j).Value) = CStr(Col1.Cells(i).Value) Then
                trouve = True

                ' Vérifie la note la plus proche inférieure stricte parmi les valeurs précédentes
                For k = i - 1 To 1 Step -1
                    If IsNumeric(ColNote.Cells(i).Value) Then
                        If ColNote.Cells(k).Value < ColNote.Cells(i).Value Then
                            If ColNote.Cells(k) > noteMin Then noteMin = ColNote.Cells(k): valeurMin = CStr(Col1.Cells(k).Value)
                        End If
                    End If
                Next k
            End If
        Next i

        ' Écrit la valeur de plage1 correspondante dans la colonne de sortie
        resultat.Cells(j).Value = valeurMin
    Next j
End Sub
Rechercher des sujets similaires à "comparaison complexe"