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 tu aurais pu mettre les données que tu as tapées dans ton message précédent dans des fichiers, reproduire le problème et nous envoyer ces fichiers.

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 !!!

Rechercher des sujets similaires à "comparaison deux tableaux"