Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3180 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Comparaison d'onglet

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comparaison d'onglet

n°2171075
vallou94
Posté le 14-01-2013 à 13:49:15  profilanswer
 

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
mood
Publicité
Posté le 14-01-2013 à 13:49:15  profilanswer
 

n°2171287
vallou94
Posté le 15-01-2013 à 13:10:41  profilanswer
 

personne pour m'aiguiller ?

n°2171348
sh_kyra
Entre nous c'est Kyra
Posté le 15-01-2013 à 16:18:31  profilanswer
 

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
n°2171391
vallou94
Posté le 15-01-2013 à 21:20:38  profilanswer
 

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

n°2171394
vallou94
Posté le 15-01-2013 à 21:24:42  profilanswer
 

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.

n°2171432
pvclunacy
Posté le 16-01-2013 à 10:01:19  profilanswer
 

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
n°2171450
sh_kyra
Entre nous c'est Kyra
Posté le 16-01-2013 à 11:12:34  profilanswer
 

Ç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
n°2171502
vallou94
Posté le 16-01-2013 à 14:55:53  profilanswer
 

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

n°2171520
sh_kyra
Entre nous c'est Kyra
Posté le 16-01-2013 à 16:02:40  profilanswer
 

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
n°2171577
Marc L
Posté le 16-01-2013 à 21:42:10  profilanswer
 

 
               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 …
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Comparaison d'onglet

 

Sujets relatifs
comparaison dateComparaison avec drawLine ?!
Comparaison et calculs sur deux fichiers à la foisComparaison de couleur de cellules
Help comparaison de deux fichier perlVBA - Renommer onglet d'un classeur a l'aide d'une formule
[HTML] Ancre et onglet js[Resolu] probleme en C : comparaison de chaine de caractere
classeur excel / onglet excelcomparaison et copie de cellules excel avec macro
Plus de sujets relatifs à : Comparaison d'onglet


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR