{Résolu}Comparer deux colonnes dans deux fichiers différents

{Résolu}Comparer deux colonnes dans deux fichiers différents - VB/VBA/VBS - Programmation

Marsh Posté le 30-05-2006 à 09:56:35    

Bonjour à tous, jusque là j'ai pu me débrouiller grâce à ce super forum mais maintenant j'ai réellement besoin de vous.
 
Je dois créer un programme qui me permettrait de retrouver le contenu d'une cellule d'un fichier, dans un autre fichier. C'est à dire parcourir toutes les lignes d'une colonne du premier fichier pour vérifier si une ou plusieurs de ces cellules se retrouvent dans le deuxième fichier. Si je trouve un doublons, je mets la lignes en rouge ou j'écris dans une autre colonne "Oui".  
Pas de problèmes me diriez-vous mais mon problème est que mon premier fichier (que l'on appellera "Answer" ) contient 80 lignes et que mon deuxième ("Ttlcount" ) fait plus de 25500 lignes et mon programme devra tourner sur des fichier bien plus gros encore. J'ai quand même voulu essayer avec deux boucles (voir le code plus bas): dans une je prenais toutes les valeurs les une après les autres dans "Answer" et dans l'autre je les comparais dans toutes les cellules de la colonne du deuxième fichier. Mais le programme ne semble pas s'arretter. Pourtant j'ai fait plusieurs tests et il ne me semble pas que celà vienne d'une boucle infinie mais je peux me tromper.
Alors aujourd'hui je vous demande votre aide, s'il vous plaît, pour trouver un algo moins lourd pour la machine et adabtable à plusieurs fichiers (avec le même nom de feuille et la même structure mais pas les même donnée).
 
Si vous pouviez me donner une astuce pour créer une "Statusbar" pour montrer l'avancement de la recherche à l'utilisateur aussi ça serait sympa (j'ai pas fait d'userform par contre).  Merci!
 

Citation :


 
 If noopenError = "True" Or noopenError2 = "True" Then
    Dim z As Integer
    Dim x As Integer
    Dim i As Integer, a As Integer
    a = 1
    i = 1
    w = Workbooks(fileName).Sheets(1).UsedRange.Rows.Count 'nb de lignes dans le Ttlcount
    z = Workbooks(fileName2).Sheets("Rejected" ).UsedRange.Rows.Count 'nb de lignes ds le Answer
     
    For a = 2 To z 'Balaie toutes les lignes du Answer
      For i = 2 To w ' Balaie toutes les lignes du Ttlcount
        If (Workbooks(fileName2).Sheets("Rejected" ).Range("R" & a) = Workbooks(fileName).Sheets(1).Range("R" & i)) Then
          Workbooks(fileName2).Sheets("Rejected" ).Range("Z" & a) = "OUI"
           i = w
        Else
          Workbooks(fileName2).Sheets("Rejected" ).Range("Z" & a) = "NON"
        End If
      Next i
   Next a
 End If
 


Message édité par Zephyron le 31-05-2006 à 14:22:58
Reply

Marsh Posté le 30-05-2006 à 09:56:35   

Reply

Marsh Posté le 30-05-2006 à 10:32:59    

bah je pense que la meilleur solution est dutiliser la fonction find.
C comme si tu utiliser edition,rechercher dans excel, donc c tres rapide.
Tu aura juste a faire une boucle de 80 ligne de ton premier fichier.
 
voila ma fonction que l'utilise :
 
Sub rechcase(chaine As String)
On Error Resume Next
Set MotTrouvé = Cells.Find(What:=chaine, LookAt:=xlPart)
If Not MotTrouvé Is Nothing Then
MotTrouvé.Select
ActiveCell.Select

 

End If
End Sub

 


 
n'oublie pa d'ouvrir le bon classeur avant de lancer la fonction et fait tes operation "oui" "non" dans le if

Reply

Marsh Posté le 30-05-2006 à 11:39:34    

Salut Bipbip et merci pour ton aide.  
J'ai essayé ton code et il marche très bien pour une valeur, mais pour une boucle ça fonctionne pas totalement comme je voudrais :  
 

Citation :


    For a = 2 To z
    chaine = CStr(Workbooks(fileName2).Sheets("Rejected" ).Range("R" & a).Value)
    Workbooks(fileName).Sheets(1).Activate
      On Error Resume Next
      Set MotTrouvé = Cells.Find(What:=chaine, LookAt:=xlPart)
      If Not MotTrouvé Is Nothing Then
        nb = nb + 1
        MotTrouvé.Select
        ActiveCell.Select
        With Selection.Interior
        .ColorIndex = 3
        .Pattern = xlSolid
        End With
      End If
     Next a
     message = "Il y a " & nb & "doublons dans le fichier"
     MsgBox message


 
Ca me met bien ce que je veux en rouge mais le "nb" n'est pas le nombre attendu, au lieu de me mettre le nombre de doublons trouvé, il met le nombre de lignes parcourues.
Comment elle fonctionne exactement cette garde? Si mon "mottrouvé" n'est pas nul, alors j'execute le code, c'est ça? Et comment faire justement si il ne trouve pas le doublons, je dois utiliser un Else?
 
PS : T'aurais pas une astuce pour la statusbar aussi ?  :p

Reply

Marsh Posté le 30-05-2006 à 14:51:12    

bon deja moi je debute en vba donc je suis pas un pro et ce code est un code que j'ai repris.
pour ton nb, je peut pa t'aider ca devré etre le bon nombre pourtant et oui il te faut un else pour le cas ou il trouve rien(si ta envi de faire quelquechose dans ce cas)
 
PS:euh...c koi la status bar?....bref aucune idée pour la derniere question aussi

Reply

Marsh Posté le 31-05-2006 à 09:39:37    

C'est bon j'ai enfin fini mon programme. Et au final ça me donne ça :
 

Citation :


   ' To R2 to the end of file2, I search if my "Answer" id has a copy in the "Ttlcount". / De R2 jusqu'à la fin du fichier, je cherche si mon id "Answer" a une copie dans le "Ttlcount".
   For a = 2 To z
     id = CStr(Workbooks(fileName2).Sheets("Rejected" ).Range("R" & a).Value)
 
     If id <> "" Then
       Workbooks(fileName).Sheets(1).Activate
       On Error Resume Next
       Set wordFound = Cells.Find(What:=id, LookAt:=xlPart)
' If I find a copy, My copy number grow, I color the actual id row in red and I write "Yes" in column "Z". / Si je trouve une copie, mon nombre de copie augmente, je colorie la ligne du id actuel en rouge et j'écris "Yes" dans la colonne "Z".
         If Not wordFound Is Nothing Then
           wordFound.Select
           ActiveCell.Select 'I color the copy too. / Je colorie la copie également.
           With Selection.Interior
             .Color = RGB(255, 0, 0)
             .Pattern = xlSolid
           End With
           Workbooks(fileName2).Sheets("Rejected" ).Range("Z" & a) = "Yes"
           Workbooks(fileName2).Sheets("Rejected" ).Range("Z" & a).EntireRow.Interior.Color = RGB(255, 50, 50)
           Workbooks(fileName2).Sheets("Rejected" ).Range("Y2" ).EntireColumn.Interior.Color = RGB(0, 0, 255)
           nb = nb + 1
' Else if I find nothing, I color the actual id row in green and I write "No" in column "Z". / Sinon si je trouve rien, Je colorie la ligne du id actuel en vert et j'écris "No" dans la colonne "Z".
        Else
          Workbooks(fileName2).Sheets("Rejected" ).Range("Z" & a) = "No"
          Workbooks(fileName2).Sheets("Rejected" ).Range("Z" & a).EntireRow.Interior.Color = RGB(0, 255, 0)
        End If
' If my id = "", then I color the "Z" column in gray. / Si mon id = "", alors je colorie la colonne "Z" en gris.
     Else
       Workbooks(fileName2).Sheets("Rejected" ).Range("Z" & a).Interior.Color = RGB(100, 100, 100)
     End If
   
   Next a
 
   message = "There are " & nb & " copy. / Il y a " & nb & " doublons dans le fichier"
   MsgBox message, vbDefaultButton1
 


 
Merci beaucoup BipBip pour ton aide, j'aurai pas trouvé cette methode "Find" sans toi.

Reply

Sujets relatifs:

Leave a Replay

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