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 :

Macro et clé primaire


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 41
    Points
    41
    Par défaut Macro et clé primaire
    Bonjour,

    Je souhaiterais fusionner deux listes via une "clé primaire" et via une macro et non une formule de type RECHERCHEV par exemple

    Quelqu'un connait-il une solution ?
    Voici un fichier exemple de ce que je souhaite obtenir...

    Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Membre habitué
    Femme Profil pro
    Inscrit en
    Février 2009
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2009
    Messages : 174
    Points : 195
    Points
    195
    Par défaut
    Bonjour,

    Il faut que tu regardes l'utilisation des tableaux (cf tutoriel ci dessous)
    http://silkyroad.developpez.com/vba/tableaux/

    sinon, reviens vers nous...

    Elise

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    Merci pour votre réponse,

    Je ne connais pas grand chose aux macros alors c'est un peu compliqué..

  4. #4
    Membre habitué
    Femme Profil pro
    Inscrit en
    Février 2009
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2009
    Messages : 174
    Points : 195
    Points
    195
    Par défaut
    OK... sinon, on peut faire autrement, et plus simple en compréhension si tu es novice...

    1) Pour le moment, il n'y a pas de "clé primaire" ds tes listes.

    2) est-ce que liste 1 peut être + ou moins longue que liste 2 ?
    Sont-elle toujours ds le même ordre toutes les deux ?

    3) Qu'est-ce qui t'ennuie avec la recherche V ?
    sinon, toujours au niveau des formules, peut-être que la formule index / equiv serait + adapté ?
    L'une ou l'autre des formules peuvent s'enregistrer par macro et à la fin tu finis par "copier coller valeur" pour figer les données.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    J'entends par clé primaire, une colonne en commun aux deux listes qui permet de les fusionner.

    Les listes n'ont pas forcément la même taille

    Bon je vais regarder pour enregistrer les différentes fonctions en macro...

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu
    bonsoir
    dans ton cas apres avoir regardé ton exemplaire
    l'utilisations des tableau me sembles tout indiqué

    liste 1 tu a
    colonne 1.2.3.4
    dans liste 2 tu a:
    1.5.6.7
    ce qui veut dire que l'on pourrai prendre la colonne des "1" en cle primaire en l'occurence la colone "A"

    donc on créé 2 tableaux
    tablo1 et tabo2
    nous savons aussi que le plus grand c'est "7"
    donc notre resultat devra etre
    1.2.3.4.5.6.7


    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
    Sub rassemble2tablos()
    Dim tablo1, tablo2
     
    tablo1 = Sheets("Liste 1").Range("a1:g" & Sheets("Liste 1").UsedRange.Rows.Count) 'on prend toute les lignes de la page liste1 sur 7 colonnes
    'il y aura donc des colonne dans notre tableaux qui seront vides
    'maintenant nous savons que dans liste 2 seule la colonne "a" est commune on a donc pas besoins de la prendre
    tablo2 = Sheets("liste 2").Range("a1:d" & Sheets("Liste 2").UsedRange.Rows.Count) 'on prend toute les lignes de la page liste2 sur 7 colonnes
    'maintenant que nous avons nos 2 tableaux on va en quelque sorte faire un merge
     
    For i = 1 To UBound(tablo1) 'on boucle sur tout les items du tablo1 qui sont apparament egale a tablos 2en terme de lignes
    'i representant la ligne le chiffre representant la colonne
    tablo1(i, 5) = tablo2(i, 2): tablo1(i, 6) = tablo2(i, 3): tablo1(i, 7) = tablo2(i, 4)
    'voila tout ce qui avait dans la colonne B C D DE LA LISTE 2 SE TROUVE MAINTENANT DANS liste1 en E.F.G
    Next
    'il nous reste maintenant a transposer notre tablo1dans le sheets fusion
    'donc
    Sheets("Fusion").Range("a1:g" & UBound(tablo1)) = tablo1
    'et voila c'est fini
    End Sub
    voila j'ai pris comme parametre la colonne "A" etant donné que je ne voyais pas d'autre point de similarité entre les 2 tableaux

    au plaisir

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Salut.

    Mon grain de sel: un fichier joint tel que celui-là ne sert pas à grand-chose...

    Il faudrait préciser quelle est la colonne "clé primaire" et montrer des données réelles (je n'ai pas dit confidentielles).

    Il est de loin préférable d'utiliser Excel (et donc RECHERCHEV ou INDEX/EQUIV comme proposé par Lilou51), quitte à s'appuyer sur du VBA pour le faire...

    Des infos complémentaires seraient bienvenues...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    Merci pour vos réponses.
    Je viens de me rendre compte que mon exemple n'était pas approprié...

    Je pense que le fichier joins est plus clair...
    J'ai deux listes, avec une colonne (prénom) et d'autres colonnes avec des valeurs.

    Les prénoms sont parfois présent dans les deux tableaux, je veux donc concaténer les colonnes de valeurs correspondantes aux même prénoms

    J'ai énormément de lignes et je voudrais le faire via une macro...

    Merci d'avance
    Fichiers attachés Fichiers attachés

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonjour

    C'est bien ce que j'ai dis précédemment.
    A partir du moment ou les lignes sont dans le même ordre tu créés 2, voir 3 tableaux de même dimensions
    Ensuite du ajoutes les données de la même manière que l'exemple que je t'ai fait.
    Le petit code étant largement commenté tu devrais trouver ton chemin facilement.
    L'exemple que je t'ai donné fonctionne encore avec ton dernier exemple. Il suffit de changer le nombre de lignes et de colonnes.
    Si tu n'y arrive pas je te ferai un exemple
    Mais essaie avant de modifier le code à ton nouvel exemple.
    Au plaisir

  10. #10
    Membre habitué
    Femme Profil pro
    Inscrit en
    Février 2009
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2009
    Messages : 174
    Points : 195
    Points
    195
    Par défaut
    Bonjour,

    De ce que j'en voie, les données doivent juste être agrégées sur une même ligne ? Indépendamment de la colonne d'origine ? Comme on n'aurait des notes d'une bulletin scolaire à mettre ensemble, mais en se moquant de la date de l'interro ? Est-ce exact ?

    Si oui, normalement, ceci devrait répondre à ta problématique...

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    Sub ListesEnsemble()
     
    Set plage1 = ThisWorkbook.Worksheets("Feuil1").Range("A1").CurrentRegion
    Set Plage2 = ThisWorkbook.Worksheets("Feuil2").Range("A1").CurrentRegion
     
    plage1.Copy ThisWorkbook.Worksheets("Feuil3").Range("A1")
     
    For Each cellule In Plage2.Resize(, 1)
     
        Set Plage3 = ThisWorkbook.Worksheets("Feuil3").Range("A1").CurrentRegion
     
        nbligne3 = 0
        On Error Resume Next
        nbligne3 = Application.WorksheetFunction.Match(cellule, Plage3.Resize(, 1), 0)
        On Error GoTo 0
     
        If nbligne3 = 0 Then
            'ajout de la nouvelle ligne
     
            nbligne3 = Plage3.Rows.Count + 1
     
            For i = 1 To Plage2.Columns.Count
                If IsEmpty(cellule.Offset(, i - 1)) = False Then
                    ThisWorkbook.Worksheets("Feuil3").Cells(nbligne3, i) = cellule.Offset(, i - 1)
                Else
                    Exit For
                End If
            Next
     
     
        Else
            'agrégation des infos sur la ligne existante
            For j = 1 To Plage3.Columns.Count + 1
                If IsEmpty(ThisWorkbook.Worksheets("Feuil3").Cells(nbligne3, j)) Then
                    For i = 2 To Plage2.Columns.Count
                        If IsEmpty(cellule.Offset(, i - 1)) = False Then
                            ThisWorkbook.Worksheets("Feuil3").Cells(nbligne3, j + i - 2) = cellule.Offset(, i - 1)
                        Else
                            Exit For
                        End If
                    Next
                    Exit For
                End If
            Next
        End If
     
    Next
     
    End Sub
    a+
    Elise

    Nota : le code de Patrick semble effectivement plus beau, plus pro... Le fait est que les tableaux ne sont pas toujours accessibles quand on est novice... L'exemple ci-dessus doit être plus simple à comprendre...mais sans doute plus lent...

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Re
    Je viens de relever une incohérence dans tes tableaux 1 et 2. Pour ton 2ème dans le résultat final il y a quelque chose qui ne va pas en tout cas pour moi :
    - dans le tableau 1 tu as la colonne 1 pleine 1.5.6
    - dans le tableau 2 tu as la colonne 1 pleine 2.6.6
    Comment est il possible de te retrouver en tableau 3 avec en 2ème colonne 2.2.6



    Là je crois que ta question manque de précision sur les critères

    A quoi vont correspondre ces colonnes. Certainement à un critère. Si c'est le cas alors le tableau 3 est faux.
    Tu vois ce que je veux dire ??
    Et merci pour le pouce -
    au plaisir

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    Non le tableau est bon, il ne faut pas regarder en terme de colonne mais plutot de ligne pour chaque prénom...

    Sinon la macro est bien, sauf que les lignes peuvent être dans n'importe quel ordre d'un tableau a l'autre. Je vais essayer d'adapte

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Il faudrait mieux expliquer ce que tu souhaites obtenir, car c'est un peu le brouillard.

    Les données de la première colonne de la troisième feuille existent-elles ou faut-il récupérer les données sans doublons des deux premières feuilles?

    A voir tes tableaux, les données peuvent glisser de colonne lors de l'agrégation, en fonction des colonnes déjà remplies pour la feuille 1 => Y-a-t-il un nombre maximum de colonnes? Ce nombre est-il le même pour chaque feuille?

    Tes données contiennent-elles une ligne d’entête ou pas?

    Combien de lignes peuvent avoir tes tableaux? Pour des tableaux relativement petits, on pourra se passer d'utiliser des tableaux VBA, plus lourds à mettre en place...

    Comme tu le vois, bien exposer son problème, c'est déjà le résoudre.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    La feuille 3 est vide,
    Les lignes peuvent être dans n'importe quel ordre selon le tableau 1 ou 2

    Il n'y a pas de nombre de colonne maxi, et le nombre de colonne n'est pas le même pour les deux tableaux

    Pour un prénom donné, les infos le concernant venant des tableaux 1 et 2 doivent être reuni sur la meme ligne dans un 3 eme tableau

    Si un prénom n'est présent que dans un seul tableau, il doit quand meme apparaitre dans le 3 eme tableau

    Il y a des entêtes de colonne mais pas de lignes

    Les tableaux peuvent avoir plus de 1000 lignes

    Je sais pas si c'est plus clair...

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Et les colonnes "glissent" bien pour remplir les trous sur une même ligne?
    L'ordre de récupération des colonnes a-t-il de l'importance?
    Peut-il y avoir des "trous" sur une ligne entre les données d'une même ligne des tableaux 1 et 2, ou peut-on arrêter le traitement dès que l'on trouve du vide sur une ligne?

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    Les colonnes ne glissent pas de se fait il peut y avoir des trous.
    L'ordre de récupération des colonnes n'a pas forcément d'importance non

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour
    tu dis que tes colonnes ont des en têtes mais que l'ordre n'a pas d'importance

    c'est un peu contradictoire pour moi sinon a quoi servent les entêtes si c'est pas pour désigner quelque chose

    au plaisir

Discussions similaires

  1. [VB6] Exécuter une macro Access
    Par Nektanebos dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/02/2006, 17h32
  2. [VBA-E] Macro ouverture fichier déja ouvert
    Par bhaal76 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 15h30
  3. [VBA-E] [Excel] Lancer une macro à une heure donnée
    Par Lysis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2002, 13h15
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 04h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 13h13

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