Comparer et copier lignes manquantes

Bonjour à toutes et tous,

Je suis en train d'apprendre le VBA dans le cadre de mon travail, et déjà il me change la vie (même si je débute).

Jusqu'à maintenant, j'ai réussi à bidouiller des trucs qui fonctionnent, en prenant des bouts de code à droite à gauche et en les adaptant.

Mais là, je rencontre un problème sur lequel je m'arrache un peu les cheveux. Vous allez voir, c'est tout con...enfin, sûrement !

J'ai un classeur excel, composé de 2 onglets, Synthèse et Isc

Grosso modo, c'est un fichier client, et les 2 onglets présentent la même construction. La colonne A de synhèse contient les mêmes données que la colonne A de Isc, etc...

La seule différence, c'est que l'onglet Isc comprend des lignes qui ne sont pas présentes dans l'onglet Synthèse

Or, par un petit tour de passe passe (ou de VBA, ça mi'rait aussi), je souhaiterais au final que toutes les lignes de Isc absentes de Synthèse y soient copiées à la suite.

Alors je sais le faire manuellement, avec des RechercheV, filtre et copier/coller, mais si je pouvais automatiser tout cela, ça m'aiderait grandement.

La ligne 1 des 2 onglets ne change jamais

Le nombre de lignes des 2 onglets, lui, fluctue.

Je vous poste un petit exemple juste pour vous faire une idée.

Je vous remercie par avance

VBAment !

Kevin

21demande-vba.xlsx (15.51 Ko)

Bonjour

Question bête : si la comparaison correspond à toutes les colonnes des lignes, donc à la fin tu aurais 2 tableaux identiques.

Si oui autant dupliquer ISC

Ah ah ah je m'attendais à ça

Non non, il y a des données dans Isc qui ne sont pas notées dans l'exemple qui me permettent de faire des tris par la suite

Re

Non non, il y a des données dans Isc qui ne sont pas notées dans l'exemple qui me permettent de faire des tris par la suite

Tu veux dire qu'il y a des colonnes en plus ou bien ...???

Soit précis sur la comparaison...

L'idée de 78chris reste bonne :

Dupliquer le tableau, puis supprimer les données inutiles.

Bonjour,

Code OF et Commande sont-ils uniques dans les tableaux ?

Cdlt.

Un premier essai (Power Query, sans VBA) :

55demande-vba.xlsx (32.54 Ko)

Alors alors, je n'ai pas été très très clair

Dans leur structure, les 2 tableaux sont les mêmes

L'onglet Isc est "censé" être le même que le synthèse, sauf que ce n'est pas le cas

C'est un fichier Excel généré par notre ERP, et pour diverses raisons, il sucre certaines lignes qui devraient être présentes.

De plus, il contient des lignes qui devraient être dans synthèse mais qui n'y sont pas car il manque des données (que je rajoute par la suite, par exemple la matière, etc)

Donc en gros, je me retrouve avec 2 tableaux qui ne devraient être qu'un seul. Ça va, je vous ai pas perdu ?

Jean Éric, les OF sont uniques dans chaque tableau. Par contre, il peut y avoir plusieurs lignes avec la même commande. Merci pour ton exemple, par contre je ne pourrai le regarder que demain, pas de pc dispo maintenant, je vous réponds depuis mon téléphone.

78 Chris, il y a bien d'autres colonnes, identiques aux 2 tableaux, que je n'ai pas mis volontairement car il y a des données sensibles (nom et adresse du contact, numéro de téléphone, SIRET, banque, etc...).

Merci à tous pour vos réponses

Bien le bonjour,

Un premier essai (Power Query, sans VBA) :

Alors j'ai ouvert ton fichier, ça semble correct, seulement je ne vois pas le cheminement

Power Query est un complément Excel si j'ai bien compris ?

Y a-t-il des manip à faire ?

Car le but final est d'ouvrir mon fichier, et d'exécuter la macro que je souhaite ici à l'ouverture du fichier, d'où la demande en VBA.

Peux tu (ou quelqu'un d'autre, bien sûr) m'éclairer ?

Merci d'avance

Bonjour à tous

Depuis la version 2016, PowerQuery est intégré.

Voir l'onglet Données, Afficher les requêtes...

Ah oui, en effet, merci.

Bon par contre, ça fait des manip en plus il me semble.

Sinon je viens de trouver un truc qui fonctionne, à l'aide de boucles While, For et If

Je ne sais pas si c'est la meilleure solution, mais ça marche !

Merci à vous d'avoir répondu

Bonsoir à tous,

Une façon de faire en VBA :

Option Explicit
Sub test()
Dim a, i As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets("Isc").Range("a1").CurrentRegion.Value
    For i = 1 To UBound(a, 1)
        dico(a(i, 1)) = Application.Index(a, i, 0)
    Next
    a = Sheets("Synthèse").Range("a1").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        If dico.exists(a(i, 1)) Then dico.Remove a(i, 1)
    Next
    If dico.Count > 1 Then
        With Sheets(3).Cells(1)
            .Resize(dico.Count, UBound(Application.Index(dico.items, 0, 0), 2)).Value = _
            Application.Index(dico.items, 0, 0)
        End With
    End If
    Set dico = Nothing
End Sub

klin89

RE

Bon par contre, ça fait des manip en plus il me semble.

Créer un code VBA ou créer une requête, dans les deux cas il y a une manip.

De façon générale les requêtes sont ce qui se fait de mieux pour exploiter les bases de données...

Sur de gros volumes c'est souvent plus rapide que VBA, surtout si on fait un code à base de boucles et non un code optimisé à base de tableaux comme le propose Klin89.

Bien le bonjour,

Merci à tous pour vos interventions, l'aide et les liens. Je vais regarder ça de plus près.

Mon problème est donc résolu, et de plusieurs manières différentes. Et j'ai de la lecture avec ça ! Que demande le peuple ?

Un grand merci, sujet clos !

re KevinWzK,

Le code réajusté pour éviter un bug :

Option Explicit
Sub test()
Dim a, i As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets("Isc").Range("a1").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        dico(a(i, 1)) = Application.Index(a, i, 0)
    Next
    With Sheets("Synthèse")
        a = .Range("a1").CurrentRegion.Value
        For i = 2 To UBound(a, 1)
            If dico.exists(a(i, 1)) Then dico.Remove a(i, 1)
        Next
        If dico.Count > 0 Then
            With .Range("a" & .Rows.Count).End(xlUp)(2)
                With .Resize(dico.Count)
                .NumberFormat = "@"
                .Offset(, 9).NumberFormat = "@"
                End With
                If dico.Count = 1 Then
                    .Resize(1, UBound(Application.Index(dico.items, 0, 0))).Value = _
                    Application.Index(dico.items, 0, 0)
                Else
                    .Resize(dico.Count, UBound(Application.Index(dico.items, 0, 0), 2)).Value = _
                    Application.Index(dico.items, 0, 0)
                End If
            End With
        End If
    End With
    Set dico = Nothing
End Sub

klin89

Rechercher des sujets similaires à "comparer copier lignes manquantes"