Impossible de comparer les valeurs de deux array
Bonjour à tous,
Je suis nouveau sur VBA et je suis confronté à mon premier blocage : je n'arrive pas a comparer les valeurs de deux array différents.
Je m'explique : au début j'ai 2 fichiers Excel, un contenant la liste complète de mes éléments et un autre comprenant une liste incomplète avec des valeurs calculées pour chaque éléments. Je veux récupérer la liste des éléments qui sont dans la liste complète mais absents de la liste incomplète.
Pour cela, je me réfère à la première colonne de chaque fichier qui comprend une sorte d'ID propre à chaque éléments.
Mes fichiers étants volumineux, j'ai mis les valeurs de chaque fichier dans des tableaux multidimensionnels, je me retrouve donc avec un tableau "complet" et un tableau "incomplet", comprenants en (x, 1) les ID des éléments.
Ensuite je procède à la comparaison :
For i = 1 To UBound(tableau_full) - 1
For j = 1 To UBound(tableau_incomplet) -1
If tableau_full(i, 1) = tableau_incomplet(j, 1) And i <> j Then
'code
End If
Next
NextMon problème c'est que ma macro ne trouve aucune valeur égale entre les deux tableaux alors qu'il y en a pourtant (la liste complète contient environ 16 000 éléments et la liste incomplète en contient environ 5 000, tous présents dans l'autre liste) et que tout le reste du code fonctionne normalement.
J'ai essayé de faire avec des dictionnaires et la fonction .Exists mais ça ne m'a pas plus avancé. J'ai aussi cherché du côté des formats de données (comparaison d'une string et d'un entier bloquant par exemple) mais ça n'a pas l'air d'être le problème (et puis j'imagine que j'aurais eu une erreur de compilation?)... J'ai l'impression d'avoir tout essayé et de tourner en rond... Cependant étant un novice en VBA je dois probablement passer à côté de quelque chose alors si vous savez ou avez des idées de pourquoi ça ne fonctionne pas ça m'aiderait beaucoup !
Merci à toutes et à tous pour votre aide !! :D
Bonsoir,
ai-je bien compris :
un tableau complet avec un index > au tableau incomplet
on boucle sur les ID du tableau complet et on regarde s'il existe dans le tableau incomplet, s'il existe on passe à l'ID suivant, s'il n'existe pas on l'ajoute au tableau incomplet, on doit donc l'agrandir d'un index et coller l'ID testé du tableau complet.
Est-ce bien cela ?
@ bientôt
LouReeD
Bonjour,
pas la cause de ton pb (ou alors d'une toute petite partie) mais je m'interroge sur le pourquoi du And i <> j ?
Pour le reste il faudrait un fichier anonymisé de qq lignes pour constater et chercher (les 2 listes sur la même feuille...).
eric
Bonjour,
@LouReed : S'il n'existe pas je l'ajoute à un tableau résultat dont je vais écrire le contenu dans mon fichier incomplet à la suite de ce qu'il y avait déjà (au passage je calcule d'autres valeurs pour chaque éléments) avec une ligne du style :
feuille.Range(feuille.Cells(derniere ligne +1, 1), feuille.Cells(derniere ligne + 1 + Ubound(tableau_resultat), derniere colonne)) = tableau_resultatLe soucis c'est que ça m'ajoute bien mon tableau résultat à la suite des valeurs déjà présentes dans mon fichier mais mon tableau résultat contient alors tous les éléments de mon fichier liste complète, je me retrouve donc avec des éléments en double.
@eriiic : Mince j'ai oublié d'enlever le AND i <> j au moment d'écrire le post, c'est parce que j'ai essayé de tout mettre dans un seul tableau pour voir si ça changerait quelque chose, sans succès. J'ai aussi essayé de tout mettre dans un seul fichier (d'abord mettre le fichier incomplet dans un tableau dont je met les valeurs à la suite dans le fichier complet, puis je met les valeurs de mon fichier complet dans un tableau et je teste sur ce tableau) -> pas marché non plus
Cependant je vais tester avec un fichier contenant peu de valeurs que je fais à la main car il est vrai que le fichier complet m'est donné par mon entreprise alors que le fichier incomplet je le sors de mes macros alors peut être ça vient de là et c'est finalement un problème de format que j'aurais pas compris...?
En tout cas merci beaucoup pour vos réponses, de mon côté je continue de creuser
Et si vous voulez je peux mettre mon code complet.
Bonsoir,
voici un code de principe :
Sub testLRD()
Dim Cpt, TabRésultat(), I, J, Trouve
Cpt = 1 ' compteur de la taille du TabRésultat
For I = 1 To UBound(tableau_full) - 1
' on initialise Trouve à "LouReeD" une valeur "neutre"
Trouve = "LouReeD"
' on boucle sur le tableau incomplet
For J = 1 To UBound(tableau_incomplet) - 1
If tableau_full(I, 1) = tableau_incomplet(J, 1) Then ' si la valeur du tableau complet est trouvée dans le tableau incomplet
' alors trouve prend cette valeur
Trouve = tableau_full(I, 1)
' on sort de la boucle du tableau incomplet pas la mpeine de scanner le reste
Exit For
End If
Next J
' si trouve est toujours égale à LouReeD
' c'est qu'on a pas trouvé la valeur d'index i du tableau complet dans le tableau incomplet
If Trouve = "LouReeD" Then
' on redimensionne le tableau résultat
ReDim tableaurésultat(1 To Cpt)
' on y inscrit la valeur de l'index i du tableau complet
tableaurésultat(Cpt) = tableau_full(I, 1)
' on incrémente le compteur du tableau résultat
Cpt = Cpt + 1
End If
Next I
' ici on colle le tableau résultat
Range("A1").Resize(UBound(TabRésultat)) = TabRésultat ' ou un truc comme ça. Il faut adapter le "1" en fonction du nombre de ligne existantes
End SubAvec quelques ajustements cela devrait marcher !
@ bientôt
LouReeD