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 :

ThisWorkBook dans une variable public [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 274
    Par défaut ThisWorkBook dans une variable public
    Bonjour,

    mon titre n'est peut être pas très parlant mais voilà (d'après mes recherches on ne peut pas faire)

    dans mes modules j'ai souvent besoin d'accèder au dossier parent, je le fais comme ceci dans chaque module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    twb as String
    twb = Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.Path, "\") - 1)
    Plutôt que définir dans chaque module je voudrai déclarer "twb" en "Public" dans le module qui contient mes constantes "Public"

    Le fait que ce ne soit pas une constante me semble impossible

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    tu peux créer une variable publique de type String, et lui affecter le chemin du dossier dans la procédure Workbook_Open()

  3. #3
    Membre chevronné
    Inscrit en
    Avril 2008
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 264
    Par défaut
    Bonjour à tous,

    Une autre solution consiste à rajouter le code suivant dans le module ThisWorkbook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Property Get ParentFolder() As String
    Static sPath As String
        If sPath Like vbNullString Then sPath = Left(Me.Path, InStrRev(Me.Path, "\") - 1)
        ParentFolder = sPath
    End Property
    Ainsi, tu peux accéder à cette information dans ton projet via ThisWorkbook.ParentFolder.

    A+

  4. #4
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 274
    Par défaut
    Merci à tous

    #2 me semble plus simple

    Je n'avais pas pensé à cette soluion

  5. #5
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 274
    Par défaut
    Après tests cela fonctionne très bien

    Merci

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 135
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Personnellement, je ne suis pas partisan de l'usage de variable publique. Je privilégie, l'usage d'une fonction générique

    Exemple d'une fonction qui renvoie le dossier parent du classeur passé par argument (si l'argument est vide, c'est ThisWorkbook (a remplacer éventuellement par AciveWorkbook)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function GetFolderParent(Optional oWorkbook As Workbook)
      If oWorkbook Is Nothing Then Set oWorkbook = ThisWorkbook
      GetFolderParent = Left(oWorkbook.Path, InStrRev(oWorkbook.Path, "\") - 1)
    End Function
    Exemple d'une procédure qui l'invoque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub TestGetFolderParent()
      Dim twb As String
      twb = GetFolderParent()
      Debug.Print twb
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 561
    Par défaut
    Bonjour,
    ThisWorkbook.Path est bien plus pertinent qu'une variables public.
    Ce code est absurde ThisWorkbook.Path n'a jamais de "\"
    Code absurde : Sélectionner tout - Visualiser dans une fenêtre à part
    Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.pth & "\")

  8. #8
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 274
    Par défaut
    #6

    Je pensai justement que l'utilisation de variables publique étaient faites pour être "Publique" et donc éviter de les définir dans chaque module

    Je vais tester la fonction générique

    #8
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    twb = Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.path & "\")
    Ce code est absurde...
    Malgré votre grande expertise il ne faut pas juger. Dans mon cas le / est utile pour atteindre directement tous mes classeurs dans le dossier parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThisWorkbook.path &  "\" & nomfichier.xlsm
    est juste remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    twb  & nomfichier.xlsm

  9. #9
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Bonjour,
    ThisWorkbook.Path est bien plus pertinent qu'une variables public.
    Ce code est absurde ThisWorkbook.Path n'a jamais de ""
    Code absurde : Sélectionner tout - Visualiser dans une fenêtre à part
    Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.pth & "\")
    Je ne vois pas ce qu'il y a d'absurde à ce code, au contraire.
    Si on se donne la peine de le comprendre, et de le recopier juste, il est parfait.

    un exemple : Si Thisworkbook.path = C:\Data\IT, il renvoie c:\data\
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.path, "\"))
    Bonne journée.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. :zen::ptdr:. Si vous êtes aidé, pensez à Voter.:ave:

  10. #10
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 561
    Par défaut
    ThisWorkbook.Path ce n'est pas une définition c'est une variable publique
    ThisWorkbook.Path et twb c'est la même chose sauf qu'ils faut définir ta variable et l'initialiser alors que ThisWorkbook.Path est initialiser par défaut a l'ouverture du fichier.

    C'est à mon sans inutile de décaler en public, ou en privé dans toutes tes méthodes une variable twb alors que tu disposes en native ThisWorkbook.Path qui tout compte fait fait la même chose.

    ThisWorkbook veut dire le classeur qui exécute la macro tu trouveras rien de mieux pour connaître les informations de ce classeur.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 472
    Par défaut
    Hello,

    Petite correction:
    ThisWorkbook est une fonction, qui renvoie une référence vers le classeur contenant le code, ce n'est donc pas une variable.

    Ensuite, concernant les chemins, plutôt que se faire chier à gérer manuellement l'antislash de fin, la bibliothèque FSO prend cela en charge (le l'antislash soit présent ou non).
    FSO est également capable de construire des chemins, toujours en prenant en charge la presence / absence d'antislash.
    Exemples:
    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
    Option Explicit
     
    Sub test()
        Dim Fso As Scripting.FileSystemObject
        Set Fso = CreateObject("Scripting.FileSystemObject")
     
        Dim ParentFolder As Scripting.Folder
     
        Const Path1 As String = "C:\Projects\Gimp"
        Set ParentFolder = Fso.GetFolder(Path1).ParentFolder
        Debug.Print ParentFolder.Path       '// affiche c:\Projects
     
        Const Path2 As String = "C:\Projects\Gimp\"
        Set ParentFolder = Fso.GetFolder(Path1).ParentFolder
        Debug.Print ParentFolder.Path       '// affiche c:\Projects
     
     
        Dim Path As String
        Path = Fso.BuildPath("C:\Projects", "something.dat")
        Debug.Print Path    '// Affiche C:\Projects\something.dat
     
        Path = Fso.BuildPath("C:\Projects\", "something.dat")
        Debug.Print Path    '// Affiche C:\Projects\something.dat
    End Sub

  12. #12
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 561
    Par défaut
    Bonjour,
    Je confirme c'est absurde.

    Maintenant donnes moi ton avis ThisWorkbook.Path retour un \ à la fin ?

    Nom : Test.gif
Affichages : 47
Taille : 63,7 Ko
    right(ThisWorkbook.Path,1)

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 472
    Par défaut
    D'autant que, toujours grâce à la bibliothèque magique FSO, obtenir le chemin du dossier parent est trivial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function GetParentFolderPath(ByVal Path As String) As String
        Debug.Assert Path <> vbNullString   '// pas obligatoire mais souhaitable
     
        Dim FSO As Object    '// Scripting.FileSystemObject
        Set FSO = CreateObject("Scripting.FileSystemObject")
     
        Dim Folder As Object    '// Scripting.Folder
        Set Folder = FSO.GetFolder(Path)
        Debug.Assert Not Folder.IsRootFolder    '// pas obligatoire mais souhaitable
     
        GetParentFolderPath = Folder.ParentFolder.Path
    End Function

  14. #14
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 561
    Par défaut
    Bonjour,
    Oui je confirme, si l'idée est de retourner le premier partent on utilisera un outil capable de gérer les fichiers et les répertoires plutôt que d'analyser le chemin de l'arborescence.
    ThisWorkbook.Path="\\serveur"

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/01/2016, 10h18
  2. [AC-2010] Utiliser une variable public dans une macro
    Par ptitga dans le forum Contribuez
    Réponses: 2
    Dernier message: 28/03/2014, 11h37
  3. Déclarer une variable public dans un Sub
    Par dragondumond dans le forum VB.NET
    Réponses: 3
    Dernier message: 09/04/2013, 13h16
  4. Rendre une variable public dans mon main
    Par djorfe dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 13/06/2008, 10h49
  5. Réponses: 1
    Dernier message: 27/02/2007, 11h28

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