Comparaison de deux tableaux
Bonjour à tous,
J'ai encore besoin de l'aide d'expert
Je vais essayer d'être le plus clair possible. J'ai deux fichiers excels qu'on appelera cheepow1.xls et cheepow2.xls.
Dans cheepow1.xls :
J'ai un tableau de A à CK et de 1 à 5000
Dans cheepow2.xls :
J'ai un tableau de A à CK et de 1 à 5000
Le but est de créer une macro pouvant vérifier que j'ai bien les mêmes valeurs d'un tableau à l'autre ligne par ligne. J'ai réalisé un code, malheureusement j'ai une erreur et je n'arrive pas à comprendre pourquoi. Ci-dessous le code :
Sub compare()
Dim w_result As Workbook
Dim w_LOPA As Workbook
Dim Table As Worksheet
Dim DerLigne As Long
Dim i, j, k, l As Long
Set w_result = ThisWorkbook
Set w_LOPA = Workbooks.Open("C:\Users\ehuiban\Desktop\LOPA v2.0.xls")
Set result = w_result.Worksheets(1)
Set LOPA = w_LOPA.Worksheets(2)
DerLigneResult = result.Range("A" & Rows.Count).End(xlUp).Row
DerLigneLOPA = LOPA.Range("A" & Rows.Count).End(xlUp).Row
DerColResult = result.Cells(1, Cells.Columns.Count).End(xlToLeft).Column
DerColLOPA = LOPA.Cells(1, Cells.Columns.Count).End(xlToLeft).Column
tab_result = result.Range("A1:CK" & DerLigneResult & "").Value
tab_LOPA = LOPA.Range("A1:CK" & DerLigneLOPA & "").Value
For i = 1 To DerLigneResult
If tab_result(i, 11) <> "" Or tab_result(i, 12) <> "" Or tab_result(i, 27) <> "" Then
For j = 1 To DerLigneLOPA
For k = 1 To DerColResult
For l = 1 To DerColLOPA
If tab_result(i, k) = tab_LOPA(j, l) Then
tab_result(i, 90) = "X"
End If
Next l
Next k
Next j
End If
Next i
result.Range("A1:CK" & DerLigneResult & "").Value = tab_result
LOPA.Range("A1:CK" & DerLigneLOPA & "").Value = tab_LOPA
End Sub
Attention je suis débutant dans le VBA, soyez indulgent
bonjour,
si le but est de vérifier que chaque cellule du fichier result contient la même chose que la cellule équivalente du fichier lopa, tu fais 2 boucles imbriquées de trop
ton code devrait avoir la structure suivante
for ligne = 1 to dernierligneresult
for colonne=1 to derniercolonneresult
if result(ligne,colonne)=lopa(ligne,colonne) then
meme contenu
else
contenu différent
end if
next colonne
next ligne
Salut H2so4,
Merci pour ton aide. Oui en effet, je suis pas réveillé !!!
J'ai refais le code mais toujours une erreur de "L'indice n'appartient pas à la sélection"
Sub compare()
Dim w_result As Workbook
Dim w_LOPA As Workbook
Dim Table As Worksheet
Dim DerLigne As Long
Dim i, j, k, l As Long
Set w_result = ThisWorkbook
Set w_LOPA = Workbooks.Open("C:\Users\ehuiban\Desktop\LOPA v2.0_EHU.xlsx")
Set result = w_result.Worksheets(1)
Set LOPA = w_LOPA.Worksheets(2)
DerLigneResult = result.Range("A" & Rows.Count).End(xlUp).Row
DerLigneLOPA = LOPA.Range("A" & Rows.Count).End(xlUp).Row
DerColResult = result.Cells(1, Cells.Columns.Count).End(xlToLeft).Column
DerColLOPA = LOPA.Cells(1, Cells.Columns.Count).End(xlToLeft).Column
tab_result = result.Range("A1:CK" & DerLigneResult & "").Value
tab_LOPA = LOPA.Range("A1:CK" & DerLigneLOPA & "").Value
For i = 2 To DerLigneResult
For j = 11 To DerColResult
If tab_result(i, j) = tab_LOPA(i, j) Then
tab_result(i, 90) = "X"
End If
Next j
Next i
result.Range("A1:CK" & DerLigneResult & "").Value = tab_result
LOPA.Range("A1:CK" & DerLigneLOPA & "").Value = tab_LOPA
End Sub
bonjour,
je suppose que tu as l'erreur sur cette instruction
tab_result(i, 90) = "X"
l'indice 90 n'existe pas dans ton tableau tab_result. CK correspond à la colonne 89.
une correction possible
remplace cette instruction
tab_result = result.Range("A1:CK" & DerLigneResult & "").Value
par
tab_result = result.Range("A1:CL" & DerLigneResult & "").Value
note cependant, que dès que tu auras une égalité sur la ligne, ta cellule en colonne 90 contiendra un X, je doute que ce soit l'effet recherché, car tu ne détecteras pas des cellules au contenu différent.
Bonjour Cheepow,
Une autre solution pour comparer
En colonne CL fait la somme des colonnes A à CK pour toutes les lignes dans tes 2 tableaux.
En ligne 5001 fait la somme de toutes tes lignes colonne A à CK dans tes 2 tableaux.
Et compare uniquement (ou fait la différence, ce qui donnera 0) cette colonne CL du fichier 1 au fichier 2.
Idem pour la ligne 5001, comparaison ou différence entre les deux tableaux .
Tu peux aussi faire une liaison entre tes deux fichiers pour effectuer cette comparaison ou différence.
Exemple: en ligne 5002 du tableau 1 = ligne 5001 tableau 1 moins ligne 5001 tableau 2 pour toutes les colonnes A à CK. Le total de ces différences devra être égale à 0. Idem en colonne CM tableau 1 fait colonne CL tableau 1 moins CL tableau 2. Total la aussi devra faire zéro. Donc si une (ou plus) valeur n'est pas identique alors la colonne CM et la ligne 5002 le montrera.
Après tu peux affiner seulement là où les différences existent.
H2so4,
Bonne analyse en effet mais après correction toujours la même erreur. De plus il ne me surligne pas ou l'erreur est exactement ce qui est un peu plus compliqué pour chercher. Pour le résultat de la boucle, oui tu as raison, j'ai mis cela en attendant mais plus tard j'aimerai que les cases ou il y a des différences se colorent en rouge. Néanmoins ne sachant pas si cela est possible dans un tableau, je me préoccupe pas du résultat de mon if pour le moment
Ci-dessous le code corrigé :
Sub compare()
Dim w_result As Workbook
Dim w_LOPA As Workbook
Dim Table As Worksheet
Dim DerLigne As Long
Dim i, j, k, l As Long
Set w_result = ThisWorkbook
Set w_LOPA = Workbooks.Open("C:\Users\ehuiban\Desktop\LOPA v2.0_EHU.xlsx")
Set result = w_result.Worksheets(1)
Set LOPA = w_LOPA.Worksheets(2)
DerLigneResult = result.Range("A" & Rows.Count).End(xlUp).Row
DerLigneLOPA = LOPA.Range("A" & Rows.Count).End(xlUp).Row
DerColResult = result.Cells(1, Cells.Columns.Count).End(xlToLeft).Column
DerColLOPA = LOPA.Cells(1, Cells.Columns.Count).End(xlToLeft).Column
tab_result = result.Range("A1:CL" & DerLigneResult & "").Value
tab_LOPA = LOPA.Range("A1:CL" & DerLigneLOPA & "").Value
For i = 2 To DerLigneResult
For j = 11 To DerColResult
If tab_result(i, j) = tab_LOPA(i, j) Then
tab_result(i, 90) = "X"
End If
Next j
Next i
result.Range("A1:CL" & DerLigneResult & "").Value = tab_result
LOPA.Range("A1:CL" & DerLigneLOPA & "").Value = tab_LOPA
End Sub
Bonjour X Cellus,
Je vais essayer de débugger mais je garde ta solution à côté car elle me parait intéressante en effet. Je te remercie pour ton analyse.
bonjour,
Bonne analyse en effet mais après correction toujours la même erreur. De plus il ne me surligne pas ou l'erreur est exactement ce qui est un peu plus compliqué pour chercher
c'est d'autant plus difficile pour ceux qui veulent t'aider qu'ils n'ont aucune idée de ce que contiennent tes fichiers !
h2so4,
En effet l'erreur est bien sur le résultat du if car lorsque je mets un msgbox à la place, cela fonctionne. Je vais donc directement essayer de colorer les cases en cas de similitude. Néanmoins ce que je craignais, j'ai une erreur défini par l'application ou par l'objet.
Est il possible d'appliquer une couleur de cette manière ?
Je suis d'accord, c'est souvent ce que je vois sur ce forum, peux tu montrer tes fichiers. Le problème c'est que ce sont des documents lié à mon travail et je ne peux en aucun cas les divulguer. A la base le VBA n'est absolument pas mon métier, je devrais faire ces vérifications manuellement mais trop long et trop d'erreurs possibles, c'est pour cela que je veux automatiser tout ca.
De toute facon je t'assure qu'il n'y a rien a voir de plus, j'ai un tableau d'un côté le même de l'autre et je dois vérifier que toutes les lignes contiennent les mêmes informations. Ces informations sont toutes écrites de la même manière.
Exemple :
LOPA 1ere ligne (entête du tableau) : Composant | Diminutif | Unité | Valeur | Tolérance
LOPA 2ieme ligne : résistance | R | Ohm | 2 | 5
result 1ere ligne (entête du tableau) : Composant | Diminutif | Unité | Valeur | Tolérance
result 2ieme ligne : résistance | R | Ohm | 2 | 6
Dans cette exemple la case contenant 6 (tolérance du fichier result) reste en fond blanc. Toutes les autres passent en fond vert.
Désolé je peux pas en dire plus. Ci dessous le code avec la couleur :
For i = 2 To derligneresult
For j = 11 To dercolresult
If tab_result(i, j) = tab_LOPA(i, j) Then
Range(Cells(i, j)).Interior.ColorIndex = 6
End If
Next j
Next i
bonjour,
remplace ceci
tab_result = result.Range("A1:CK" & DerLigneResult & "").Value
tab_LOPA = LOPA.Range("A1:CK" & DerLigneLOPA & "").Value
par ceci
tab_result = result.Range("A1:CK" & DerLigneResult & "").Value
tab_LOPA = LOPA.Range("A1:CK" & DerLigneResult & "").Value
et essaie ceci
result.Cells(i, j).Interior.ColorIndex = 6
ou/et
LOPA.Cells(i, j).Interior.ColorIndex = 6
dépendant de la feuille dans laquelle tu veux l'indication de couleur.
pour le reste
Salut tout le monde
For i = 2 To DerLigneResult
For j = 11 To DerColResult
If tab_result(i, j) = tab_LOPA(i, j) Then
tab_result(i, 90) = "X"
End If
Next j
Next i
Comme dit avant, avec ce code tu suppose toujours que les tailles de tab sont identiques
If tab_result(i, j) = tab_LOPA(i, j) Then
si par exemple "tab_result" est plus petit que "tab_LOPA" , ca va génère toujours une erreur ""L'indice n'appartient pas à la sélection""
vous devez avant savoir la déférence entre le nombres de lignes et de colonnes puis tu passe a une autre action
H2so4, Amir,
Merci cela fonctionne parfaitement en effet DerLigneLOPA et DerLigneresult n'avaient pas le même résultat c'est pourquoi cela ne fonctionnait pas. Pour la couleur parfait aussi.
Sujet résolu je vous remercie grandement !!!