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 Sub

ha 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 Sub

le 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 Sub

Et 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 Sub

Remplaces :

Fe2.Cells(Lig, 3).Resize(, 12).Value = .Range(CelD.Offset(, 1), CelD.Offset(, 12)).Value

par :

Fe2.Cells(Lig, 3).Resize(, 71).Value = .Range(CelD.Offset(, 1), CelD.Offset(, 71)).Value

ou 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

Rechercher des sujets similaires à "comparer colonnes copier ensemble lignes"