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
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 Subps: 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