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 :

syntaxe avec codename pour un classeur mis en variable [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut syntaxe avec codename pour un classeur mis en variable
    Bonjour à tous,

    je bute sur un truc à-priori simple : comment désigner une feuille par son codename pour un classeur mis en variable ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
        Dim wb As Workbook, sh As Worksheet
        Set wb = ThisWorkbook
        Set sh = wb.Feuil1 ' erreur
        Set sh = wb.Worksheets(Feuil1) ' erreur
    End Sub
    Peu de possibilités mais je suis à court d'idée pour la bonne syntaxe.
    Ca n'est quand même pas réservé au classeur actif (?)
    eric

  2. #2
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut Eric,

    Je passe par cette fonction, qui est depuis longtemps dans mon module wbTools...


    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
    Function getWorksheetByCodename(Codename As String, Optional wb As Workbook) As Worksheet
      Dim Counter As Long
      Dim Found As Boolean
     
      If wb Is Nothing Then Set wb = ActiveWorkbook
     
      Counter = 1
      Do While Counter <= wb.Worksheets.Count And Not Found
        If UCase(wb.Worksheets(Counter).Codename) = UCase(Codename) Then
          Set getWorksheetByCodename = wb.Worksheets(Counter)
          Found = True
        End If
        Counter = Counter + 1
      Loop
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test1()
      Dim sh As Worksheet
      Dim wb As Workbook
     
      Set wb = Workbooks("Book1")
      Set sh = getWorksheetByCodename("shTest", wb)
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Expert éminent 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
    Par défaut
    Citation Envoyé par eriiic Voir le message
    Peu de possibilités mais je suis à court d'idée pour la bonne syntaxe.
    Je pense que tu as simplement oublié les guillemets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set sh = wb.Worksheets("Feuil1")
    Ecrire, comme tu l'as fait, wb.Worksheets(Feuil1) signifie de chercher le nom de la feuille dans la variable Feuil1 (variable qui, vraisemblablement, n'exixte pas).

    Met en première ligne de ton module un Option Explicit qui t'obligera à déclarer tes variables et te permettra de détecter plus facilement ce type de problèmes.

  4. #4
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut Menhir,

    Citation Envoyé par Menhir Voir le message
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set sh = wb.Worksheets("Feuil1")
    [...]
    Ici, Eric parle du codename. Dans le code que tu donnes, tu utilises le name, c'est-à-dire le nom de l'onglet Excel.

    Je pense que je ne m'amuserais pas à passer par une fonction perso si la solution était aussi simple que celle que tu proposes, tu ne crois pas?

    ...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Expert éminent 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
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Ici, Eric parle du codename. Dans le code que tu donnes, tu utilises le name, c'est-à-dire le nom de l'onglet Excel.
    Etant donné les erreurs que contient le code qu'il a fourni, je ne suis pas sûr qu'il ait une définition du codename aussi précise que la notre.
    D'où ma proposition pour vérifier si, après tout, ce n'est pas simplement le name dont il a besoin (étant donné la simplicité, on ne perd rien à essayer).

  6. #6
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Menhir Voir le message
    [...]je ne suis pas sûr qu'il ait une définition du codename aussi précise que la notre.[...]
    Jamais vu quelqu'un parler du codename d'une feuille sans savoir de quoi il parlait...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Si si, le codename est bien le codename chez moi aussi.
    Les 'erreurs' sont des exemples infructueux, la 2nde étant la tentative en désespoir de cause ;-)

    Merci Pierre, boucler j'y pensais bien mais ça me paraissait dommage. J'espérais une syntaxe plus directe.
    Tant pis :-)
    eric

  8. #8
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    le CodeName étant déjà une variable et n'a une utilité directe uniquement pour le classeur contenant le code !
    Dans ce cas créer une variable sur un CodeName est totalement superfétatoire,
    du genre prendre l'ascenseur au 5è étage pour descendre au Rez de Chaussée puis remonter directement au 6è par l'escalier !

    Dans le cas d'une feuille située sur un classeur différent de celui contenant le code,
    ceci à une fin de sécurité vis à vis du changement de l'ordre de la feuille ou de son nom,
    il faut alors parcourir la collection des feuilles de ce classeur afin d'y comparer leurs CodeName
    et là il y a un intérêt de créer une variable sur la feuille ciblée mais
    sans toutefois omettre de libérer cette variable après usage !
    Voir par exemple la fonction GetSheetByCode publiée dans les discussions de ce forum …

    ___________________________________________________________________________________________________________
    Je suis Paris, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    le CodeName étant déjà une variable et n'a une utilité directe uniquement pour le classeur contenant le code !
    J'aurais dit propriété plutôt.
    J'ai mis ThisWorkbook pour simplifier l'exemple, en l'occurrence il s'agit d'un autre classeur x dont une feuille est susceptible de changer de nom.
    L'utilité est là quelque soit le type de classeur.
    J'ai plus l'impression d'un oubli plus que d'un choix délibéré car inutile.

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    C'est pour cela que c'est écrit en italique

    Il y a une sacré différence d'utilisation de CodeName entre un classeur contenant le code exécuté et un autre !
    La référence directe au CodeName ne vaut que pour le classeur depuis lequel le code est exécuté
    même si ce n'est pas celui actif !
    Pour un autre classeur, il faut boucler sur sa collection de feuilles pour trouver celle selon son CodeName
    - voir fonction GetSheetByCode de ce forum - et si nécessaire lui affecter une variable objet, variable à libérer après usage.
    ThisWorkbook induit donc en erreur.

    Une fois ceci acquis il ne peut y avoir aucun « exemple infructueux » …

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    ThisWorkbook était pour l'exemple, désolé si ça a amené des confusions, ça aurait tout aussi être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set wb = Workbooks("mon_classeur_qui_va_bien.xlsx")
    Et je sais bien qu'on peut boucler pour y pallier, Pierre proposait également une fonction au-dessus.
    Ma question était : existe-t-il une syntaxe du type :
    a-priori c'est donc non, c'est limité au classeur de la macro (et non au classeur actif comme je l'ai écrit).
    On ne peut pas mettre une expression devant, dommage mais je ferai avec ;-)
    Je trouvais étrange que ce ne soit pas possible et aurais très bien pu ne pas avoir trouvé la façon correcte de le faire, d'où la question.
    eric

  12. #12
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Saluts
    Citation Envoyé par eriiic Voir le message
    J'aurais dit propriété plutôt.
    ...
    Je dirais pas tout à fait.
    Enfin, cela de la façon dont y accède comme le rappelle Marc. Il est disponible en tant que variable globale de la portée du projet.

  13. #13
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Feuil1 est une variable Worksheet implicite au niveau projet comme ThisWorkbook et
    CodeName est une propriété retournant le nom de cet objet implicite, pas l'objet lui même …

    Juste en effectuant le test dans la fenêtre Exécution du VBE …

  14. #14
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Enfin, je sentais qu'on était parti sur des rapports différents. Je reviens après suppression d'une réponse rapide pour lire et comprendre l'endroit qui cloche.
    Soyons clair, je ne penses pas à CodeName; mais à Feuil1 !
    En écrivant cette réponse, je vois encore que c'est peut-être plus que du niveau Projet.
    A vérifier au niveau Application si Feuil1 désigne celle du classeur l'ayant invoqué ou celle du classeur actif. Dans ce dernier cas une fonction native VBA existe déjà.

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    A vérifier au niveau Application si Feuil1 désigne celle du classeur l'ayant invoqué ou celle du classeur actif.
    J'avais testé set sh=Feuil1 avec un autre fichier actif, son Parent est bien le classeur de la macro comme annoncé par Marc-L
    eric

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    un variante de la version de Pierre!

    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 test()
    Set sh = CodeName("Feuil1", ThisWorkbook)
    Set sh1 = CodeName("Feuil1", ThisWorkbook)
    Set sh3 = CodeName("Feuil3", ThisWorkbook)
    End Sub
    Public Function CodeName(Cname As String, ByRef wb As Workbook) As Worksheet
    Static dic As Object
    Set CodeName = Nothing
    If TypeName(dic) = "Nothing" Then Set dic = CreateObject("Scripting.Dictionary")
    If Not dic.Exists(Cname & "©" & wb.Name) Then
        For i = 1 To wb.Sheets.Count
            If UCase(wb.Sheets(i).CodeName) = UCase(Cname) Then
                 dic.Add Cname & "©" & wb.Name, wb.Sheets(i)
                 Set CodeName = wb.Sheets(i)
                 Exit For
             End If
     
     
        Next
    Else
       Set CodeName = dic(Cname & "©" & wb.Name)
    End If
    End Function

  17. #17
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Merci à tous :-)

  18. #18
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par eriiic Voir le message
    J'avais testé set sh=Feuil1 avec un autre fichier actif, son Parent est bien le classeur de la macro comme annoncé par Marc-L
    eric
    Que c'est lassant quand le temps nous manque de réfléchir à tous les contours pour formuler une idée avec des termes clairs sans ambiguïtés.

    Oui c'est visible au niveau application.

    parmi, immédiatement après le clic envoyant ma réponse, je me suis rendu que j'ai été trop rapide à l'image du message qui succéda a mon premier post. Message qui a été instantanément corrigé à plusieurs reprises (m'amenant d'ailleurs à supprimer un post qui répondait directement à un message qui n'était plus ce qu'on voit et qui avait trop vite contredit avant de se corriger).

    Aussi soyons clair: le but de ma contribution n'est motivé que par une volonté d'apporter des précisions supplémentaires à des notions importantes qui me semblent occultés voir ignorés volontairement ou non. (Ce sera toujours utile à ceux qui ne les savent pas).
    Pour être précis, il n'y a pas de volonté de rivalité ou de démonstration de compétence quelconque par rapport à un autre ici (ce qui serait ennuyant pour moi en tous cas, car je ne vois pas de concours de compétence digne de ce nom à travers de simples sollicitations d'internautes en difficultés, je ne participerais pas a ce genre d'idioties), nous sommes tous des maîtres quelque part.

    Ceci dit revenons a nos moutons :
    J'ai tout de suite pensé que la visibilité de cette variable reste au niveau projet, mais une autre particularité va me venir aussitôt dans la tête en rapport avec les concepts fondamentaux du langage presqu'identique dans tous les autres langages de programmation.
    Ceci marche bien au niveau application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Feuil1.Unprotect
    Feuil1.Range("a1") = 10 
    Feuil1.Protect
    Ce n'est pas une affirmation gratuite.
    Il suffit de se rappeler les principes basiques sur les espaces de noms des variables : Une question de priorité qui fait que l'un masque l'autre.
    Changer le nom de Feuil1 du projet contenant le code et le tour est joué.

    Bien sûr cela ne répond pas à ta question, mais t'apporte un éclairage intéressant à savoir n'est ce pas?

  19. #19
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    J'ai testé maintenant. Et tout ce que j'ai affirmé ci-haut concernant la possible visibilité de la variable codename au niveau appli est tout à fait faux .
    L'espace de noms propres au projet n'est pas partagé.

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

Discussions similaires

  1. [AC-2013] Syntaxe instruction VBA avec nz pour tester la valeur d'un compteur
    Par altor92 dans le forum VBA Access
    Réponses: 12
    Dernier message: 03/10/2017, 14h46
  2. Réponses: 2
    Dernier message: 08/12/2016, 19h52
  3. [Batch] Problème syntaxe avec condition if ( ) else () pour NT
    Par carreau dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 14/10/2011, 19h45
  4. Réponses: 3
    Dernier message: 24/02/2005, 16h48
  5. Réponses: 19
    Dernier message: 24/05/2002, 17h36

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