Comparaison d'onglet

Comparaison d'onglet - VB/VBA/VBS - Programmation

Marsh Posté le 14-01-2013 à 13:49:15    

Bonjour,
Je souhaiterais créer un tache automatisée pour comparer la première colonne des onglets "fichiers (1,2,3 etc...)" à la première colonne de l'onglet "source".  
Pour être un peu plus clair:
Si une valeur de la colonne A de l'onglet source = une valeur de l'onglet fichier 1 ou 2 ou 3 etc...
Alors copier la ligne correspondante à cette dernière dans l'onglet "récapitulatif"
Et ainsi de suite pour toutes les valeurs de l'onglet source.
 
Auriez-vous des solutions ?
Merci d'avance pour vos réponses.
 
J'ai testé ceci mais cela ne fonctionne pas :
     
Dim a As Integer
Dim b As Integer
Dim vDerligne As Integer
Dim reponse As Integer
 
    For a = Sheets("Import 1" ).Range("A65000" ).End(xlUp).Row To 10 Step -1
 
       For b = Sheets("Import 2" ).Range("A65000" ).End(xlUp).Row To 1 Step -1
 
            If Sheets("Import A" ).Range("A" & a) = Sheets("Import 2" ).Range("A" & b) Then reponse = True
             
     Next b
                If reponse = True Then
                Sheets("Import 1" ).Select
                ActiveSheet.Rows(a).Select
                Selection.copy
                Sheets("Résultats" ).Select
vDerligne = Sheets("Résultats" ).Range("A65000" ).End(xlUp).Row
Range("A" & vDerligne).Select
                ActiveSheet.Paste
         
                End If
 
    Next a
 
 
End Sub
 
Cordialement


Message édité par vallou94 le 14-01-2013 à 15:15:16
Reply

Marsh Posté le 14-01-2013 à 13:49:15   

Reply

Marsh Posté le 15-01-2013 à 13:10:41    

personne pour m'aiguiller ?

Reply

Marsh Posté le 15-01-2013 à 16:18:31    

Le plus simple pour ça me paraît être de faire un VLOOKUP/RECHERCHEV (tuto: http://www.commentcamarche.net/faq [...] recherchev)

 

Ensuite tu l'imbriques dans un IF dans ta formule.
Si tu veux la même chose en VBA fais signe.


Message édité par sh_kyra le 15-01-2013 à 16:21:26
Reply

Marsh Posté le 15-01-2013 à 21:20:38    

Merci sh_kyra mais je préférerais en vba. Si tu pouvais me donner un coup de main ce serait sympa.

Reply

Marsh Posté le 15-01-2013 à 21:24:42    

Je souhaite du vba car j'ai beaucoup de lignes à comparer et elles varient d'un jour à l'autre. Je souhaite que cette tâche soit automatisée.

Reply

Marsh Posté le 16-01-2013 à 10:01:19    

Bonjour,
 
Tu a plusieurs problèmes dans ton code :
Dans ton premier test IF, le nom de la feuille, tu a mis Import A au lieu de Import 1, met également .Value après le range pour comparer les valeurs (.Range("A" & a).Value et .Range("A" & b).Value )
 
Lorsque tu rencontre une occurence, tu met reponse à True mais tu ne le remet jamais à False. Tu devrais faire ça dans ton If Reponse=True, une fois que tu a recopié la ligne.
 
Ta vDerLigne doit etre ton .row + 1, sinon tu va remplacer la dernière ligne
 
Une fois ces petits élements corrigés ça devrait fonctionner


Message édité par pvclunacy le 16-01-2013 à 10:02:05
Reply

Marsh Posté le 16-01-2013 à 11:12:34    

Ça devrait faire ce que tu veux faire - si j'ai bien compris:
 

Code :
  1. Dim a As Integer
  2. Dim b As Integer
  3. Dim vDerligne As Integer
  4. Dim Reponse As Integer
  5. Dim Ws1 As Worksheet
  6. Dim Ws2 As Worksheet
  7. Dim foundRange As Range
  8. Set Ws1 = ThisWorkbook.Worksheets("Import 1" ) 'Exemples de variabilisations...
  9. Set Ws2 = ThisWorkbook.Worksheets("Import 2" )
  10. Set Ws_Resultat = ThisWorkbook.Worksheets("Résultats" )
  11. a = 1
  12. 'On boucle tant que non vide
  13. Do While Not VBA.Trim(Ws1.Cells(1, 1).Offset(a).Value) = "" 'Ou autre chose - tu peux mettre OR/AND ce que tu veux
  14.     b = 1
  15.     Do While Not VBA.Trim(Ws2.Cells(1, 1).Offset(b).Value = "" )
  16.         If Ws1.Cells(1, 1).Offset(a).Value = Ws2.Cells(1, 1).Offset(b).Value Then
  17.             Reponse = True
  18.             Set foundRange = Ws1.Cells(10, 1).Offset(a).EntireRow
  19.             Exit Do 'On stope la boucle, inutile de continuer...
  20.         End If
  21.         b = b + 1
  22.     Loop
  23.     'Si c'est bon, on fait la copie dans résultats
  24.     If Reponse = True And Not foundRange Is Nothing Then
  25.         vDerligne = Ws_Resultat.Range("A65000" ).End(xlUp).Row
  26.         Call foundRange.EntireRow.Copy(Ws_Resultat.Range("A" & vDerligne + 1).EntireRow)
  27.     End If
  28.     Reponse = False
  29.     a = a + 1
  30. Loop


 
Apprend à variabiliser, c'est beaucoup plus clair à lire et bien plus facile à maintenir par la suite...
Gaffe en faisant ton copié collé, il ajoute des espaces après les parenthèses

Message cité 1 fois
Message édité par sh_kyra le 16-01-2013 à 11:35:59
Reply

Marsh Posté le 16-01-2013 à 14:55:53    

sh_kyra a écrit :

Ça devrait faire ce que tu veux faire - si j'ai bien compris:
 

Code :
  1. Dim a As Integer
  2. Dim b As Integer
  3. Dim vDerligne As Integer
  4. Dim Reponse As Integer
  5. Dim Ws1 As Worksheet
  6. Dim Ws2 As Worksheet
  7. Dim foundRange As Range
  8. Set Ws1 = ThisWorkbook.Worksheets("Import 1" ) 'Exemples de variabilisations...
  9. Set Ws2 = ThisWorkbook.Worksheets("Import 2" )
  10. Set Ws_Resultat = ThisWorkbook.Worksheets("Résultats" )
  11. a = 1
  12. 'On boucle tant que non vide
  13. Do While Not VBA.Trim(Ws1.Cells(1, 1).Offset(a).Value) = "" 'Ou autre chose - tu peux mettre OR/AND ce que tu veux
  14.     b = 1
  15.     Do While Not VBA.Trim(Ws2.Cells(1, 1).Offset(b).Value = "" )
  16.         If Ws1.Cells(1, 1).Offset(a).Value = Ws2.Cells(1, 1).Offset(b).Value Then
  17.             Reponse = True
  18.             Set foundRange = Ws1.Cells(10, 1).Offset(a).EntireRow
  19.             Exit Do 'On stope la boucle, inutile de continuer...
  20.         End If
  21.         b = b + 1
  22.     Loop
  23.     'Si c'est bon, on fait la copie dans résultats
  24.     If Reponse = True And Not foundRange Is Nothing Then
  25.         vDerligne = Ws_Resultat.Range("A65000" ).End(xlUp).Row
  26.         Call foundRange.EntireRow.Copy(Ws_Resultat.Range("A" & vDerligne + 1).EntireRow)
  27.     End If
  28.     Reponse = False
  29.     a = a + 1
  30. Loop


 
Apprend à variabiliser, c'est beaucoup plus clair à lire et bien plus facile à maintenir par la suite...
Gaffe en faisant ton copié collé, il ajoute des espaces après les parenthèses


 
Bonjour sh_kyra,
Merci pour cette réponse mais le code ne fonctionne pas comme je le souhaiterais.
Je vais essayer de m'exprimer d'une manière plus compréhensible et réunir des données (Import 1,2,3,4 etc... dans un seul onlet) pour que ce soit plus simple.
 
Je possède donc un fichier avec un onglet Import 1 (je l'appelerai I1), un onglet Import source (je l'appelerai IS)et un onglet Résultat (je l'appelerai IR)
Composition de I1:
A                              B                             C                          D                            
N°                   OD                     Heure Départ       Heure Arrivée
 
Composition de IS:
A               B              C           D              E           F         G         H              I        J       K             L
Marche Dep_D      tHr   Dep_Pt      Arr_Pt     Arr_D     tHr Journée   PS_Dt  Hr   Agent     Gestion
 
Je souhaite chaque valeur de la colonne A de I1 avec chaque valeur de la collone A de IS.
Lorsqu'une valeur commune est trouvée je souhaite la copier la ligne correspondante du fichier IS pour la coller dans la première ligne non vide (à partir de la colonne A) de IR.
 
Est-ce plus clair comme ceci ?
 
Merci encore pour vos retours

Reply

Marsh Posté le 16-01-2013 à 16:02:40    

Ben si j'ai bien compris (mais tes explications sont un peu confuses) la seule différence avec ce que je t'ai donné se situe ici :

 

21. Set foundRange = Ws1.Cells(10, 1).Offset(a).EntireRow

 

à remplacer donc par

 

21. Set foundRange = Ws2.Cells(1, 1).Offset(b).EntireRow

 

Ce que je t'ai donné compare bien I1 avec IS sur la première colonne, la seule différence c'est que je copiais la ligne de I1 et pas de IS dans IR.

 

Et c'est ça dans ton ancien code qui m'a induit en erreur:

 
Citation :


Sheets("Import 1" ).Select
ActiveSheet.Rows(a).Select
Selection.copy

 

Merci sinon de donner le fichier


Message édité par sh_kyra le 16-01-2013 à 16:07:02
Reply

Marsh Posté le 16-01-2013 à 21:42:10    

 
               Une autre méthode certainement plus rapide est d'utiliser une seule boucle combinée à la méthode Find,
               surtout s'il y a beaucoup de lignes à vérifier …
 
               Et bien sûr de désactiver le rafraîchissement de l'écran durant le processus
               et d'ôter tous les .Select inutiles comme dans le code de sh_kyra.
 
               Je reste "en veille" en cas de besoin …
 

Reply

Sujets relatifs:

Leave a Replay

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