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

Excel Discussion :

Copier automatiquement des cellules de plusieurs feuilles dans une autre


Sujet :

Excel

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 0
    Points
    0
    Par défaut Copier automatiquement des cellules de plusieurs feuilles dans une autre
    Bonjour à tous,

    Je viens chercher un peu d'aide auprès de personnes expertes en excel, ce qui est loin d'être mon cas...
    Je vous explique ce que j'essaie de faire. J'ai un fichier avec 4 feuilles : bilan, feuil2, feuil3 et feuil4.
    Chacune de ces feuilles dispose de la même information (n° de licencié) mais les autres colonnes ont des informations différentes. Les feuil2, 3 et 4 sont en fait issus de fichiers annexes.

    La feuille bilan vise à agglomérer ces différentes données. Je souhaiterai donc :
    - que les informations contenues dans chacune des colonnes "n° de licencié" des trois dernières feuilles soient copiées automatiquement, les unes à la suite des autres, en colonne C de la feuille bilan ;
    - que sur la feuille bilan, les autres colonnes soient remplies automatiquement en fonction du n° de licencié, en sachant que les données des autres colonnes se trouvent dans des feuilles différentes, mais il y aussi des fois où aucune donnée ne correspond au num de licencié...

    Je ne sais pas si je suis très clair. :/

    Je vous joins le fichier pour l'exemple :
    http://www.cjoint.com/c/FEtrz342h1P

    Je vous remercie par avance pour toute aide que vous pourrez m'apporter !

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Est-ce que les données des feuilles 2, 3 et 4 peuvent se répéter ou sont toujours uniques par rapport au N° de licencié ?
    Est-ce qu'elles comportent toujours les mêmes colonnes, i.e. Feuil2 contient toujours les mêmes entêtes (nom, prénom, N° de licencié), ainsi que les autres ?

    Autrement il faudrait rechercher chaque entête qui nous intéresse en ligne 1 et agir selon le cas...
    MPi²

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par parmi Voir le message
    Bonjour,

    Est-ce que les données des feuilles 2, 3 et 4 peuvent se répéter ou sont toujours uniques par rapport au N° de licencié ?
    Est-ce qu'elles comportent toujours les mêmes colonnes, i.e. Feuil2 contient toujours les mêmes entêtes (nom, prénom, N° de licencié), ainsi que les autres ?

    Autrement il faudrait rechercher chaque entête qui nous intéresse en ligne 1 et agir selon le cas...
    Bonsoir parmi,

    Les données des feuilles 2, 3 et 4 sont en effet des données uniques liées au n° de licencié, ce qui complique la tâche pour le remplissage des autres colonnes de la feuille bilan...
    Et malheureusement, les trois dernières feuilles ne comportent pas toutes les mêmes en-têtes. La seule en-tête commune est le n° de licencié.

    Merci pour ton aide !

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Les données des feuilles 2, 3 et 4 sont en effet des données uniques liées au n° de licencié, ce qui complique la tâche pour le remplissage des autres colonnes de la feuille bilan...
    Si les données sont uniques, il ne devrait pas y avoir de problèmes.
    Ça évite de devoir mettre des conditions.

    Et malheureusement, les trois dernières feuilles ne comportent pas toutes les mêmes en-têtes. La seule en-tête commune est le n° de licencié.
    Ici, ça peut causer un problème. (?)
    Comment déterminer quelle colonne va où ?
    Est-ce que les entêtes des 3 feuilles sont toujours identiques même si elles n'ont pas le même titre que dans la feuille Bilan ?
    MPi²

  5. #5
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    Salut,

    Voici un début de réponse. Ce n'est qu'une proposition :
    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
    Sub regroupe()
    'regroupe les N°de licences des <> feuille dans la Col C de la première feuille
     
    Dim k As Integer, i As Integer
    Dim nom_feuille As String
     
    'compte le nb de feuille dans le classeur
    k = Sheets.Count
     
    'pour chaque feuille (sauf la 1ère) on cherche le texte "N° le licence
    'et on copie le texte dans la col C de la première feuille
    For i = 2 To k
        Sheets(i).Activate
        Cells.Find(what:="N° de licencié").Activate
        ActiveCell.Offset(1, 0).Select
        Range(Selection, Selection.End(xlDown)).Copy Sheets(1).Range("C1").Offset(Sheets(1).Range("C65536").End(xlUp).Row, 0)
    Next i
    End Sub
    Cela permet de trraiter le début de ta demande : regrouper les N° de licence dans la 1ère feuille.

    La suite ...
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  6. #6
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    Salut,

    Pour récupérer les données. Le nombres de feuilles à regrouper est variable ? Est il important ?

    Les libéllés ne se retrouvent pas tous. Mais est ce que les noms de colonnes des tableaux à importer sont identique à la feuille bilan ?
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par parmi Voir le message
    Si les données sont uniques, il ne devrait pas y avoir de problèmes.
    Ça évite de devoir mettre des conditions.


    Ici, ça peut causer un problème. (?)
    Comment déterminer quelle colonne va où ?
    Est-ce que les entêtes des 3 feuilles sont toujours identiques même si elles n'ont pas le même titre que dans la feuille Bilan ?
    En fait, les en-têtes sont différentes sur chacune des feuilles 2, 3 et 4, mais je dois pouvoir faire en sorte que le libellé des colonnes de la feuille bilan corresponde à celui des en-têtes des autres feuilles puisque c'est la seule feuille sur laquelle j'ai réellement la main (les autres étant des copier de différents tableaux comme je l'ai expliqué).
    Je prends un exemple : les données des colonnes nom et prénom de la feuille 2 vont se retrouver dans les colonnes correspondantes sur la feuille bilan. Mais un simple copier-coller ne peut pas être employé ici puisque mes données ne seront pas forcément triées sur mes feuilles sources (2, 3 et 4), et surtout les données vont évoluer régulièrement, avec des ajouts (surtout) ou des suppressions (parfois).
    J'espère que c'est assez clair, je suis désolé si je suis confus mais j'ai aussi du mal à visualiser la manip donc je ne sais pas par où commencer mes explications.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par jerome.vaussenat Voir le message
    Salut,

    Voici un début de réponse. Ce n'est qu'une proposition :
    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
    Sub regroupe()
    'regroupe les N°de licences des <> feuille dans la Col C de la première feuille
     
    Dim k As Integer, i As Integer
    Dim nom_feuille As String
     
    'compte le nb de feuille dans le classeur
    k = Sheets.Count
     
    'pour chaque feuille (sauf la 1ère) on cherche le texte "N° le licence
    'et on copie le texte dans la col C de la première feuille
    For i = 2 To k
        Sheets(i).Activate
        Cells.Find(what:="N° de licencié").Activate
        ActiveCell.Offset(1, 0).Select
        Range(Selection, Selection.End(xlDown)).Copy Sheets(1).Range("C1").Offset(Sheets(1).Range("C65536").End(xlUp).Row, 0)
    Next i
    End Sub
    Cela permet de trraiter le début de ta demande : regrouper les N° de licence dans la 1ère feuille.

    La suite ...
    Bonsoir Jérôme,

    Merci beaucoup pour ton aide.
    J'ai essayé ce code, j'ai obtenu l'erreur suivante :
    "Variable d'objet non définie" pour la ligne "k = Sheets.Count" ?


    Citation Envoyé par jerome.vaussenat Voir le message
    Salut,

    Pour récupérer les données. Le nombres de feuilles à regrouper est variable ? Est il important ?

    Les libéllés ne se retrouvent pas tous. Mais est ce que les noms de colonnes des tableaux à importer sont identique à la feuille bilan ?
    Le nombre de feuilles à regrouper ne devrait a priori pas bouger. Ce qui va bouger régulièrement, c'est le contenu de ces feuilles "sources" puisqu'elles seront régulièrement mises à jour par une manip toute simple : un copier-coller d'un autre tableau dans une de ces feuilles (évidemment, le même genre de tableau, même format, même type de données, dans la même feuille à chaque fois...).

    Je peux aussi faire en sorte que les noms de colonnes de la feuille bilan correspondent aux noms de colonnes des tableaux sources.

    Merci beaucoup pour ton aide !

  9. #9
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    Pour l'erreur à l'initialisation de K, essaie :
    Quelle version d'excel tu utilises ?

    Pour récupérer les info, je vais voir pour le faire via une formule ...
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  10. #10
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    Salut,

    Je viens de voir que dans les feuil 2, 3 et 4 le même N° de licence apparaît. C'est une chose qui peut arrivé ou c'est un hasard dû aux valeurs que tu as saisies.

    Si cela peut arriver, au moment de la "fusion" des trois listes, il faut virer les doublons ...
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  11. #11
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    Salut,

    Voici une proposition de formule que tu peux mette dans les colonnes de la feuille bilan.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SIERREUR(INDEX(DECALER(feuil2!$A$1;0;EQUIV(A$1;feuil2!$1:$1;0)-1;10000;1);EQUIV($C2;feuil2!$C:$C;0);1);SIERREUR(INDEX(DECALER(feuil3!$A$1;0;EQUIV(A$1;feuil3!$1:$1;0)-1;10000;1);EQUIV($C2;feuil3!$A:$A;0);1);SIERREUR(INDEX(DECALER(feuil4!$A$1;0;EQUIV(A$1;feuil4!$1:$1;0)-1;10000;1);EQUIV($C2;feuil4!$A:$A;0);1);"")))
    Même si elle semble compliquée, elle fait trois fois la même chose : chercher dans la feuil2, si elle ne trouve pas, chercher dans la feuil3 si toujours rien chercher dans la feuil4 et si toujours rien, ne rien faire.
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par jerome.vaussenat Voir le message
    Salut,

    Je viens de voir que dans les feuil 2, 3 et 4 le même N° de licence apparaît. C'est une chose qui peut arrivé ou c'est un hasard dû aux valeurs que tu as saisies.

    Si cela peut arriver, au moment de la "fusion" des trois listes, il faut virer les doublons ...
    Effectivement ça va arriver très souvent puisque les informations sont censées être recoupées sur les trois feuilles... Mais pas toujours.

    J'ai essayé le code pour copier les num de licencié, ça marche bien jusqu'à ce qu'il tombe sur une cellule vide. A ce moment il s'arrête et passe à la feuille suivante. Une idée pour remédier à cela ?

    Citation Envoyé par jerome.vaussenat Voir le message
    Salut,

    Voici une proposition de formule que tu peux mette dans les colonnes de la feuille bilan.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SIERREUR(INDEX(DECALER(feuil2!$A$1;0;EQUIV(A$1;feuil2!$1:$1;0)-1;10000;1);EQUIV($C2;feuil2!$C:$C;0);1);SIERREUR(INDEX(DECALER(feuil3!$A$1;0;EQUIV(A$1;feuil3!$1:$1;0)-1;10000;1);EQUIV($C2;feuil3!$A:$A;0);1);SIERREUR(INDEX(DECALER(feuil4!$A$1;0;EQUIV(A$1;feuil4!$1:$1;0)-1;10000;1);EQUIV($C2;feuil4!$A:$A;0);1);"")))
    Même si elle semble compliquée, elle fait trois fois la même chose : chercher dans la feuil2, si elle ne trouve pas, chercher dans la feuil3 si toujours rien chercher dans la feuil4 et si toujours rien, ne rien faire.
    Je teste et je reviens vers toi ! Merci beaucoup !!!

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Par ailleurs, est-il possible de coller les num de licenciés sans mise en forme ? Certains lignes pourraient avoir des tailles de police différentes ce qui n'est pas très pratique.
    J'ai également testé plusieurs fois de suite en rajoutant des num de licenciés, le problème est que la macro me recopie toutes les lignes à partir de la dernière cellule vide en colonne C de la feuille bilan. A ce moment, le plus simple serait d'effacer à chaque fois les données en colonne C avant de regrouper les cellules. Cela serait-il possible dans la même macro ?

  14. #14
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    Salut,

    y a qu'a demandé, vu le prix ...
    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
    Sub regroupe()
    'regroupe les N°de licences des <> feuille dans la Col C de la première feuille
     
    Dim k As Integer, i As Integer
    Dim nom_feuille As String
     
    'compte le nb de feuille dans le classeur
    k = Worksheets.Count
     
    'pour chaque feuille (sauf la 1ère) on cherche le texte "N° le licence
    'et on copie le texte dans la col C de la première feuille
    For i = 2 To k
        Sheets(i).Activate
        Cells.Find(what:="N° de licencié").Activate
        ActiveCell.Offset(1, 0).Select
        Range(Selection, Selection.End(xlDown)).Copy Sheets(1).Range("C1").Offset(Sheets(1).Range("C65536").End(xlUp).Row, 0)
    Next i
    Sheets(1).Select
    'suppression des doublons dans la colonne C
    Sheets(1).Range("C1", Range("C1").End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlYes
    'on efface la mise en forme de la colonne C
    Sheets(1).Range("C2", Range("C2").End(xlDown)).ClearFormats
    End Sub
    La modif porte sur la suppression des doublons et la suppression de la mise en forme sur la colonne C.
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par jerome.vaussenat Voir le message
    Salut,

    y a qu'a demandé, vu le prix ...
    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
    Sub regroupe()
    'regroupe les N°de licences des <> feuille dans la Col C de la première feuille
     
    Dim k As Integer, i As Integer
    Dim nom_feuille As String
     
    'compte le nb de feuille dans le classeur
    k = Worksheets.Count
     
    'pour chaque feuille (sauf la 1ère) on cherche le texte "N° le licence
    'et on copie le texte dans la col C de la première feuille
    For i = 2 To k
        Sheets(i).Activate
        Cells.Find(what:="N° de licencié").Activate
        ActiveCell.Offset(1, 0).Select
        Range(Selection, Selection.End(xlDown)).Copy Sheets(1).Range("C1").Offset(Sheets(1).Range("C65536").End(xlUp).Row, 0)
    Next i
    Sheets(1).Select
    'suppression des doublons dans la colonne C
    Sheets(1).Range("C1", Range("C1").End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlYes
    'on efface la mise en forme de la colonne C
    Sheets(1).Range("C2", Range("C2").End(xlDown)).ClearFormats
    End Sub
    La modif porte sur la suppression des doublons et la suppression de la mise en forme sur la colonne C.
    Bonsoir,
    Encore une fois, merci Jérôme pour ton aide. J'ai ajouté ces lignes à la fin de la macro, sauf les lignes concernant la suppression des doublons, puisque j'ai quelque chose qui risque de complexifier un peu la manip :
    - pour les numéros de licenciés, effectivement les doublons concerne bel et bien la même personne (un licencié = une personne).
    - en revanche, une nouvelle feuille va concerner les nouveaux arrivants en attente d'attribution de numéros, inscrits en "En attente" dans la colonne numéro de licencié. Donc "En attente" = plusieurs personnes différentes.
    Est-il donc possible de faire la distinction, par exemple les données n° de licencié (5 chiffres au format texte) et les autre données texte, afin de ne supprimer que les doublons des "vrais" numéros de licenciés ?

    J'ai également rajouté ces lignes en début de code pour vider la colonne C avant chaque regroupement des cellules sur la feuille bilan :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'supprimer les cellules de la colonne C dans la feuille bilan
    Sheets(1).Select
    Range("C2", Range("C2").End(xlDown)).Select
    Selection.ClearContents
    Ca marche bien et le reste de ton code fait sa fonction, c'est nikel.

    Citation Envoyé par jerome.vaussenat Voir le message
    Salut,

    Voici une proposition de formule que tu peux mette dans les colonnes de la feuille bilan.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SIERREUR(INDEX(DECALER(feuil2!$A$1;0;EQUIV(A$1;feuil2!$1:$1;0)-1;10000;1);EQUIV($C2;feuil2!$C:$C;0);1);SIERREUR(INDEX(DECALER(feuil3!$A$1;0;EQUIV(A$1;feuil3!$1:$1;0)-1;10000;1);EQUIV($C2;feuil3!$A:$A;0);1);SIERREUR(INDEX(DECALER(feuil4!$A$1;0;EQUIV(A$1;feuil4!$1:$1;0)-1;10000;1);EQUIV($C2;feuil4!$A:$A;0);1);"")))
    Même si elle semble compliquée, elle fait trois fois la même chose : chercher dans la feuil2, si elle ne trouve pas, chercher dans la feuil3 si toujours rien chercher dans la feuil4 et si toujours rien, ne rien faire.
    Après mes premiers tests ce soir, ça m'a l'air super bien !!!
    Je le testerai plus "à fond" sur le vrai fichier, comportant bien plus de données, pour voir comment ça réagit.
    Pour mon info et afin que je puisse l'adapter facilement le cas échéant, pourrais-tu m'expliquer en détail les différents arguments de cette fonction ?
    Pour SIERREUR, INDEX et EQUIV, c'est bon, mais j'ai un peu plus de mal à comprendre le DECALER.

    Merci infiniment !

  16. #16
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    Salut,

    Elle est super cette fonction DECALER. C'est une de mes préférées avec la SOMMEPROD.
    Pour tout savoir sur elle :
    https://support.office.com/fr-fr/art...e-b4d906d11b66.
    En gros, dans ton cas elle permet de trouver la colonne qui contient le même libellé.
    Si on met sa syntaxe dans une petite phrase en Français, çà donne ca:
    Depuis la cellule A1, décale toi de 0 lignes, d'autant de colonne que nécessaire pour trouver le même nom et sélectionne 1000 lignes et 1 colonne.

    Pour tes "En attente". Je vois deux possibilités :
    Faire la suppression des doublons en manuel. Et là, tu peut faire ce que tu veux. C'est une boucle ...
    Faire un tri décroissant de ton tableau avant la suppr des doublons. Et faire une sélection sans prendre les premières lignes (les lignes avec "En attente").
    Il peut encore exister d'autre possibilités ...
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  17. #17
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut une nouvelle approche les Tableau ou Array
    bonjour,
    je te propose une autre façon de faire qui est de mettre toutes les infos dans des Tableaux avec comme fil rouge le numéro de Licencié.
    tu pourras disposer le contenu de tes tableaux dans de multiples configurations.
    pour tester il faut un nouvel onglet "Test" et tu colles ce code dans cette feuille.
    ce code est à améliorer bien sur vu les répétitions de séquences.
    @+JP

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Private Sub CommandButton1_Click()
        Dim OngletName As String
        Dim DerniereCelluleNonVideDeLaListe As Range
        Dim TabLicence() As String 'Boolean possible
        Dim TabNom() As String
        Dim TabPrenom() As String
        Dim TabPoste() As String
        Dim TabMail() As String
        Dim LicenceNum As Integer
        '-------------------------------------
        LicenceNum = 1
        ReDim TabLicence(1) 'payée / true - false
        ReDim TabNom(1)     'nom
        ReDim TabPrenom(1)  'prénom
        ReDim TabPoste(1)   'poste
        ReDim TabMail(1)    'mail
        '-------------------------------------
        OngletName = "Feuil2"
        ColonneDebutListe = "C"
        LigneDebutListe = "2"
        Set DerniereCelluleNonVideDeLaListe = Sheets(OngletName).Range(ColonneDebutListe & LigneDebutListe).End(xlDown)
        FinDeListe = DerniereCelluleNonVideDeLaListe.Row
        For n = LigneDebutListe To FinDeListe
            LicenceNum = Sheets(OngletName).Range(ColonneDebutListe & n).Value
            If UBound(TabLicence) < LicenceNum Then
                ReDim Preserve TabLicence(LicenceNum)
                ReDim Preserve TabNom(LicenceNum)
                ReDim Preserve TabPrenom(LicenceNum)
                ReDim Preserve TabPoste(LicenceNum)
                ReDim Preserve TabMail(LicenceNum)
            End If
            TabNom(LicenceNum) = Sheets(OngletName).Range("A" & n).Value
            TabPrenom(LicenceNum) = Sheets(OngletName).Range("B" & n).Value
        Next n
        '-------------------------------------
        OngletName = "Feuil3"
        ColonneDebutListe = "A"
        LigneDebutListe = "2"
        Set DerniereCelluleNonVideDeLaListe = Sheets(OngletName).Range(ColonneDebutListe & LigneDebutListe).End(xlDown)
        FinDeListe = DerniereCelluleNonVideDeLaListe.Row
        For n = LigneDebutListe To FinDeListe
            LicenceNum = Sheets(OngletName).Range(ColonneDebutListe & n).Value
            If UBound(TabLicence) < LicenceNum Then
                ReDim Preserve TabLicence(LicenceNum)
                ReDim Preserve TabNom(LicenceNum)
                ReDim Preserve TabPrenom(LicenceNum)
                ReDim Preserve TabPoste(LicenceNum)
                ReDim Preserve TabMail(LicenceNum)
            End If
            TabPoste(LicenceNum) = Sheets(OngletName).Range("B" & n).Value
        Next n
        '-------------------------------------
        OngletName = "Feuil4"
        ColonneDebutListe = "A"
        LigneDebutListe = "2"
        Set DerniereCelluleNonVideDeLaListe = Sheets(OngletName).Range(ColonneDebutListe & LigneDebutListe).End(xlDown)
        FinDeListe = DerniereCelluleNonVideDeLaListe.Row
        For n = LigneDebutListe To FinDeListe
            LicenceNum = Sheets(OngletName).Range(ColonneDebutListe & n).Value
            If UBound(TabLicence) < LicenceNum Then
                ReDim Preserve TabLicence(LicenceNum)
                ReDim Preserve TabNom(LicenceNum)
                ReDim Preserve TabPrenom(LicenceNum)
                ReDim Preserve TabPoste(LicenceNum)
                ReDim Preserve TabMail(LicenceNum)
            End If
            TabMail(LicenceNum) = Sheets(OngletName).Range("B" & n).Value
        Next n
        '-------------------------------------
        Sheets("Test").Select
        For n = 1 To UBound(TabLicence)
            Range("A" & n).Value = n
            Range("B" & n).Value = TabNom(n)
            Range("C" & n).Value = TabPrenom(n)
            Range("D" & n).Value = TabPoste(n)
            Range("E" & n).Value = TabMail(n)
        Next n
    End Sub
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  18. #18
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    bonjour,
    voilà un visu, c'est sommaire mais çà fonctionne
    @+JP
    Nom : Capture.PNG
Affichages : 2706
Taille : 23,6 Ko
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par mjpmjp Voir le message
    bonjour,
    je te propose une autre façon de faire qui est de mettre toutes les infos dans des Tableaux avec comme fil rouge le numéro de Licencié.
    tu pourras disposer le contenu de tes tableaux dans de multiples configurations.
    pour tester il faut un nouvel onglet "Test" et tu colles ce code dans cette feuille.
    ce code est à améliorer bien sur vu les répétitions de séquences.
    @+JP
    Bonjour et merci pour ton aide JP. Je vais regarder d'un peu plus près le code que tu as proposé. Cependant, pour l'adapter au tableau final, qui va contenir plus d'onglets et beaucoup plus de données, ça risque d'être compliqué et surtout de faire un code très, très long.

    Citation Envoyé par jerome.vaussenat Voir le message
    Salut,

    Elle est super cette fonction DECALER. C'est une de mes préférées avec la SOMMEPROD.
    Pour tout savoir sur elle :
    https://support.office.com/fr-fr/art...e-b4d906d11b66.
    En gros, dans ton cas elle permet de trouver la colonne qui contient le même libellé.
    Si on met sa syntaxe dans une petite phrase en Français, çà donne ca:
    Depuis la cellule A1, décale toi de 0 lignes, d'autant de colonne que nécessaire pour trouver le même nom et sélectionne 1000 lignes et 1 colonne.

    Pour tes "En attente". Je vois deux possibilités :
    Faire la suppression des doublons en manuel. Et là, tu peut faire ce que tu veux. C'est une boucle ...
    Faire un tri décroissant de ton tableau avant la suppr des doublons. Et faire une sélection sans prendre les premières lignes (les lignes avec "En attente").
    Il peut encore exister d'autre possibilités ...
    Bonjour Jérôme,
    Merci pour les explications sur le DECALER.
    J'ai poussé les tests sur cette formule, et j'ai repéré un petit problème. Il est lié justement aux "doublons" volontaires, c'est à dire les "en attente".
    Quand il y en a plusieurs, la formule va systématiquement rechercher les informations correspondante à la première occurrence rencontrée dans les feuil2, 3 et 4.
    Est-il possible de faire en sorte d'éviter cela ?

  20. #20
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    tu peux aussi utiliser une classe pour les licenciés et un dictionnaire pour "ranger" tous ces licenciés et éviter les doublons.
    Voici comment faire :
    créer un module de classe qui s'appelle Licencié et qui a pour contenu :
    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
    Private pNuméro As String
    Private pNom As String
    Private pPrénom As String
    Private pPoste As String
    Private pCourriel As String
    Public Property Get Numéro() As String
        Numéro = pNuméro
    End Property
    Public Property Let Numéro(Value As String)
        pNuméro = Value
    End Property
     
    Public Property Get Nom() As String
        Nom = pNom
    End Property
    Public Property Let Nom(Value As String)
        pNom = Value
    End Property
    Public Property Get Prénom() As String
        Prénom = pPrénom
    End Property
    Public Property Let Prénom(Value As String)
        pPrénom = Value
    End Property
    Public Property Get Poste() As String
        Poste = pPoste
    End Property
    Public Property Let Poste(Value As String)
        pPoste = Value
    End Property
    Public Property Get Courriel() As String
        Courriel = pCourriel
    End Property
    Public Property Let Courriel(Value As String)
        pCourriel = Value
    End Property
    et pour le regroupement de tous les licenciés dans la feuille Bilan un truc du genre :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    Sub regroupe()
    'regroupe les  licenciés des <> feuilles dans la première feuille
     
    Dim k As Integer, i As Integer, j As Integer
    Dim nom_feuille As String
    Dim ColCherchée As Range
    Dim ColLicNum, ColNomNum, ColPréNum, ColPostNum, ColMailNum As Integer
    Dim Tableau As Variant
    Dim LicDictionnaire As Object
    Set LicDictionnaire = CreateObject("Scripting.Dictionary")
     
     
    'compte le nb de feuille dans le classeur
    k = Sheets.Count
     
    'pour chaque feuille (sauf la 1ère) on cherche le texte "N° le licence
    'et on copie le texte dans la col C de la première feuille
    For i = 2 To k
        ' on initialise les numéros de colonnes
        ColLicNum = 0
        ColNomNum = 0
        ColPréNum = 0
        ColPostNum = 0
        ColMailNum = 0
        Sheets(i).Activate
        ' on cherche la colonne du numéro de licencié
        Set ColCherchée = Rows(1).Find("N° de licencié")
        ' si on la trouve
        If Not ColCherchée Is Nothing Then
        ColLicNum = ColCherchée.Column
        ColCherchée.Activate
        ActiveCell.Offset(1, 0).Select
        End If
        ' on cherche la colonne du nom
        Set ColCherchée = Rows(1).Find("NOM", Lookat:=xlWhole)
        ' si on la trouve
        If Not ColCherchée Is Nothing Then ColNomNum = ColCherchée.Column
        ' on cherche la colonne du numéro de licencié
        Set ColCherchée = Rows(1).Find("Prénom", Lookat:=xlWhole)
        ' si on la trouve
        If Not ColCherchée Is Nothing Then ColPréNum = ColCherchée.Column
        ' on cherche la colonne du numéro de licencié
        Set ColCherchée = Rows(1).Find("Poste")
        ' si on la trouve
        If Not ColCherchée Is Nothing Then ColPostNum = ColCherchée.Column
            ' on cherche la colonne du numéro de licencié
       Set ColCherchée = Rows(1).Find("Mail")
        ' si on la trouve
        If Not ColCherchée Is Nothing Then ColMailNum = ColCherchée.Column
     
    ' Si on a trouvé la colonne de numéro de licence on met tous les éléments possibles dans un tableau
        If ColLicNum <> 0 Then
        Tableau = Range("A2:C" & LastRow(Sheets(i)))
        'on va chercher les différents éléments dans le tableau et on les mets dans le dictionnaire
        Dim Nom, Prénom, Poste, Mail As String
        Dim LeLicencié As Licencié
        With LicDictionnaire
        For j = LBound(Tableau, 1) To UBound(Tableau, 1)
        'Si le licencié existe dans le dictionnaire on le récupère
        If .Exists(Tableau(j, ColLicNum)) Then
        Set LeLicencié = .Item(Tableau(j, ColLicNum))
        Else
        Set LeLicencié = New Licencié
        End If
        LeLicencié.Numéro = Tableau(j, ColLicNum)
        If ColNomNum <> 0 Then LeLicencié.Nom = Tableau(j, ColNomNum)
        If ColPréNum <> 0 Then LeLicencié.Prénom = Tableau(j, ColPréNum)
        If ColPostNum <> 0 Then LeLicencié.Poste = Tableau(j, ColPostNum)
        If ColMailNum <> 0 Then LeLicencié.Courriel = Tableau(j, ColMailNum)
        If Not .Exists(LeLicencié.Numéro) Then
        'On ajoute un nouveau licencié si il n'existe pas
        .Add LeLicencié.Numéro, LeLicencié
        Else
        'Mise à jour du licencié
        Set .Item(LeLicencié.Numéro) = LeLicencié
        End If
        Next j
        End With
        End If
    '    Column.Activate
     
        'On sélectionne tous les éléments et on les met dans le tableau Colonne
    '    Colonne = Range(Selection, Selection.End(xlDown))
     
    Next i
    'copie des licenciés dans la feuille Test
    Sheets("Bilan").Select
    Dim StrKey As Variant
    Dim n As Integer
    n = 2
    For Each StrKey In LicDictionnaire.Keys()
            Range("A" & n).Value = LicDictionnaire(StrKey).Nom
            Range("B" & n).Value = LicDictionnaire(StrKey).Prénom
            Range("C" & n).Value = LicDictionnaire(StrKey).Numéro
            Range("D" & n).Value = LicDictionnaire(StrKey).Poste
            Range("F" & n).Value = LicDictionnaire(StrKey).Courriel
    n = n + 1
    Next
    End Sub
     
    Function LastRow(sh As Worksheet)
        On Error Resume Next
        LastRow = sh.Cells.Find(What:="*", _
                                After:=sh.Range("A1"), _
                                Lookat:=xlPart, _
                                LookIn:=xlFormulas, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlPrevious, _
                                MatchCase:=False).Row
        On Error GoTo 0
    End Function
    Nom : Regroupement_licenciés.png
Affichages : 2678
Taille : 21,5 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. [XL-2007] Aide sur copier des cellules de plusieurs feuilles sur une feuille
    Par yvon57 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 17/09/2015, 08h53
  2. Réponses: 81
    Dernier message: 16/09/2013, 14h48
  3. Réponses: 1
    Dernier message: 23/03/2013, 08h51
  4. copier coller plusieurs ongets dans une autre feuille et ranger
    Par herve L76 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/07/2007, 15h41
  5. copier des cellules d'une feuille dans une autres sous condition
    Par olivertwist dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/05/2007, 10h42

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