Aide VBA comparaison de deux fichiers Excel

Aide VBA comparaison de deux fichiers Excel - VB/VBA/VBS - Programmation

Marsh Posté le 29-01-2015 à 15:13:27    

Bonjour à tous,
 
J'ai un problème concernant un de mes scripts VBA. Je vais tenter d'être le plus clair possible.
 
Sur mon fichier Excel1, j'ai une suite de nombres tels que ci-dessous, avec des lignes vides parfois (obligatoire):
5250035
5250037
 
5430111
 
5450039
5450044
 
1010068
 
1010070
1030322
 
Ensuite, j'ai un fichier Excel3, où il y a les nombres du fichier Excel 1 mais aussi des nombres qui n'y sont pas, ainsi qu'une deuxième colonne avec d'autres nombres. Ici, il n'y a pas de lignes vides:
 
1010070     3
1030322     5
1050590     3
1050597     5
1580128     2
 
J'avais trouvé sur un ancien topic de futura-sciences une personne cherchant à comparer deux fichiers excel, comme moi, le script ci-dessous que j'ai tenté de modifier à ma sauce:

Code :
  1. Option Explicit
  2. Sub Macro1000()
  3.     Dim Cellule As Range
  4.     Dim Excel3 As Workbook
  5.     Dim LastLine As Integer
  6.     Dim LastLine2 As Integer
  7.     Dim Tableau1() As Variant
  8.     Dim Tableau2() As Variant
  9.     Dim I As Integer
  10.     Dim J As Integer
  11.     Dim K As Integer
  12.                
  13.     ' On cherche le numéro de la dernière ligne utilisée dans la colonne A
  14.     LastLine = Cells(Rows.Count, "A" ).End(xlUp).Row
  15.    
  16.     ' On redimensionne le tableau de façon dynamique
  17.     ReDim Tableau1(LastLine)
  18.    
  19.     ' On charge le tableau avec les valeurs de la colonne A
  20.     For I = 1 To LastLine
  21.       Tableau1(I) = Range("A" & Trim(Str(I)))
  22.     Next I
  23.    
  24.     ' On ouvre le fichier excel3.xlsm et on lui donne le focus
  25.     Workbooks.Open Filename:=ActiveWorkbook.Path & "\Excel3.xlsm"
  26.     Set Excel3 = ActiveWorkbook
  27.     Excel3.Activate
  28.    
  29.         ' On cherche le numéro de la dernière ligne utilisée dans la colonne A
  30.     LastLine2 = Cells(Rows.Count, "A" ).End(xlUp).Row
  31.         ' On a besoin de stocker les valeurs de 1 colonne
  32.     ReDim Tableau2(LastLine2)
  33.    
  34.     ' On scanne la colonne "Pointeur" avec les valeurs contenues dans le tableau
  35.     For J = 1 To LastLine
  36.         Set Cellule = ActiveSheet.Range("Pointeur" ).Find(Tableau1(I), lookat:=xlWhole)
  37.         Tableau2(J) = Cellule.Offset(0, 1).Value
  38.     Next J
  39.    
  40.     'On referme le classeur excel3.xls dont on n'a plus besoin
  41.     Excel3.Close
  42.    
  43.     ' On recopie le contenu du tableau dans la colonne B
  44.     For K = 1 To LastLine
  45.         Tableau2(J) = Range("B" & Trim(Str(K)))
  46.     Next K
  47. End Sub


 
Si vous comprenez là où je veux en venir, c'est que sur mon Excel1, je retrouve les nombres de la deuxième colonne du fichier Excel3, et ainsi laisser vide les cellules où les nombres n'y sont pas, ainsi avoir, si on reprend l'exemple précédent:
 
5250035
5250037
 
5430111
 
5450039
5450044
 
1010068
 
1010070    3
1030322    5
 
 
Cependant, lorsque je tente de lancer le script, j'ai l'erreur suivante:
 
Erreur d'exécution "9"
L'indice n'appartient pas à la sélection

 
Selon moi, c'est le Tableau1 qui ne fonctionne pas bien, car il n'arrive pas à voir les lignes vides et celles qui n'existent pas dans la correspondance Excel1 <-> Excel3
 
J'ai tenté de mettre une itération "If", cependant je n'ai pas été avancé, et comme le VBA, je ne suis pas un spécialiste, je bloque.
 
C'est ainsi que je sollicite l'aide de personnes plus expérimentées que moi, car là je sèche.
 
Merci pour votre aide


Message édité par El_Cypriano le 29-01-2015 à 16:06:50
Reply

Marsh Posté le 29-01-2015 à 15:13:27   

Reply

Marsh Posté le 29-01-2015 à 17:43:19    

 
           Bonjour, bonjour !
 
           Cette erreur est juste une erreur de conception ! Du reste son message est assez clair …
 
           Suivre donc la progression du code en mode pas à pas via la touche F8
           tout en vérifiant le contenu de la fenêtre des Variable locales
 
           _______________________________________________________________________
           Tous unis, tous Charlie
 

Reply

Marsh Posté le 30-01-2015 à 08:50:05    

Bonjour,
 
Désolée de ne pas avoir répondu plus tôt. J'ai fait comme tu m'as dit en vérifiant les Variables Locales, et j'ai bien un problème pour la variable "Cellule", elle reste à "Nothing" et ne prend pas la valeur escomptée.
 
Est-ce que je dois d'abord l'initialiser avec une valeur quelconque ?

Reply

Marsh Posté le 30-01-2015 à 10:15:50    

Bon, j'ai légèrement modifié mon code pour qu'il soit un peu moins bordélique:
 

Code :
  1. Sub Macro1000()
  2.     Dim Cellule As Range
  3.     Dim LastLine As Integer
  4.     Dim LastLine2 As Integer
  5.     Dim Tableau1() As Variant
  6.     Dim Tableau2() As Variant
  7.     Dim I As Integer
  8.     Dim J As Integer
  9.     Dim K As Integer
  10.                
  11.     With ActiveWorkbook.Sheets("Compte" ).Activate
  12.         LastLine = Cells(Rows.Count, "A" ).End(xlUp).Row
  13.         ReDim Tableau1(LastLine)
  14.         For I = 1 To LastLine
  15.             Tableau1(I) = Range("A" & Trim(Str(I)))
  16.         Next I
  17.     End With
  18.          
  19.     With ActiveWorkbook.Sheets("Valeur" ).Activate
  20.         LastLine2 = Cells(Rows.Count, "A" ).End(xlUp).Row
  21.         ReDim Tableau2(LastLine2)
  22.         For J = 1 To LastLine
  23.             Set Cellule = Range("Pointeur" ).Find(Tableau1(I), lookat:=xlWhole)
  24.             Tableau2(J) = Cellule.Offset(0, 1).Value
  25.         Next J
  26.     End With
  27.    
  28.     For K = 1 To LastLine
  29.         Tableau2(J) = Range("B" & Trim(Str(K)))
  30.     Next K
  31.    
  32. End Sub


 
En fait, je ne pense pas que cela vienne de Cellule, mais plutôt de Tableau1(I), une fois que j'ai effectué tous les I de 1 à LastLine, Tableau1(I) m'indique: "L'indice n'appartient pas à la sélection".
 
C'est pour cela que Cellule n'arrive pas à s'initialiser. Bon maintenant que j'ai trouvé la source du problème, pourquoi cela pose problème ??  

Reply

Marsh Posté le 30-01-2015 à 12:53:41    

 
           Dans l'aide VBA intégrée, quel type de donnée renvoie donc la propriété Row ?
           Corriger la déclaration des variables en conséquence …
 
           En ligne n°11 il y a confusion des genres, c'est l'un ou l'autre mais pas les deux ‼
           Comme activer ou sélectionner en général ne sert à rien à part ralentir la procédure  :

Code :
  1.     With ActiveWorkbook.Worksheets("Compte" )
  2.         LastLine = .Cells(.Rows.Count, 1).End(xlUp).Row
  3.         ReDim Tableau1(1 To LastLine)
  4.         For I = 1 To LastLine
  5.             Tableau1(I) = .Cells(I, 1).Value
  6.         Next I
  7.     End With

           Même si alimenter une variable tableau par les valeurs de cellules via une boucle est complètement idiot
           (les lignes n°2 à 6 de cette correction pouvant être remplacées par une seule ligne de code !),
           il fonctionne sans souci de mon côté sur différentes versions d'Excel …
 
           Si ce n'est pas le cas du tien, suivre le code en mode pas à pas pour débusquer ton erreur …
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed