XL 2013 VBA - Comparaison de 2 tableaux

Ananas94

XLDnaute Junior
Bonjour le forum,

Après de nombreuses recherches laborieuses, je me tourne vers vous car je suis bloquée sur un code...

Je souhaite comparer en VBA 2 tableaux non structurés. Il y a une feuille "Depart" et une feuille "Arrivee". Je souhaite faire apparaître en jaune dans la feuille d'arrivée les lignes et/ou colonnes ajoutées (pour les supprimées, un MsgBox) et/ou les éléments de l'intérieur du tableaux modifiés.

Le raisonnement de mon algorithme est le suivant :

1-Comparaison du nombre de colonnes/lignes pour voir lesquelles ont été ajoutées/supprimées. Des MsgBox/cases en jaune attestent du résultat au fur et à mesure des recherches.->OK

2-Comparaison de l'intérieur du tableau pour voir si le contenu de certaines cellules a été modifié. C'est là où je bloque. Je cherche le point commun entre les 2 tableaux : le numéro de dossier (1è colonne) et je compare ensuite les 2 lignes. Ces 2 lignes n'ont pas forcément le même numéro (index)!
Je bloque au moment de trouver le numéro de ligne, où le message "Incompatibilité de type" apparaît, car la variable NumLig_Dossier semble de type String (On le voit lorsque je la fait apparaître dans une MsgBox) alors que c'est un index, ce devrait être un numéro de ligne ! Auriez-vous une idée ?

VB:
NumLig_Dossier = Application.Match(ws_D.Cells(lig_D, 1), ws_A.Range("A:A"), 0).Index

Vous trouverez en pièce jointe un fichier de modèle, où j'ai commenté au maximum.
Merci pour vos lumières :)
 

Pièces jointes

  • Comparaison.xlsm
    25.3 KB · Affichages: 15
Solution
Là aussi, une erreur
Application.CountIf(ws_A.Range("A:A"), ws_D.Cells(lig_D, 1).Value)

si vous voulez désigner une plage il faut mettre sous cette forme:

Application.CountIf(ws_A.Range("A1:A1000"), ws_D.Cells(lig_D, 1).Value)
ou
Application.CountIf(ws_D.Columns("A:A"), ws_A.Cells(lig_A, 1).Value)
ou
Application.CountIf(ws_D.Columns(1), ws_A.Cells(lig_A, 1).Value)

Ananas94

XLDnaute Junior
Bonjour,

La ligne en défaut:
VB:
NumLig_Dossier = Application.Match(ws_D.Cells(lig_D, 1), ws_A.Columns(1), 0)

Les parenthèses dans les MsgBox sont inutiles

Est-ce bien judicieux d'afficher tous ces messages en cascades?

Cdlt
Merci de vous pencher sur mon problème ! :)

Dans le fichier ci-joint, je viens de :

1 - Remplacer la ligne en défaut.
Résultat : Le dossier 1 se surligne en jaune...ce qui est faux car cette case n'a pas été modifée. Il faudrait logiquement que ce soit la case correspondant aux coordonnées (Dossier n°6 , Element 4) .
-> Je ne comprends pas pourquoi le code s'arrête au dossier 1 et le prend comme une différence (alors qu'il n'y en n'a pas entre les 2 feuilles).

2-
Enlever les Msgbox.
Elles ne sont en effet pas indispensables, mais m'ont beaucoup aidée jusqu'à présent pour déceler les problèmes successifs dans le code (je ne suis pas d'un excellent niveau en VBA).

Je suis convaincue que je ne suis pas loin, ..

Merci à vous :)
 

Pièces jointes

  • Comparaison.xlsm
    24.6 KB · Affichages: 19

Rouge

XLDnaute Impliqué
Là aussi, une erreur
Application.CountIf(ws_A.Range("A:A"), ws_D.Cells(lig_D, 1).Value)

si vous voulez désigner une plage il faut mettre sous cette forme:

Application.CountIf(ws_A.Range("A1:A1000"), ws_D.Cells(lig_D, 1).Value)
ou
Application.CountIf(ws_D.Columns("A:A"), ws_A.Cells(lig_A, 1).Value)
ou
Application.CountIf(ws_D.Columns(1), ws_A.Cells(lig_A, 1).Value)
 

Ananas94

XLDnaute Junior
Là aussi, une erreur
Application.CountIf(ws_A.Range("A:A"), ws_D.Cells(lig_D, 1).Value)

si vous voulez désigner une plage il faut mettre sous cette forme:

Application.CountIf(ws_A.Range("A1:A1000"), ws_D.Cells(lig_D, 1).Value)
ou
Application.CountIf(ws_D.Columns("A:A"), ws_A.Cells(lig_A, 1).Value)
ou
Application.CountIf(ws_D.Columns(1), ws_A.Cells(lig_A, 1).Value)
Merci beaucoup ça fonctionne ! Mille mercis !
 

Discussions similaires

Statistiques des forums

Discussions
314 716
Messages
2 112 162
Membres
111 447
dernier inscrit
jasontantane