Fusion de 2 colonnes situées dans 2 classeurs différents

Bonjour à tous,

Je cherche à effectuer une fusion en VBA) de 2 colonnes situées dans 2 classeurs différents (colonne C). Le tout dans une colonne (colonne A) d'un troisième classeur (déjà créé). Les deux colonnes sources possèdent des noms en commun et d'autres non. La troisième colonne doit donc reprendre les éléments qui ne sont pas en communs et ceux qui le sont mais sans doublons du coup.

J'ai joints les 3 fichiers ( les 2 fichiers sources et le fichier résultat).

J'ai vraiment besoin de votre aide et vous remercie par avance.

9source1.zip (17.86 Ko)
5source2.zip (40.30 Ko)
4resultat.xlsx (12.82 Ko)

bonjour

la méthode actuelle dans Excel pour aller chercher des données (venant d'autres Excel ou d'autres sources diverses et variées) c'est le menu Données "récupérer des données"

ensuite, tu peux "fusionner" et faire toutes sortes d'autres traitements (c'est Power Pivot qui se cache là-derrière)

ne surtout pas utiliser VBA totalement dépassé.

Bonjour,

je vous remercie pour votre réponse.

J'ai absolument besoin de faire la manip en VBA car je souhaite que ce soit automatisé (que la fusion se fasse à l'ouverture du fichier par exemple). Etant donné que c'est dans un cadre professionnel, on souhaite le faire en VBA.

Je vous remercie,

Bonjour,

Autrement dit tu veux une liste d'éléments uniques de tes deux colonnes ?

Pourquoi veux-tu utiliser VBA ? Tu ne vas pas faire la même opération à répétition ?

Copier tes deux colonnes et les coller dans une même 3e, puis éliminer les doublons, sera plus vite fait manuellement !

Cordialement.

Bonjour,

Merci pour ta réponse.

Justement je la fais à répétition (environ 30 fois par semaine). Du coup le faire manuellement est moins intéressant...

Merci

Et tu recommences à zéro chaque fois ?

Car la procédure que tu demandes effacera la liste précédente. A quoi est destinée ta liste ?

Je t'explique: l'un des 2 fichiers sources contient des données de l'année n-1 (ce qu'il fait il est figé). L'autre fichier source contient des données de l'années N. Donc il y a des données en plus à chaque fois.

Moi j'ai besoin d'avoir un fichier synthèse (en l’occurrence le fichier résultat en pièce jointe) qui va récupérer la colonne C du fichier 1 et la colonne C du fichier 2 et les fusionner sans doublons dans la colonne A du fichier résultat.

J'espère que ça te parait plus claire

Alors là non, cela ne me paraît pas plus clair !

Parce que chaque colonne contient des noms répétés plusieurs fois, or tu parles d'éliminer les doublons entre les deux fichiers ! Mais si on élimine les doublons, on élimine aussi ceux d'un même fichier, c'est à dire qu'on produit une liste de noms à un seul exemplaire dans la liste !

Cela peut s'appeler aussi extraction éléments uniques, mais je ne vois pas de synthèse là-dedans, et par conséquent je n'ai aucune certitude quant à ton objectif.

On est bien d'accord que sur les fichiers déjà il y a des doublons. C'est pour ça que je veux une occurance par donnée dans le fichier résultat. cela signifie qu'il y a une élimination de doublons et entre les deux fichiers et également dans chacun des 2 fichiers.

Je te donne un exemple:

Si dans le fichier 1 j'ai: Pierre, Paul, Jacques, Paul, Paul, Marie

Et dans fichier 2 j'ai: Alain, Pierre, Rémi, Mathieu , Pierre

Dans le fichier résultat j'aurais: Pierre, Paul Jacques, Marie, Alain, Rémi, Mathieu

--> Élimination des doublons dans fichier 1 et dans fichier 2 puis entre les 2 fichiers.

Voila

re

salut MFerrand

zm21,

pas besoin de VBA pour automatiser

par exemple écrire =A1+A2 est déjà un automatisme, et sans VBA !

le menu Données "récupérer" est aussi un automatisme, que visiblement tu ne connais pas, et tes chefs non plus.

c'est pourtant un menu standard d'Excel.

il FAUT apprendre cette fonction

Bon ! Quelques infos supplémentaires sont alors utiles :

  • les classeurs source ont-ils toujours le même nom, et sont-ils dans le même dossier que ton classeur "résultat" ?
  • l'opération sera déclenchée à partir de ce dernier classeur, et elle conduira à l'effacement de l'ancienne liste : à confirmer ?

Et je te ferai ça à mon retour (je dois sortir)...

jmd : ta conception de l'automatisme me désole ! Tu lui proposes de faire à chaque fois plusieurs manipulations... L'automatisme pur, c'est ne rien avoir à faire, et dans le cas où il demeure nécessaire qu'une opération soit déclenchée par l'utilisateur (et ce n'est déjà plus de l'automatisme pur !), le maximum à faire doit se limiter à l'appui sur un bouton ou équivalent !

Sur 2010 je ne vois pas de menu "Récupérer", et je me demande en quoi il consiste, une nouveauté de 2013 ?

Merci MFerrand pour ta réponse:

Voici les réponses à tes questions:

  • Les 2 fichiers sources ont toujours le même nom et sont dans le même dossier.
  • Le fichier résultat n'est pas avec eux dans le même dossier (si ça nécessite qu'il soit avec les 2 fichiers dans le même répertoire je le fais mais idéalement je préfère qu'il soit dans un autre chemin).
  • La macro sera bien sûr dans le fichier résultat et supprimera à chaque fois la liste résultante (ou plutôt l'écrasera et la remplacera par la nouvelle liste).
  • Les 2 fichiers sources resteront eux intactes et la macro ne devra pas les supprimer ni supprimer leurs contenus.

Je te remercie encore une fois

re

MFerrand

https://support.office.com/fr-fr/article/d%C3%A9pannage-de-power-query-2546eaa8-9893-4574-9ef9-afacb9b0b495

il y a quelques différences mineures selon la version d'Excel

concernant l'automatisation, il suffit d'un clic pour mettre à jour la requête. Comme tu le souhaites.

connais-tu PQuery ?

tu es très fort en codage, tu deviendrais vite un expert en langage W (celui de PQ), soit pour travailler dans Excel, soit dans Power Pivot ou encore dans Power BI (le top).

bon travail

amitiés à tous

Désolé pour le délai, il fallait que je me ravitaille et j'ai été rattrapé par l'heure du repas avant d'avoir bouclé avec tests...

Sub MajNoms()
    Dim d As Object, cc, fs, i&, f%, chD$
    chD = ThisWorkbook.Path & "\"
    fs = Array("source1.xlsx", "source2.xlsx")
    Set d = CreateObject("Scripting.Dictionary")
    Application.ScreenUpdating = False
    For f = 0 To 1
        On Error GoTo OuvrirFichier
        cc = Workbooks(fs(f)).Worksheets(1).Range("A1").CurrentRegion _
         .Offset(, 2).Resize(, 1)
        On Error GoTo 0
        For i = 2 To UBound(cc)
            d(cc(i, 1)) = ""
        Next i
        Workbooks(fs(f)).Close False
    Next f
    cc = d.keys
    With ThisWorkbook.Worksheets(1)
        .Range("A1").CurrentRegion.Offset(1).ClearContents
        .Range("A2").Resize(UBound(cc)).Value = WorksheetFunction.Transpose(cc)
    End With
    Exit Sub
OuvrirFichier:
    With Workbooks.Open(chD & fs(f)).Worksheets(1)
        cc = .Range("A1").CurrentRegion.Offset(, 2).Resize(, 1)
    End With
    Resume Next
End Sub

La procédure fonctionnera, que les fichiers source soient ouverts ou fermés.

L'adaptation à faire ne concerne que les deux premières lignes ci-dessous :

    chD = ThisWorkbook.Path & "\"
    fs = Array("source1.xlsx", "source2.xlsx")

La première ligne est le chemin des fichiers source, défini ici comme le même que celui du fichier résultat, à remplacer par le chemin effectif (chaîne à mettre entre guillemets et faire terminer par un antislash \).

Le seconde forme un tableau avec les noms de fichiers : les remplacer par les véritables noms.

Pour tester la procédure, tu peux, avant de faire les modifications, placer les 3 fichiers joints dans un même dossier et cliquer sur le bouton dans résultat.

Cordialement.

6zm21.zip (71.14 Ko)

@jmd

J'admets tout à fait que si l'on peut déclencher une requête susceptible de réaliser l'opération en totalité, cela remplira la fonction.

Je prendrai le temps de regarder ça lorsque j'aurai installé 2016 sur mon nouvel ordi qui traîne depuis 1 an et demi (car je n'ai pas voulu trouver le temps de le prendre en mains, pas mal de trucs ne me plaisent pas trop dans Win10...), mais je vais bien finir par le faire un jour ! Cela prendra tout de même un certain temps tant que ma machine actuelle ne me lâche pas !

Ceci dit le transfert des données par VBA, en utilisant l'outil Dictionnnaire qui opère simultanément un filtrage sans doublons, demeure très satisfaisant : on est sur un temps d'exécution inférieur à 0,5 s (0,35 à 0,38 avec les fichiers modèles, avec 2 ouvertures de fichiers).

Bonjour MFerrand,

Je te remercie énormément pour ton aide. j'ai fait les tests sur les fichiers joints il ne me reste plus qu'à l'appliquer sur mes fichiers en question.

Merci encore,

Bonne continuation.

Rechercher des sujets similaires à "fusion colonnes situees classeurs differents"