IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Matching de deux feuilles excel différentes dans une troisième


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Employé
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Par défaut Matching de deux feuilles excel différentes dans une troisième
    Bonjour à tous,

    Je recherche depuis plusieurs jours une solution pour effectuer un matching entre deux tableaux excel. Je trouve des choses approchantes mais n’arrive jamais à adapter le code à ma convenance. J’ai vu tellement de codes que c’est maintenant le fouillis dans ma tête.

    Alors je m’explique :
    J’ai des données extraites de deux systèmes différents placées dans la feuille 1 et la feuille 2 d’un classeur excel. En colonne A de chaque feuille, on a des références communes aux deux systèmes nous permettant de faire le matching.
    Je souhaiterais dans une feuille 3 mettre les données des feuilles 1 et 2 côte à côte en faisant correspondre les lignes pour lesquelles les références de la colonne A sont identiques.
    Pour les lignes absentes de l’un des deux tableaux, il faudrait qu’elles soient placées à la fin avec en face le texte « non trouvé ».

    Par exemple:

    Feuille1 / Feuille2
    Ref nom type / Ref nom2
    AA Pierre G / AA jean
    BB Jacques L / NON TROUVE
    NON TROUVE / FF Pascal

    C’est difficile de l’expliquer en faisant des phrases !
    Merci d’avance pour votre aide !

    Edit:
    J'ai trouvé ici quelque chose d'intéressant.

    J'ai voulu adapter le code à mon cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub testmatching()
    Dim FL1 As Worksheet 'Feuille 1
    Dim FL2 As Worksheet 'Feuille 2
    Dim FL3 As Worksheet 'Feuille 2
    Dim c As Range, DerLig3 As Long
    Dim Tablo As Variant, Derlig As Long, NoLig As Long
       Application.ScreenUpdating = False
    'Instanciation des feuilles de calculs concernées (pour simplifier le code à venir)
         Set FL1 = Worksheets("Extract external")
         Set FL2 = Worksheets("Data syst")
         Set FL3 = Worksheets("Matching")
    'Recherche de la dernière ligne de la plage de données feuil1
         Derlig = Split(FL1.UsedRange.Address, "$")(4)
    'Création du tableau
         Tablo = FL1.Range("A1:A" & Derlig).Value
    'Parcours du tableau (pris feuil1) et recherche de la donnée feuil2
         With FL2.Range("A2:A" & Split(FL2.UsedRange.Address, "$")(4))
             For NoLig = 2 To UBound(Tablo) 'ou bien to DerLig (revient au même)
                  Set c = .Find(Tablo(NoLig, 1))
                  If Not c Is Nothing Then
    'la donnée a été trouvée, on la copie dans feuil1 après la dernière ligne de la colonne D
                        DerLig3 = FL1.Range("D" & Rows.Count).End(xlUp).Row
                        FL2.Rows(c.Row).Copy FL1.Range("D" & DerLig3 + 1)
                  End If
             Next
         End With
    End Sub
    Le problème est que je voulais coller les données de la feuille 2 à côté des données correspondantes dans la feuille 1.
    Mais j'ai un message d'erreur, il bute sur la dernière ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FL2.Rows(c.Row).Copy FL1.Range("D" & DerLig3 + 1)
    "Run-time error '1004': The information connot be pasted because the Copy area and teh paste area are not the same size and shape..."

    Je ne comprends pas, il n'y a pas de cellule fusionnées ou quoi, quelque chose m'échappe.

    De plus je n'ai pas de solution pour faire apparaitre les données de la feuille 2 non présente dans la feuille 1, tout à la fin du tableau.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ton problème est clair comme de l'eau de roche. En plus le message d'erreur te l'explique bien.
    Tu copies une ligne entière (soit 16384 cellules depuis la version 2007 ou 256 avant)) et tu l'envoies vers la cellule D soit 4 colonnes après.
    Essaye de faire cela manuellement, tu auras également un problème.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Candidat au Club
    Homme Profil pro
    Employé
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Par défaut
    Merci Philippe pour ton aide.

    J'ai modifié la dernière ligne de code ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FL2.Range(c.Offset(0, 0), c.Offset(0, 5)).Copy FL1.Range("D" & DerLig3 + 1)
    Mais au final ça ne fait pas ce que je souhaite. Les données de "Data syst" sont recopiées dans "Extract external" dans le même ordre.
    Si dans "Extract external" il y a une donnée qui n'est pas dans "Data syst", la ligne n'est pas sautée et un décalage se forme.
    Je voudrais mettre face à face les données identiques et laisser un blanc pour les données non présentes dans l'une ou l'autre feuille.

    Re-Bonjour,

    J'ai essayé d'adapter un autre code à mon cas.
    Les données sont mises face à face dans une troisième feuille "Matching".
    Il y a un blanc quand une donnée de "Data syst" n'est pas présente dans "Extract external" mais l'inverse ne se produit pas.
    Les données de la feuille "Extract external" non présentes dans "Data syst" sont ignorées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Sub testMATCHINGESPOIR()
     Dim i&, j&, Résultat&, Diff, test, PlageExternal, PlageDataSyst, External, DataSyst
     
     Sheets("Extract external").Activate
     Set PlageExternal = ActiveWorkbook.Sheets("Extract external").Range("A2", Range("A" & Rows.Count).End(xlUp))
     Sheets("Data syst").Activate
     Set PlageDataSyst = ActiveWorkbook.Sheets("Data syst").Range("A2", Range("A" & Rows.Count).End(xlUp))
     
     Sheets("Extract external").Activate
     External = ActiveWorkbook.Sheets("Extract external").Range("A2", Range("A" & Rows.Count).End(xlUp)).Value
     Sheets("Data syst").Activate
     DataSyst = ActiveWorkbook.Sheets("Data syst").Range("A2", Range("A" & Rows.Count).End(xlUp)).Value
     Diff = Application.Evaluate("COUNTA(" & PlageExternal.Address _
     & ")- SUM(COUNTIF(" & PlageExternal.Address & "," & PlageDataSyst.Address & "))")
     
         For i = 1 To PlageDataSyst.Rows.Count
             Dim tabl()
             ReDim Preserve tabl(1 To PlageDataSyst.Rows.Count)
             On Error Resume Next
             Résultat = Application.WorksheetFunction.Match(DataSyst(i, 1), External, 0)
                 If Err.Number <> 0 Then
                     tabl(i) = ""
                     Else
                     tabl(i) = External(Résultat, 1)
                 End If
         Next i
     
         test = Application.WorksheetFunction.CountA(tabl)
         j = 1
         For i = 1 To PlageExternal.Rows.Count
             Résultat = Application.WorksheetFunction.CountIf(PlageDataSyst, External(i, 1))
                 If Résultat = 0 Then
                     ReDim Preserve tabl(1 To PlageExternal.Rows.Count + Diff)
                     tabl(j + test) = External(i, 1)
                     j = j + 1
                     End If
                 Next i
             Sheets("Matching").[A2].Resize(UBound(tabl)) = Application.Transpose(tabl)
             Sheets("Matching").[B2].Resize(PlageExternal.Rows.Count) = DataSyst
     End Sub

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Est-ce que la formule RECHERCHEV ou INDEX combinée à EQUIV insérée manuellement ou par code VBA ne ferait pas l'affaire ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Candidat au Club
    Homme Profil pro
    Employé
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Par défaut
    Il me semblait bien que j'avais oublié un détail dans mes explications

    J'avais justement commencé par utiliser la fonction VLOOKUP mais puisque celle-ci fait correspondre les données communes aux deux listes, elle fait du coup disparaitre celles qui ne le sont pas.
    Et c'est tout là le fond du problème.
    Je souhaite faire correspondre les données communes à titre d'information, mais surtout, faire apparaitre celles qui ne sont pas communes, pour pouvoir les détecter et travailler dessus par la suite.

    Après peut-être que j'utilise mal la fonction...

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour te faire aider, il serait plus simple que tu expliques clairement comment sont organisées tes données des feuilles 1 et 2 et comment tu souhaiterais les voir apparaître edans la feuille 3.
    Nous montrer des codes VBA qui ne fonctionnent pas ne font qu'embrouiller les choses.

    A titre indicatif la fonction EQUIV (MATCH en anglais) renvoie la position d'une référence trouvée dans une colonne ou une ligne et renvoie N/A si celle-ci n'est pas trouvée. Je crois que c'est la piste à suivre.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [AC-2007] Jonction de deux feuilles de données dans une seule table
    Par batman08bch dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/07/2015, 16h15
  2. Réponses: 12
    Dernier message: 17/06/2015, 11h13
  3. SELECT de deux tables pour INSERT dans une troisième
    Par vinsse2001 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/02/2013, 11h08
  4. Incorporer une feuille Excel/word dans une page html
    Par lovelace dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 25/02/2008, 15h27
  5. [Débutant]Deux Threads différent dans une même classe?
    Par Invité dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 26/01/2007, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo