Comparaison données
Bonjour à tous,
Nouveau sur VBA, j'ai des difficultés à transcrire en code les opérations que je souhaite effectuer.
En PJ un fichier exemple.
Sur une feuille 1 j'ai un premier tableau structuré dans lequel 2 colonnes m'intéressent : Note, Structure1.
Sur une feuille 2, un deuxième tableau structuré contenant l'équivalent de la colonne Structure1 mélangé, nommée Structure2.
Je souhaite dans l'ordre :
- Lister les tableaux qui existent dans le classeur,
- Avoir une boite de dialogue qui demande à l'utilisateur les tableaux, et les colonnes à comparer dans ces tableaux (sous forme de listes dans lesquelles l'utilisateur peut aller choisir les tableaux et colonnes concernés).
- Vérifier pour chaque valeur dans tableau2 qu'elle existe dans tableau1,
- Pour chaque valeur concernée dans tableau2 :
- Déterminer la Note associée (même ligne du tableau1, colonne Note),
- Trouver la première note de niveau inférieur,
- Trouver l'équivalent de cette note dans la colonne Structure1,
- Copier cette dernière valeur à la droite de la valeur initiale de Structure2.
Exemple :
Colonne à comparer : tableau2 colonne Structure2 - tableau 1 colonne Structure1
Valeur d'exemple dans tableau2 : 444
L'équivalent existe dans tableau1.
Note de la valeur 444 dans tableau1 : 5
Note de niveau inférieur : 4
Valeur associée dans tableau1 : A
Copier la valeur A à droite de 444 dans tableau2.
Faire la même chose pour toutes les valeurs de tableau2.
Merci d'avance pour votre aide.
Bonjour,
Personne n'a d'idée ?
Merci d'avance
Bonjour,
En fait le résultat des comparaison doit être mis où et comment dans votre fichier ?
Je pense que Power Query pourrait faire l'affaire...
Crdlt
Bonjour Dan,
Merci pour ce premier retour. Le résultat de la comparaison doit apparaitre dans une colonne supplémentaire à droite de la colonne composant2 dans le fichier que je joins ici.
Je n'ai pas à dispo Power Query et il me faut quelque chose de reproductible sur différents classeurs sans le faire à la main.
J'ai fait un premier code qui a plusieurs soucis :
- Les inputbox ne prennent pas mon texte quand je demande la sélection des feuilles et des colonnes à comparer.
- La compairson fonctionne une fois sur 2. Par ailleurs, si je rajoute des colonnes dans mon Tableau1 entre les colonnes note et composant1 (parce que la place des colonnes peut varier d'un classeur à l'autre dans mon utilisation finale), la comparaison ne fonctionne plus.
Ci dessous le code :
Sub compareTableaux()
' Variables pour stocker les tableaux et colonnes sélectionnés par l'utilisateur
Dim feuille1 As Worksheet
Dim feuille2 As Worksheet
Dim colonne1 As Range
Dim colonne2 As Range
' Variables pour parcourir les données des tableaux
Dim valeur1 As Variant
Dim valeur2 As Variant
Dim i As Long
Dim j As Long
Dim note_inf As Long
Dim composant_inf As String
' Demande à l'utilisateur de sélectionner les tableaux et les colonnes à comparer
On Error Resume Next
Set feuille1 = Application.InputBox("Sélectionnez la feuille contenant la colonne composant1", Type:=8)
If feuille1 Is Nothing Then
MsgBox "Opération annulée ou feuille invalide sélectionnée. Veuillez recommencer."
Exit Sub
End If
Set colonne1 = Application.InputBox("Sélectionnez la colonne composant1", Type:=8)
If colonne1 Is Nothing Then
MsgBox "Opération annulée ou colonne invalide sélectionnée. Veuillez recommencer."
Exit Sub
End If
Set feuille2 = Application.InputBox("Sélectionnez la feuille contenant la colonne composant2", Type:=8)
If feuille2 Is Nothing Then
MsgBox "Opération annulée ou feuille invalide sélectionnée. Veuillez recommencer."
Exit Sub
End If
Set colonne2 = Application.InputBox("Sélectionnez la colonne composant2", Type:=8)
If colonne2 Is Nothing Then
MsgBox "Opération annulée ou colonne invalide sélectionnée. Veuillez recommencer."
Exit Sub
End If
' Ajoute une colonne "Composant_inf" à droite de la colonne2
feuille2.Columns(colonne2.Column + 1).Insert Shift:=xlToRight
feuille2.Cells(1, colonne2.Column + 1).Value = "Composant_inf"
' Parcourt toutes les valeurs de la colonne2
For i = 2 To feuille2.Cells(Rows.Count, colonne2.Column).End(xlUp).Row
valeur2 = feuille2.Cells(i, colonne2.Column).Value
' Initialise la valeur de Composant_inf à NA par défaut
feuille2.Cells(i, colonne2.Column + 1).Value = "NA"
' Parcourt toutes les valeurs de la colonne1
For j = 2 To feuille1.Cells(Rows.Count, colonne1.Column).End(xlUp).Row
valeur1 = feuille1.Cells(j, colonne1.Column).Value
' Si la valeur de composant2 existe dans la colonne composant1, détermine la note associée et la composante inférieure
If valeur2 = valeur1 Then
note_inf = 0
composant_inf = ""
' Parcourt toutes les valeurs de la colonne1 jusqu'à trouver la note inférieure la plus proche
For k = j - 1 To 2 Step -1
If feuille1.Cells(k, colonne1.Column - 1).Value < feuille1.Cells(j, colonne1.Column - 1).Value Then
note_inf = feuille1.Cells(k, colonne1.Column - 1).Value
composant_inf = feuille1.Cells(k, colonne1.Column).Value
Else
Exit For
End If
Next k
' Écrit la composante inférieure dans la colonne Composant_inf
feuille2.Cells(i, colonne2.Column + 1).Value = composant_inf
Exit For
End If
Next j
Next i
MsgBox "La comparaison est terminée."
End SubCi dessous un exemple de ce que ça doit donner :
Feuil1 :
| note | composant1 |
| 1 | Toto |
| 2 | Tutu |
| 2 | Tata |
| 3 | Titi |
| 4 | Tyty |
| 4 | Tete |
Feuil2 :
| composant2 | Composant_inf |
| Tata | Toto |
| Titi | Tata |
| Tete | Titi |
| Tktk | NA |
| Tutu | Toto |
Merci d'avance pour vos retours.