[VBA] comparaison de 2 fichiers excel

comparaison de 2 fichiers excel [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 11-05-2013 à 22:19:42    

Bonjour à tous, voilà on a 2 fichiers l'un s'appelant test et l'autre test2, mon fichier test est mis a jour régulièrement mais il a besoin d'une donnée particulière dans le fichier test2.  
 
 
contenu du fichier test.xls :
 
http://img11.hostingpics.net/pics/776534test.png
 
contenu du fichier test2.xls :
 
http://img11.hostingpics.net/pics/950254test2.png
 
On peut identifier les utilisateur de façon unique avec leur "id" présent dans chacun des fichiers, on voudrais dans le cas où on parle du même utilisateur ajouter les données de la colonne "code" de test2 aux utilisateurs correspondants dans test.
A savoir que ce sont bien sûr 2 fichiers excel et que je dois répéter plusieurs fois cette action car en réalité il y a des milliers d'utilisateurs.
 
Maintenant voilà mon problème :
 
J'obtiens l'erreur "mémoire insuffisante" après quelques recherche le problème viendrait du type de variable que j'utilise serait trop "petit" pour stocker le trop grand nombre de donnée présent dans les feuilles excel, mais j'avoue ne pas vraiment savoir où localiser le problème exactement, donc voici le code de la macro que j'utilise :
 

Code :
  1. Sub comparaison()
  2. 'Evite de voir les opérations intermédiaire sur les fichiers
  3. Application.ScreenUpdating = False
  4. 'déclarations des variables
  5. Dim i As Integer
  6. Dim j As Integer
  7. Dim Trouve As Integer
  8. Dim appExcel As Excel.Application
  9. Dim test2 As Excel.Workbook
  10. Dim tests2 As Excel.Worksheet
  11. Dim test As Excel.Workbook
  12. Dim tests As Excel.Worksheet
  13. 'parametrage d'appel des fichiers
  14. Set appExcel = CreateObject("Excel.Application" ) 'creation de l'objet permettant d'ouvrir le fichier excel
  15. Set test2 = appExcel.Workbooks.Open("chemin_vers_le_fichier_test2.xls" ) 'classeur
  16. Set tests2 = test2.Worksheets("nom_de_la_feuille" ) 'feuille
  17. Set test = appExcel.Workbooks.Open("chemin_vers_le_fichier_test.xls" )
  18. Set tests = test.Worksheets("nom_de_la_feuille" )
  19.     i = 2 'initialisation du compteur à 2 car la ligne 1 contient l'en-tête de chaque donnée
  20.     While (tests.Cells(i, 2).Value <> "" ) ' tant que dans le fichier test la cellule en (ligne i, colonne B) n'est pas vide
  21.         j = 2
  22.         Trouve = 0 'cette variable sert d'indicateur si c'est à 0 on a rien trouvé ou 1 on a trouvé la cellule correspondante
  23.        
  24.         While (tests2.Cells(j, 3).Value <> Null) & (Trouve = 0)
  25.            
  26.             'si la cellule du fichier test2 correspond à celle de test alors
  27.             If (tests2.Cells(j, 3).Value = _
  28.             tests.Cells(i, 2).Value) Then
  29.             Trouve = 1
  30.             'On copie le code à la ligne actuelle dans une nouvelle colonne
  31.                 tests.Cells(i, 3).Value = _
  32.                 tests2.Cells(j, 2).Value
  33.             'sinon on passe à la ligne suivante de icatfiltre
  34.             Else
  35.            
  36.             j = j + 1
  37.        
  38.             End If
  39.         Wend
  40.        
  41.         i = i + 1
  42.     Wend
  43.     'on ferme le classeur
  44.     test.Close
  45.     test2.Close
  46.    
  47. End Sub


 
Est-ce que je m'y suis mal pris concernant le code? je suis libre à toute proposition, à savoir que les 2 fichiers se trouve dans le même dossier.
 
Je vous remercie d'avance :)


Message édité par furil le 11-05-2013 à 22:20:57
Reply

Marsh Posté le 11-05-2013 à 22:19:42   

Reply

Marsh Posté le 12-05-2013 à 13:25:02    

 
           Bonjour.
 
           Ne sachant pas quel est le logiciel (et sa version) rattaché au fichier contenant le code ni la version de Windows
           ni la quantité de RAM de l'ordinateur, je ne peux qu'exprimer des doutes au lieu de certitudes …
 
           Si le code est bien contenu dans un fichier Excel, alors les déclarations d'objet & d'instance d'Excel sont inutiles  (lignes n°13 & 23)
           car en ouvrant un autre Excel, il y a donc moins de mémoire disponible ‼
 
           Ensuite pour une question d'efficacité, seule une boucle est nécessaire, celle servant à parcourir le fichier Test;
           pour trouver une correspondance dans le fichier Test2, voir l'aide de la méthode  Find  associée à un objet Range,
           comme dans le très récent sujet  Beug de programme  avec une problématique assez proche …
 
           Sinon une certitude : aucune ligne de code VBA est nécessaire ‼
 
           En effet, en plaçant la colonne Code Id en première dans le fichier test2,
           il suffit alors d'une simple formule  RECHERCHEV  dans le fichier test …

Message cité 1 fois
Message édité par Marc L le 12-05-2013 à 15:32:11
Reply

Marsh Posté le 12-05-2013 à 13:34:48    

Bonjour Marc L,
 
Merci de ta réponse, ensuite pour répondre à tes question la version d'excel utilisée est la 2007, la quantité de RAM est de 2Go, et le code est bel et bien contenu dans le fichier test.xls. Je vais donc maintenant chercher plus d'informations concernant Find et RechercheV . :) . Je donnerai des nouvelles quand j'aurai modifié tous ça :)
 
Encore merci et bonne journée :)

Reply

Marsh Posté le 12-05-2013 à 15:29:38    

Marc L a écrit :

Sinon une certitude : aucune ligne de code VBA est nécessaire ‼
 
En effet, en plaçant la colonne Code en première dans le fichier test2,
il suffit alors d'une simple formule  RECHERCHEV  dans le fichier test …


            Correction :   c'est évidemment la colonne Id qui doit être la première dans le fichier test2 …
 

Reply

Marsh Posté le 12-05-2013 à 18:17:06    

Rebonjour,
 
J'ai pu trouvé une "solution" à mon problème mais que pour les fichiers de petites tailles :
 

Code :
  1. Sub comparaison()
  2. 'Evite de voir les opérations intermédiaire sur les fichiers
  3. Application.ScreenUpdating = False
  4. 'déclarations des variables
  5. Dim i As Integer
  6. Dim j As Integer
  7. Dim Trouve As Integer
  8.     i = 2 'initialisation du compteur à 2 car la ligne 1 contient l'en-tête de chaque donnée
  9.     While (Workbooks("test.xlsm" ).Sheets(1).Cells(i, 2).Value <> "" )  ' tant que dans le fichier test la cellule en (ligne i, colonne B) n'est pas vide
  10.         j = 2
  11.         Trouve = 0 'cette variable sert d'indicateur si c'est à 0 on a rien trouvé ou 1 on a trouvé la cellule correspondante
  12.      
  13.      
  14.         While (Workbooks("test2.xlsm" ).Sheets(1).Cells(j, 3).Value <> Null) & (Trouve = 0)
  15.          
  16.             'si la cellule du fichier test2 correspond à celle de test alors
  17.             If (Workbooks("test2.xlsm" ).Sheets(1).Cells(j, 3).Value = _
  18.             Workbooks("test.xlsm" ).Sheets(1).Cells(i, 2).Value) Then
  19.             Trouve = 1
  20.             'On copie le code à la ligne actuelle dans une nouvelle colonne
  21.                Workbooks("test.xlsm" ).Sheets(1).Cells(i, 3).Value = _
  22.                 Workbooks("test2.xlsm" ).Sheets(1).Cells(j, 2).Value
  23.             'sinon on passe à la ligne suivante de icatfiltre
  24.             Else
  25.          
  26.             j = j + 1
  27.      
  28.             End If
  29.         Wend
  30.      
  31.         i = i + 1
  32.     Wend


 
Cependant pour les gros fichiers excel (contenant des milliers de lignes) j'obtient l'erreur suivant : Dépassement de capacité
 
J'avoue ne pas savoir comment adapter ce code avec un find mais voici un début:
 

Code :
  1. Sub comparaison2()
  2. Application.ScreenUpdating = False
  3.     Dim i As Integer
  4.     Dim firstAddress As String
  5.    
  6. While (Workbooks("test.xlsm" ).Sheets(1).Cells(i, 2).Value <> "" )
  7.     With Workbooks("test2.xlsm" ).Sheet(1).Range("C2:C5" )
  8.     Set c = .Find(valrech, LookIn:=xlValues, LookAt:=xlWhole)
  9.    
  10.    
  11.      If (c) Then
  12.    
  13.     MsgBox (c)
  14.     End If
  15.     End With
  16. Wend
  17.      
  18. End Sub


Message édité par furil le 12-05-2013 à 18:17:41
Reply

Marsh Posté le 12-05-2013 à 18:53:52    

 
           Concernant le dépassement de capacité du premier code, c'est dû au mauvais type des variables i & j.
           Autant ne rien définir que de déclencher une erreur :  mettre donc en commentaire les lignes n°5 & 6 !  (ou bien corriger le type)
 
 
           Quant au deuxième code, la variable i n'est pas initialisée, valrech non plus, un s manquant à Sheet en ligne n°11, …
 
           De toute manière avec la colonne Id en première dans le fichier test2, une simple formule  RECHERCHEV  dans une cellule suffit !
 
           Pourquoi donc vouloir utiliser VBA ?!


Message édité par Marc L le 12-05-2013 à 19:06:18
Reply

Marsh Posté le 13-05-2013 à 18:57:56    

Bonjour Marc L,
 
Merci pour ton aide, je n'ai pas utilisé au final ta solution mais je prends ça en compte pour d'autres développement en VBA qui me sera certainement très utile :) :
Ci-joint le code corrigé comme promis pour ceux que ça intéresse :

Code :
  1. Sub Comparaison ()
  2. 'Evite de voir les opérations intermédiaire sur les fichiers
  3. Application.ScreenUpdating = False
  4. 'déclarations des variables
  5. Dim i As Integer
  6. Dim j As Integer
  7. Dim Trouve As Integer
  8.     i = 2 'initialisation du compteur à 2 car la ligne 1 contient l'en-tête de chaque donnée
  9.     While (Workbooks("test.xlsm" ).Sheets(1).Cells(i, 2).Value <> "" )  ' tant que dans le fichier test la cellule en (ligne i, colonne B) n'est pas vide
  10.         j = 2
  11.         Trouve = 0 'cette variable sert d'indicateur si c'est à 0 on a rien trouvé ou 1 on a trouvé la cellule correspondante
  12.         While (Workbooks("test2.xlsm" ).Sheets(1).Cells(j, 3).Value <> "" ) And (Trouve = 0)
  13.             'si la cellule du fichier test2 correspond à celle de test alors
  14.             If (Workbooks("test2.xlsm" ).Sheets(1).Cells(j, 3).Value = _
  15.             Workbooks("test.xlsm" ).Sheets(1).Cells(i, 2).Value) Then
  16.             Trouve = 1
  17.             'On copie le code à la ligne actuelle dans une nouvelle colonne
  18.                Workbooks("test.xlsm" ).Sheets(1).Cells(i, 3).Value = _
  19.                 Workbooks("test2.xlsm" ).Sheets(1).Cells(j, 2).Value
  20.             'sinon on passe à la ligne suivante de test2
  21.             Else
  22.             j = j + 1
  23.             End If
  24.         Wend
  25.         i = i + 1
  26.     Wend
  27. End Sub

Reply

Marsh Posté le 13-05-2013 à 22:34:07    

 
           Bonsoir.
 
           Comme je l'ai indiqué sur l'autre forum, s'il y a beaucoup de lignes, définir les variables i & j en Integer est une connerie ‼
 

Reply

Sujets relatifs:

Leave a Replay

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