Comparaison cellules 2 tableaux sur même feuille avec Application.Match
Bonjour à toutes et à tous,
/!\ Fichier en PJ
/!\Je débute en VBA
Dans mon cadre professionnel je dois réaliser un programme VBA permettant tout d'abord de comparer les références de deux tableaux présent sur une même feuille puis afficher les références différentes entre les deux tableaux. Deuxièmement je dois afficher les quantités qui diffèrent pour des références identiques. Bien sur l'ordre dans lequel sont organisées les données ne doit pas influer.
La partie concernant la comparaison des références est réussie, cependant la partie concernant la comparaison des quantités me pose soucis. Voici mon code ci-dessous avec les commentaires permettant de le suivre facilement.
Sub Compare()
'Déclaration variables I est la ligne d'une cellule à comparer du 1er tableau, K est la ligne d'une cellule à comparer du 2eme tableau
'J1 est la ligne d'affichage de la réponse, M est le nombre de ligne qu'il y a dans le tableau
Dim I As Long, K As Long, J1 As Long, M As Long
Application.ScreenUpdating = False
J1 = 2
'En partant du bas de la feuille puis en remontant jusqu'au bas du tableau M obtient le nombre de lignes présentes dans le tableau
M = Cells(Rows.Count, 1).End(xlUp).Row
'Les prochaiines lignes permettent un affichage propre
Range("N1:Q1").MergeCells = True
Range("R1:U1").MergeCells = True
Range("N1").Value = "Ref BC3 not in BE2"
Range("R1").Value = "Ref BE2 not in BC3"
Range("N1").HorizontalAlignment = xlCenter
Range("R1").HorizontalAlignment = xlCenter
Range("N1").Font.Bold = True
Range("R1").Font.Bold = True
Range("N2").Value = "Des"
Range("O2").Value = "Ref"
Range("P2").Value = "Qté"
Range("Q2").Value = "Cat"
Range("R2").Value = "Des"
Range("S2").Value = "Ref"
Range("T2").Value = "Qté"
Range("U2").Value = "Cat"
Range("W1:AA1").MergeCells = True
Range("W1").Value = "Quantity not equal"
Range("W1").HorizontalAlignment = xlCenter
Range("W1").Font.Bold = True
Range("W2").Value = "Des"
Range("X2").Value = "Ref"
Range("Y2").Value = "Cat"
Range("Z2").Value = "Qty BC3"
Range("AA2").Value = "Qty BE2"
'Partie comparaison de références
For I = 3 To M
If IsError(Application.Match(Range("B" & I).Value, Columns("F"), 0)) Then
J1 = J1 + 1
Range("N" & J1).Value = Range("A" & I).Value
Range("O" & J1).Value = Range("B" & I).Value
Range("P" & J1).Value = Range("C" & I).Value
Range("Q" & J1).Value = Range("D" & I).Value
End If
If IsError(Application.Match(Range("F" & I).Value, Columns("B"), 0)) Then
J1 = J1 + 1
Range("R" & J1).Value = Range("E" & I).Value
Range("S" & J1).Value = Range("F" & I).Value
Range("T" & J1).Value = Range("G" & I).Value
Range("U" & J1).Value = Range("H" & I).Value
End If
Next I
'Partie comparaison de qté pour une même référence
J1 = 2
'On parcourt le 1er tableau grâce à la variable I
For I = 3 To M
'On parcourt le 2eme tableau grâce à la variable K
For K = 3 To M
'/!\/!\/!\(c'est ici qu'il y a un soucis) S'il y a la même référence entres les deux tableaux alors:
If Not IsError(Application.Match(Range("B" & I).Value, Range("F" & K).Value, 0)) Then
'S'il y a une erreur entre les qtés d'une même ref alors:
If IsError(Application.Match(Range("C" & I).Value, Range("G" & K).Value, 0)) Then
'Partie affichage
J1 = J1 + 1
Range("W" & J1).Value = Range("A" & I).Value
Range("X" & J1).Value = Range("B" & I).Value
Range("Y" & J1).Value = Range("D" & I).Value
Range("Z" & J1).Value = Range("C" & I).Value
Range("AA" & J1).Value = Range("G" & K).Value
End If
End If
Next K
Next I
Application.ScreenUpdating = True
End SubLors du débogage je me rend compte que VBA considère que toutes les références sont différentes donc il saute l'étape de comparaison des quantités. Or 3 références sont identiques et je n'arrive pas à résoudre cela.
Si quelqu'un peut m'aider?
Merci à vous!
Bonjour,
.Match permet de connaitre la position d'une valeur cherchée dans une plage.
S'il s'agit de comparer deux cellules, le plus simple :
If Range("B" & I).Value = Range("F" & K).Value Then
...A+
bonjour,
en utilisant la méthode find et en simplifiant la logique
Merci h2so4, c'est exactement ce que je recherchais!
Peux-tu cependant m'expliquer exactement ce que chaque ligne fait? Car étant débutant je ne comprends pas tout..
Merci!
Bonsoir,
voici quelques commentaires
Sub Compare()
'Déclaration variables I est la ligne d'une cellule à comparer du 1er tableau, K est la ligne d'une cellule à comparer du 2eme tableau
'J1 est la ligne d'affichage de la réponse, M est le nombre de ligne qu'il y a dans le tableau
Dim I As Long, K As Long, J1 As Long, J2 As Long, J3 As Long, M As Long, dl As Long, re As Range
Application.ScreenUpdating = False
J1 = 2 'compteur ligne dans A et pas dans B
J2 = 2 'compteur ligne dans B et pas dans A
J3 = 2 'compteur ligne qte <>
'En partant du bas de la feuille puis en remontant jusqu'au bas du tableau M obtient le nombre de lignes présentes dans le tableau
'Les prochaiines lignes permettent un affichage propre
Range("N1:Q1").MergeCells = True
Range("R1:U1").MergeCells = True
Range("N1").Value = "Ref A not in B"
Range("R1").Value = "Ref B not in A"
Range("N1").HorizontalAlignment = xlCenter
Range("R1").HorizontalAlignment = xlCenter
Range("N1").Font.Bold = True
Range("R1").Font.Bold = True
Range("N2").Value = "Des"
Range("O2").Value = "Ref"
Range("P2").Value = "Qté"
Range("Q2").Value = "Cat"
Range("R2").Value = "Des"
Range("S2").Value = "Ref"
Range("T2").Value = "Qté"
Range("U2").Value = "Cat"
Range("W1:AA1").MergeCells = True
Range("W1").Value = "Quantity not equal"
Range("W1").HorizontalAlignment = xlCenter
Range("W1").Font.Bold = True
Range("W2").Value = "Des"
Range("X2").Value = "Ref"
Range("Y2").Value = "Cat"
Range("Z2").Value = "Qty A"
Range("AA2").Value = "Qty B"
'Partie comparaison de références
dl = Cells(Rows.Count, 2).End(xlUp).Row 'dernière ligne tableau A
Set plageb = Range("B1").Resize(dl, 1) 'plage des références du tableau A (colonne B), qui part de B1 sur une hauteur de DL lignes
M = dl
dl = Cells(Rows.Count, 6).End(xlUp).Row ' dernière ligne tableau B, on fait l'hypothèse qu'elle peut ne pas être la même que tableau A
Set plageF = Range("F1").Resize(dl, 1) ' 'plage des références du tableau B (colonne F), qui part de F1 sur une hauteur de DL lignes
M = Application.Max(M, dl) 'M= dernière ligne du tableau A et B (on prend la plus grande des 2 valeurs)
For I = 3 To M 'on parcourt les tableaux A et B de la ligne 3 à la ligne M
If Range("B" & I) <> "" Then ' si référence non vide
' re contiendra la reférence à la cellule en colonne F qui contient la valeur contenue dans B&I, Re sera nothing si la référence n'est pas trouvée
Set re = plageF.Find(Range("B" & I), lookat:=xlWhole, LookIn:=xlValues) 'recherche de la reference B&i dans la plage F
If re Is Nothing Then 'ref A pas trouvée en B
J1 = J1 + 1
Range("N" & J1).Value = Range("A" & I).Value
Range("O" & J1).Value = Range("B" & I).Value
Range("P" & J1).Value = Range("C" & I).Value
Range("Q" & J1).Value = Range("D" & I).Value
ElseIf Range("C" & I) <> Cells(re.Row, "G") Then 'ref A trouvée en B mais qte <>
J3 = J3 + 1
Range("W" & J3).Value = Range("A" & I).Value
Range("X" & J3).Value = Range("B" & I).Value
Range("Y" & J3).Value = Range("D" & I).Value
Range("Z" & J3).Value = Range("C" & I).Value
Range("AA" & J3).Value = Cells(re.Row, "G") ' mettre en colonne AA, la qte qui se trouve sur la ligne de la reference de A (col B) trouvée en B (col F) (re.row)
End If
End If
If Range("F" & I) <> "" Then 'si référence non vide
Set re = plageb.Find(Range("F" & I), lookat:=xlWhole, LookIn:=xlValues) 'recherche de la reference F&i dans la plage B
If re Is Nothing Then 'ref B pas trouvée en A
J2 = J2 + 1
Range("R" & J2).Value = Range("E" & I).Value
Range("S" & J2).Value = Range("F" & I).Value
Range("T" & J2).Value = Range("G" & I).Value
Range("U" & J2).Value = Range("H" & I).Value
End If
End If
Next I
Application.ScreenUpdating = True
End Sub