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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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

  10. #10
    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 :-)

+ 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, 13h46
  2. Réponses: 2
    Dernier message: 08/12/2016, 18h52
  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, 18h45
  4. Réponses: 3
    Dernier message: 24/02/2005, 15h48
  5. Réponses: 19
    Dernier message: 24/05/2002, 16h36

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