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 pour récupérer les noms de toutes les feuilles d'un classeur d'excel [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Macro pour récupérer les noms de toutes les feuilles d'un classeur d'excel
    Bonjour,

    je cherche à faire un macro qui permet de récupérer les noms de toutes les feuilles d'un classeur d'excel dans une colonne d'une feuille que j'appelle "Sommaire"

    puis pour chaque nom dans une notre colonne, ajouter un lien hypertexte permettant d'aller ou activer la feuille sélectionnée via la feuille sommaire.

    J'ai commencé comme cela, mais ça ne fonctionne pas

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub recup_nom_feuille()
    for i =2 to worksheets.count
    Worksheets(i).names.Copy Destination :=Worksheets(1). Cells(i,1)
    next
     
    end sub



    Pour insérer le lien hypertexte, j'ai passé par l'enregistrement du macro, mais je ne sais pas comment on stock les noms des feuilles dans une variables pour pouvoir l'utiliser après

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Macro8()
    '
    ' Macro8 Macro
    '
      '  ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
            "Confusion!A1", TextToDisplay:="Confusion!A1"
    'End Sub



    je vous remercie pour votre aide

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Petite remarque liminaire : quand tu postes un code sur le forum, il est préférable que ce soit un copier/coller de ce qui se trouve dans VBE plutôt que de le retaper.

    j'ai passé par l'enregistrement du macro, mais je ne sais pas comment on stock les noms des feuilles dans une variables pour pouvoir l'utiliser après
    L'enregistreur de macro est un excellent outil tant qu'il est utilisé correctement, c'est-à-dire pour mettre sur la piste de la solution.
    Mais en aucun cas il ne peut se suffire à lui-même.
    Il faut TOUJOURS compléter par la consultation de l'aide VBA en ligne pour comprendre la syntaxe qu'il produit et l'adapter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub recup_nom_feuille()
        Dim WS As Worksheet, Ligne As Long
     
        With Worksheets("Sommaire")
            .Columns("A").ClearContents
            Ligne = 1
            For Each WS In Worksheets
                If WS.Name <> "Sommaire" Then
                   .Hyperlinks.Add Anchor:=.Cells(Ligne, 1), Address:="", SubAddress:="Feuil2!B4", TextToDisplay:=WS.Name
                    Ligne = Ligne + 1
                End If
            Next WS
        With End
    End Sub
    C'est du code tapé directement sur le forum et non testé. Tu auras donc peut-être du débugage à faire.

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Bonjour

    Serait-ce si extraordinaire d'envisager une solution (entre autres, bien sur) du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For k = 1 To Worksheets.Count
      Worksheets("Feuil1").Range("A" & k).Value = Worksheets(k).Name
    Next
    ?

  4. #4
    Candidat au Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub recup_nom_feuille()
        Dim WS As Worksheet, Ligne As Long
     
        With Worksheets("Sommaire")
            .Columns("A").ClearContents
            Ligne = 1
            For Each WS In Worksheets
                If WS.Name <> "Sommaire" Then
                   .Hyperlinks.Add Anchor:=.Cells(Ligne, 1), Address:="", SubAddress:="Feuil2!B4", TextToDisplay:=WS.Name
                    Ligne = Ligne + 1
                End If
            Next WS
        With End
    End Sub
    C'est du code tapé directement sur le forum et non testé. Tu auras donc peut-être du débugage à faire.
    Merci Beaucoup pour ta réponse.
    J'ai essayé de débugger mais sans succès.
    Quand je fais F8 pour essayer de comprendre étape par étape, quand j'arrive à :
    Dim WS as worksheet ça ne fonctionne pas
    puis il m'affiche l'erreur 9, j'ai compris que dans le WS il n'y a rien.

    Cela fait 1 semaine que j'ai commencé à apprendre VBA (autodidacte) et j'avoue pour trouver de l'aide en ligne ce n'est pas vraiment évident.
    C'est certainement que je ne me débrouille pas très bien

  5. #5
    Candidat au Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour

    Serait-ce si extraordinaire d'envisager une solution (entre autres, bien sur) du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For k = 1 To Worksheets.Count
      Worksheets("Feuil1").Range("A" & k).Value = Worksheets(k).Name
    Next
    ?
    Merci pour votre réponse.
    ça marche parfaitement pour récupérer les noms des feuilles et les mettre dans la "feuil1" et c'est assez élégant comme solution mais par contre pour insérer les liens hypertextes, je n'ai pas encore réussi à faire fonctionner.

  6. #6
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par titi2019 Voir le message
    Quand je fais F8 pour essayer de comprendre étape par étape, quand j'arrive à :
    Dim WS as worksheet ça ne fonctionne pas
    puis il m'affiche l'erreur 9, j'ai compris que dans le WS il n'y a rien.
    Quelle est le message d'erreur ?

    Es-tu sûr que c'est cette ligne qui est désignée par le débugeur ?
    Parce que, perso, elle me parait bien innocente...

    Cela fait 1 semaine que j'ai commencé à apprendre VBA (autodidacte) et j'avoue pour trouver de l'aide en ligne ce n'est pas vraiment évident.
    Commence par mettre en raccourcis dans ton browser Internet les deux liens suivants qui renvoient vers l'aide VBA et VBA Excel.
    90 % des problèmes peuvent être résolus avec ce qu'on trouve là-dedans.
    https://docs.microsoft.com/fr-fr/off...uage-reference
    https://docs.microsoft.com/fr-fr/off...ectedfrom=MSDN

    A noter que des deux sites sont accessibles par la touche F1 dans le VBE en positionnant le curseur sur le mot de code étudié.

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    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 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Salut

    Voici un code testé qui fonctionne. Exécute-le en pas-à-pas pour bien le comprendre... Attention que par défaut, l'égalité en vba est sensible à la casse. Il faut donc écrire "Sommaire" tel qu'écrit en Excel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Test()
      Dim sh As Worksheet
      Dim Target As Range
     
      Worksheets("Sommaire").Range("a:a").Clear
      Set Target = Worksheets("Sommaire").Range("a1")
      For Each sh In Worksheets
        If sh.Name <> "Sommaire" Then
          Target.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:=sh.Name & "!a1"
          Set Target = Target(2)
        End If
      Next
    End Sub

    Si tu ne veux pas voir A1 dans les cellules, tu dois remplacer la ligne Target.Hyperlinks... par Target.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:=sh.Name & "!a1", TextToDisplay:=sh.Name
    Je ne saurais trop te conseiller de découper ton code en lignes qui font une chose. On peut raccourcir le code en nombre de lignes en créant des lignes plus longues, mais c'est plus compliqué à rédiger, à comprendre, à tester, à déboguer et à maintenir. N'hésite pas non plus à passer par des variables intermédiaires que tu peux contrôler. Il n'y a pas de honte à programmer comme cela, bien au contraire, et coder n'est pas un concours "à qui aura le moins de lignes".



    Cela dit, je t'informe quand même que par clic droit que les boutons de déplacement des onglets, on obtient la liste des onglets et l'on peut cliquer sur un nom pour sélectionner la feuille souhaitée, ou que l'on peut aussi (oui oui ), cliquer sur les onglets des feuilles. C'est à cela qu'ils servent... (Humour bien sûr, mais je pense que parfois, avant de réinventer la roue, il convient de connaître celle que l'on fait tourner... )

    Nom : 2019-10-01_162153.png
Affichages : 6174
Taille : 10,1 Ko



    Perso, pour apprendre le vba, je laisserais tomber l'enregistreur de macros. Ca va te donner plein de mauvais exemples de codage, tels que des Select à tous les coins de rue, notamment

  8. #8
    Candidat au Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup Pierre Fauconnier,
    j'ai testé ton code, cela fonctionne parfaitement.
    J'ai exécuté en pas à pas donc j'ai bien compris ce que chaque ligne faite.
    Pour l'instant, je ne comprends pas parfaitement comment fonctionne le "SET" et aussi le fait de définir Target comme "Range".
    Comme je débute, je vais continuer à apprendre.
    J'ai beaucoup travaillé sous R (logiciel libre) mais en ce moment, je suis un peu obligée à apprendre VBA.

    Sinon, j'ai fait un peu quelques modifications car je comprends mieux.
    C'est beaucoup moins bien par rapport à tes codes et ce n'est pas peut-être vraiment utilisables partout
    J'ai voulu afficher dans la colonne A : le nom des feuilles pour ensuite les renommer avec le nom longue et les liens dans la colonne B.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub Test2 ()
    Worksheets("sommaire").Range("a:a").ClearContents
    For k = 2 To Worksheets.Count
      Worksheets("Sommaire").Cells(k, 1) = Worksheets(k).Name
      Worksheets("Sommaire").Cells(k, 2).Hyperlinks.Add Anchor:=Worksheets("Sommaire").Cells(k, 2), Address:="", SubAddress:=Worksheets(k).Name & "!b1"
    Next
     
    End Sub

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    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 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Tu utilises la solution de Unparia qui ramène également le sommaire dans le sommaire, ce qui évite le test à l'intérieur de la boucle.

    Tu pourrais, là aussi, utiliser l'argument TextToDisplay de la ligne ...Hyperlinks.Add... pour passer le nom de l'onglet, mais comme je le disais dans mon précédent message, l'important est que tu maîtrises ton code . Et perso, je préfère une ligne de code en plus que tu maîtrises et comprends plutôt que des lignes kilométriques...

  10. #10
    Candidat au Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message

    Cela dit, je t'informe quand même que par clic droit que les boutons de déplacement des onglets, on obtient la liste des onglets et l'on peut cliquer sur un nom pour sélectionner la feuille souhaitée, ou que l'on peut aussi (oui oui ), cliquer sur les onglets des feuilles. C'est à cela qu'ils servent... (Humour bien sûr, mais je pense que parfois, avant de réinventer la roue, il convient de connaître celle que l'on fait tourner... )
    Merci beaucoup, je ne le savais pas alors c'est effectivement très pratique quand on a pas mal de feuilles.
    Je suis tout à fait d'accord il vaut mieux bien connaître la roue que l'on fait tourner.
    Là, je réponds au besoin "pédagogique" avoir le nom des feuilles bien compréhensif pour tout le monde au lieu du nom code

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    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 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Cela dit, la boucle for k me semble relever d'une mauvaise façon de coder, car elle sert à deux choses à la fois: définir la feuille par son index ET déterminer la cellule qui va recevoir l'information. Pour moi, ce n'est pas une bonne pratique. Si tu veux exclure certaines feuilles comme nous l'avons fait Menhir et moi, tu vas avoir des problèmes avec ce code... je préfère donc nettement un for each sh in worksheets
    Comme quoi, toutes les solutions ne se valent pas...

  12. #12
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par unparia Voir le message
    Bonjour

    Serait-ce si extraordinaire d'envisager une solution (entre autres, bien sur) du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For k = 1 To Worksheets.Count
      Worksheets("Feuil1").Range("A" & k).Value = Worksheets(k).Name
    Next
    ?
    Cela prendrait probablement quelques garde-fous

    Je me suis pris moi-même dans une comparaison qui ne comparaissait pas de la bonne façon. Deux nombres c'était OK. En révisant ma copie après avoir envoyé ma réponse, j'ai essayé avec Hector et hector pour voir que j'avas la mauvaise réponse et j'ai dû l'avouer et me corriger

    https://www.developpez.net/forums/d2.../#post11157030

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-MAC 2011] Macro pour récupérer les numéros de pages correspondant aux paragraphes
    Par Jeannot91 dans le forum VBA Word
    Réponses: 4
    Dernier message: 23/01/2017, 05h31
  2. [XL-2007] Macro pour récupérer des noms dans un onglet
    Par Nahtalie dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/04/2013, 15h07
  3. Réponses: 4
    Dernier message: 25/11/2010, 20h14
  4. [XL-2003] Macro pour récupérer les données du volet espion
    Par _cece dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/01/2010, 16h00
  5. macro pour récupérer le nom de la classe
    Par Elay dans le forum C++
    Réponses: 3
    Dernier message: 27/10/2009, 10h45

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