COMPARER 2 colonnes et Copier l'ensemble des lignes
Bonjour a tous,
je suis à la recherche d'un VB capable de :
Comparer 2 colonne, (A et D ) par exemple,
Puis si ca match, copier les lignes dans :
un seconde feuille les colonnes AB CDEF.....
J'ai essayé mais le VB n'est pas évident, ca fait 8 h que je suis dessus
Je vous joint dans un fichier Excel:
Le premier classeur avec en rouge les données que je j'importe, et en bleue le fichier existant.
Les colonnes a comparer sont donc A et D
En vert dans la la seconde feuille le résultat souhaité.
Bonjour,
Une piste :
Sub Test()
Dim Fe1 As Worksheet
Dim Fe2 As Worksheet
Dim PlgA As Range
Dim PlgD As Range
Dim CelA As Range
Dim CelD As Range
Dim Lig As Long
Dim Col As Long
Set Fe1 = Worksheets("Feuil1")
Set Fe2 = Worksheets("Feuil2")
With Fe1
Set PlgA = .Range(.Cells(3, 1), .Cells(.Rows.Count, 1).End(xlUp))
Set PlgD = .Range(.Cells(3, 4), .Cells(.Rows.Count, 4).End(xlUp))
Col = .Cells(1, .Columns.Count).End(xlToLeft).Column
For Each CelA In PlgA
Set CelD = PlgD.Find(CelA.Value, , xlValues, xlWhole)
If Not CelD Is Nothing Then
Lig = Fe2.Cells(.Rows.Count, 1).End(xlUp).Row + 1
Fe2.Cells(Lig, 1).Value = CelA.Value
Fe2.Cells(Lig, 2).Value = CelA.Offset(, 1).Value
Fe2.Cells(Lig, 3).Value = CelD.Offset(, 1).Value
Fe2.Cells(Lig, 4).Value = CelD.Offset(, 2).Value
Fe2.Cells(Lig, 5).Value = CelD.Offset(, 3).Value
Fe2.Cells(Lig, 6).Value = CelD.Offset(, 4).Value
End If
Next CelA
End With
End Subha ok !
en fait tu crées genre une variable "Fe1" qui correspond a la feuille 1
Et tu appel cette variable par la suite c'est ca ?
mais le debut les DIM c'est quoi?
Pardon je suis vraiment un newbee mais je voudrai comprendre plutôt que faire copier coller bêtement.
Ps je test deja ca .
Merci
Le même code sans les variables objets Worksheets :
Sub Test()
Dim PlgA As Range
Dim PlgD As Range
Dim CelA As Range
Dim CelD As Range
Dim Lig As Long
Dim Col As Long
With Worksheets("Feuil1")
Set PlgA = .Range(.Cells(3, 1), .Cells(.Rows.Count, 1).End(xlUp))
Set PlgD = .Range(.Cells(3, 4), .Cells(.Rows.Count, 4).End(xlUp))
Col = .Cells(1, .Columns.Count).End(xlToLeft).Column
For Each CelA In PlgA
Set CelD = PlgD.Find(CelA.Value, , xlValues, xlWhole)
If Not CelD Is Nothing Then
Lig = Worksheets("Feuil2").Cells(.Rows.Count, 1).End(xlUp).Row + 1
Worksheets("Feuil2").Cells(Lig, 1).Value = CelA.Value
Worksheets("Feuil2").Cells(Lig, 2).Value = CelA.Offset(, 1).Value
Worksheets("Feuil2").Cells(Lig, 3).Value = CelD.Offset(, 1).Value
Worksheets("Feuil2").Cells(Lig, 4).Value = CelD.Offset(, 2).Value
Worksheets("Feuil2").Cells(Lig, 5).Value = CelD.Offset(, 3).Value
Worksheets("Feuil2").Cells(Lig, 6).Value = CelD.Offset(, 4).Value
End If
Next CelA
End With
End Suble gros avantage d'utiliser des variables est que si tu veux utiliser une autre feuille, tu as juste à modifier le nom à cet endroit en début de code, par exemple, si tu voudrais les résultats non pas en feuille "Feuil2" mais en feuille "Feuil4" cette ligne :
Set Fe2 = Worksheets("Feuil2")deviendrait :
Set Fe2 = Worksheets("Feuil4")et tu n'as pas à toucher dans le reste du code tandis que le code ci-dessus sans les variables, demande à ce que la modif soit faite dans toutes les lignes de code faisant référence à la feuille "Feuil2" (ici, 7 fois)
L'instruction Dim alloue un espace mémoire à la variable pour le stockage de sa valeur.
Les variables déclarées dans une procédure peuvent l'être à l'aide de l'instruction Dim (ce qui est le plus courant) et l'instruction Static.
Une bonne façon de t'informer, c'est de mettre le curseur dans une instruction Dim puis appuis sur F1 l'aide s'ouvre pour un peu de lecture !
Si en tête de module tu as l'instruction Option Explicit, tu n'auras pas le choix que de déclarer toutes tes variables ce qui évitera bon nombre d'erreurs !
Si tu as l'intention de te mettre au VBA, je ne saurais trop te conseiller de cocher la case "Déclaration des variables obligatoire" dans "Outils" --> "Options..." onglet "Editeur".
Super ca marche pas mal a premiere vu!
Je vais eesayer maintenant le caler avec mon tableau ( j'ai toujours 2 colonne au debut (les rouges) mais a coller j'en ai presque 50 ! (les bleue)
Je test tout seul comme grand et je reviens pour te donner mon retour.
Merci beaucoup , super reactivité , vraiment merci
Je test tout seul comme grand et je reviens pour te donner mon retour.
Ok, pas de problème !
Alors au debut je pensais qu'il fallait modifier la valeur D , puisque si j'essais de lire betment on dirait que tu demandais a Excel de regler la plage D de 4 colonnes
Set PlgD = .Range(.Cells(3, 4), .Cells(.Rows.Count, 4).End(xlUp))
Bon ca n'a pas marché
Donc j'ai modifier ( rajouter) les lignes inférieurs.
Sub Test()
Dim PlgA As Range
Dim PlgD As Range
Dim CelA As Range
Dim CelD As Range
Dim Lig As Long
Dim Col As Long
With Worksheets("Feuil1")
Set PlgA = .Range(.Cells(3, 1), .Cells(.Rows.Count, 1).End(xlUp))
Set PlgD = .Range(.Cells(3, 4), .Cells(.Rows.Count, 4).End(xlUp))
Col = .Cells(1, .Columns.Count).End(xlToLeft).Column
For Each CelA In PlgA
Set CelD = PlgD.Find(CelA.Value, , xlValues, xlWhole)
If Not CelD Is Nothing Then
Lig = Worksheets("Feuil2").Cells(.Rows.Count, 1).End(xlUp).Row + 1
Worksheets("Feuil2").Cells(Lig, 1).Value = CelA.Value
Worksheets("Feuil2").Cells(Lig, 2).Value = CelA.Offset(, 1).Value
Worksheets("Feuil2").Cells(Lig, 3).Value = CelD.Offset(, 1).Value
Worksheets("Feuil2").Cells(Lig, 4).Value = CelD.Offset(, 2).Value
Worksheets("Feuil2").Cells(Lig, 5).Value = CelD.Offset(, 3).Value
Worksheets("Feuil2").Cells(Lig, 6).Value = CelD.Offset(, 4).Value
Worksheets("Feuil2").Cells(Lig, 7).Value = CelD.Offset(, 5).Value
Worksheets("Feuil2").Cells(Lig, 8).Value = CelD.Offset(, 6).Value
Worksheets("Feuil2").Cells(Lig, 9).Value = CelD.Offset(, 7).Value
Worksheets("Feuil2").Cells(Lig, 10).Value = CelD.Offset(, 8).Value
Worksheets("Feuil2").Cells(Lig, 11).Value = CelD.Offset(, 9).Value
Worksheets("Feuil2").Cells(Lig, 12).Value = CelD.Offset(, 10).Value
Worksheets("Feuil2").Cells(Lig, 13).Value = CelD.Offset(, 11).Value
Worksheets("Feuil2").Cells(Lig, 14).Value = CelD.Offset(, 12).Value
End If
Next CelA
End With
End SubEt la ca marche ! Bon en fait je ne comprend pas vraiement pourquoi puisque c'est Lig qu'on incremenyt de 1
a et aussi il faut j'aille jusqu'a la colonne BV
Soit 26 +22 colonnes ..
Tu n'aurais pas une astuce du pour synthesier genre ("D" : "BV")
Alors au debut je pensais qu'il fallait modifier la valeur D , puisque si j'essais de lire betment on dirait que tu demandais a Excel de regler la plage D de 4 colonnes
Ici :
Set PlgD = .Range(.Cells(3, 4), .Cells(.Rows.Count, 4).End(xlUp))La plage est définie sur la colonne D (position ordinale 4) de la feuille "Feuil1" à partir de la ligne 3
puisque c'est sur la colonne D que s'effectue la recherche et il suffit alors d'appliquer des décalages de colonnes pour récupérer les valeurs positionnées sur la même ligne, ce que tu as fais !
Maintenant, je ne veux pas t'embrouiller mais le code ci-dessous est plus simple avec un Resize() car tu as le même résultat mais avec moins de lignes de code, l'affectation des valeurs se faisant en une seule fois :
Sub Test()
Dim Fe1 As Worksheet
Dim Fe2 As Worksheet
Dim PlgA As Range
Dim PlgD As Range
Dim CelA As Range
Dim CelD As Range
Dim Lig As Long
Dim Col As Long
Set Fe1 = Worksheets("Feuil1")
Set Fe2 = Worksheets("Feuil2")
With Fe1
Set PlgA = .Range(.Cells(3, 1), .Cells(.Rows.Count, 1).End(xlUp))
Set PlgD = .Range(.Cells(3, 4), .Cells(.Rows.Count, 4).End(xlUp))
Col = .Cells(1, .Columns.Count).End(xlToLeft).Column
For Each CelA In PlgA
Set CelD = PlgD.Find(CelA.Value, , xlValues, xlWhole)
If Not CelD Is Nothing Then
Lig = Fe2.Cells(.Rows.Count, 1).End(xlUp).Row + 1
Fe2.Cells(Lig, 1).Value = CelA.Value
Fe2.Cells(Lig, 2).Value = CelA.Offset(, 1).Value
Fe2.Cells(Lig, 3).Resize(, 12).Value = .Range(CelD.Offset(, 1), CelD.Offset(, 12)).Value 'remplace les multiples lignes d'affectation
End If
Next CelA
End With
End SubRemplaces :
Fe2.Cells(Lig, 3).Resize(, 12).Value = .Range(CelD.Offset(, 1), CelD.Offset(, 12)).Valuepar :
Fe2.Cells(Lig, 3).Resize(, 71).Value = .Range(CelD.Offset(, 1), CelD.Offset(, 71)).Valueou seulement 12 par 71 !
Super Cette partie fonctionne,
Mais en fait mon premier tableau ne fonctionne pas réellement comme je le souhaite.
Celui qui sert a comparer et extraire les differences.
En fait il compare est isole les commun.
le plus simple que je fasse un nouveau topic
Encore merci