Code VBA - Correspondance de 2 listes et copie des bonnes lignes

MarcA

XLDnaute Nouveau
Bonjour, cela fait une semaine que je bloque sur une macro.
Je suis plutôt débutant sur VBA.
J'aurai besoin d'un coup de pouce pour débloquer.

Ce que je veux faire :
1. Sélectionner la colonne A de la feuille "Copier liste ici" (liste de codes clients)
2. Trouver les codes dans la colonne BV de la feuille "Sheet3" (liste des commandes avec ou sans code)
3. Copier les lignes de la feuille "Sheet3" dont la colonne BV contient un code de la colonne A de la feuille "Copier liste ici" dans la feuille "Sheet4".

J'arrive à trouver, mais je bloque sur le copier. Je n'arrive pas à faire en sorte que la ligne de la cellule trouvée soit copiée. La macro me copie à chaque fois la première ligne de la feuille "Sheet3".

Voici le code que j'utilise (et qui ne fonctionne totalement pas pour le moment):

Dim ValeurCellule
Dim i
For i = 1 To 8000

Worksheets("Copier liste ici").Activate
Set ValeurCellule = Range("A" & i)
ValeurCellule.Select


Worksheets("Sheet3").Activate
Columns("BV").Select


On Error Resume Next
If Selection.Find(ValeurCellule, LookIn:=xlFormulas, LookAt:=xlPart).Activate = ValeurCellule Then
Rows(ActiveCell.Row).Select
Selection.Copy
Else:
Worksheets("Sheet4").Activate
Rows(i & ":" & i).Select
ActiveSheet.Paste
End If
On Error GoTo 0


Next i
Application.CutCopyMode = False

Worksheets("Sheet4").Activate
Application.CutCopyMode = False

J'arrive à faire le tri ensuite, donc pas de problème.
Ah oui, pour moi la fin de mon code (après Next i) ne sert à rien, mais je n'ai pas essayé de le supprimé. Si ça ne sert vraiment à rien, dîtes-le moi !

Merci d'avance de votre aide !
 

pijaku

XLDnaute Occasionnel
Re : Code VBA - Correspondance de 2 listes et copie des bonnes lignes

Bonjour,

En utilisant un Objet Dictionary, et sa méthode Exists, ça devrait être plus rapide.

Regarde ICI si tu trouve ton bonheur, sinon n'hésite pas à relancer ce fil pour de plus amples explications...
 

pijaku

XLDnaute Occasionnel
Re : Code VBA - Correspondance de 2 listes et copie des bonnes lignes

Exemple plus ou moins proche de ce que tu cherches à faire :
Exemple NON TESTE!!!
Code:
Sub MarcA()
Dim Dico As Object, TablA(), TablBV(), i As Long

'On remplit le dictionary des éléments contenus colonne A Sheets("Copier liste ici")
  Worksheets("Copier liste ici").Activate
  Set Dico = CreateObject("Scripting.Dictionary")
  TablA = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row) 
  For i = LBound(TablA) To UBound(TablA)
    Dico(TablA(i, 1)) = ""
  Next i
  Worksheets("Sheet3").Activate
'On remplit le tableau avec les données contenues dans BV
  TablBV = Range("BV1:BV" & Range("BV" & Rows.Count).End(xlUp).Row)
'on boucle sur ce tableau
  For i = LBound(TablBV) To UBound(TablBV)
'si l'élément du tableau existe dans le dictionary alors on copie-colle
    If Dico.exists(TablBV(i, 1)) Then Worksheets("Sheet3").Rows(i).Copy Worksheets("Sheet4").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
  Next i
End Sub
 

MarcA

XLDnaute Nouveau
Re : Code VBA - Correspondance de 2 listes et copie des bonnes lignes

Bonjour,

Merci de cette réponse rapide. En effet je n'ai pas pensé à créé un Dictionnaire - je ne pensais pas que cela pourrait m'aider.
Je ne sais pas créer de dictionnaire à partir d'une colonne. Par contre, pour la suite (mettre en valeur les doublons, trier et copier, ça je pourrai le faire).

De plus, la partie recherche ne semble pas poser de problème (même si elle est longue, c'est vrai), c'est pour recopier les lignes que ma macro bloque...
 

MarcA

XLDnaute Nouveau
Re : Code VBA - Correspondance de 2 listes et copie des bonnes lignes

Bonjour,

Je viens de tester le code. Ça fonctionne. Après, la question est de savoir s'il a réussi à trouver tous les codes ou s'il en a zappé. Je n'arrive pas à voir si la variable i est limitée par le nombre de codes de la colonne A ou de la colonne BV. Il serait bon que cette variable soit limitée par le nombre de lignes de la colonne BV, comment je peux changer ça ?
 

pijaku

XLDnaute Occasionnel
Re : Code VBA - Correspondance de 2 listes et copie des bonnes lignes

Bonjour,

Je t'ai fait le code, à toi à vérifier son efficacité......

Tu dis :
Après, la question est de savoir s'il a réussi à trouver tous les codes ou s'il en a zappé

Pour vérifier :
1- Copie la colonne A feuille "Copier liste ici" et va la coller n'importe ou dans ta feuille "Sheet4" (supposons en colonne BZ)
2- Dans la colonne voisine (CA dans l'exemple), en CA1 écris la formule : =NB.SI(BV:BV;BZ1)
3- Etends cette formule vers le bas.
4- si autre chose qu'un 1 apparait c'est qu'il y a erreur...
 

Discussions similaires

Réponses
4
Affichages
351

Statistiques des forums

Discussions
314 011
Messages
2 104 528
Membres
109 063
dernier inscrit
rahimmcsaw