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 :

Récupérer le nom de la procédure appelante [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    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 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut Récupérer le nom de la procédure appelante
    Bonjour,

    lors de l'appel d'une fonction ou procédure via une cellule, une forme, un bouton etc... nous avons la possibilité de remonter sur l'objet appelant via l'instruction Application.Caller

    Je cherche à faire la même chose, mais pour obtenir le nom d'une Sub qui en a appelé une autre

    un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub MacroPrincipale()
        Call MacroSecondaire
    End Sub
     
    Sub MacroPrincipaleBIS()
        Call MacroSecondaire
    End Sub
     
    Sub MacroSecondaire()
    ' afficher le nom de la procédure appelante
    ' - soit MacroPrincipale
    ' - soit MacroPrincipaleBIS
    End Sub
    Par quel moyen puis-je faire, pour l'exemple, un Msgbox dans MacroSecondaire qui afficherait "MacroPrincipale" OU "MacroPrincipaleBIS" suivant la sub qui a effectivement effectué l'appel ?


    Ceci, bien entendu, sans transmettre en paramètre un String contenant le nom de la procédure
    grosso modo, je ne cherche pas ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub MacroPrincipale()
        Call MacroSecondaire("MacroPrincipale")
    End Sub
     
    Sub MacroPrincipaleBIS()
        Call MacroSecondaire("MacroPrincipaleBIS")
    End Sub
     
    Sub MacroSecondaire(Appelante As String)
        MsgBox Appelante
    End Sub

    Ps : je n'ai pas creusé énormément sur la manipulation du VBE, en inspectant les modules actifs, etc... car le projet sera verrouillé tout comme l'accès approuvé au modèle objet du projet VBA.

  2. #2
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Pour ma part j'ai creusé un peu l'idée et ...

    Et c'est plutôt embêtant car il n'y a, à priori, aucun moyen d'accéder à la pile de procédures programmatiquement. On peut y accéder via l'éditeur VBE (Affichage --> Pile des appels en FR)
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Salut,

    ca risque de faire un peu usine a gaz, mais en passant par une logique d'empilement/depilement des appels, on arriverait a quelque chose.

    Je ne trouve que cette solution anglophone, mais j'utilise la meme chose avec Access et la gestion d'appels successifs de formulaires

    http://etutorials.org/Microsoft+Prod...ocedure+Stack/

    Je tacherai de faire un tutoriel a ce sujet ulterieurement tiens
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  4. #4
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Une usine à gaz peut-être, mais après de longues recherches (j'en avais besoin pendant un moment mais j'ai finalement contourné le problème), c'est la première solution qui semble fonctionnelle que je vois (et probablement l'une des très rares seules).
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    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 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    merci pour les pistes

    jpcheck, très intéressant, j'avais trouvé d'autres pistes sur des forums VB.NET pour stacker au fur et à mesure.

    Hélas, c'est une bombe atomique pour désherber mon petit jardin, mais je vais quand même analyser ça pour ma culture (et si jamais un jour le besoin s'en fait sentir).


    en fait, le cadre est trop simple pour déployer une telle architecture, puisque c'était uniquement pour dissocier 2 appels différents sur la même procédure. Et je voulais éviter de multiplier les espaces à maintenir en cas d'évolution du code.

    En attendant d'autres possibles pistes, je vais rester sur la transmission en paramètre du nom de la procédure, ou utiliser une variable globale toute bête.

    Mais je m'étais visiblement pas trompé en me disant que finalement, il n'y a pas d'instruction ou méthode pré existante

  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
    Une solution "bricolée" pourrait être de créer une variable String de visibilité Public hors sub, de dimension 2.
    En tout début de chaque modules, tu mets ces deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyCaller(2) = MyCaller(1)
    MyCaller(1) = "Nom du Sub"
    Ainsi, tu pourras toujours consulter MyCaller(2) pour connaitre le nom de l'application appelante.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    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 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour Menhir,

    merci pour la participation.

    L'idée est effectivement différente que de passer un paramètre à la procédure appelée. Cependant l'essence reste la même, c'est à dire qu'il y a de la maintenant à faire.

    Et là, la maintenance est alourdie par rapport au paramètre

    [mode taquin]ton tableau il est de dimension 1 et contient 2 éléments si tu est en base 1 [/mode taquin]

    pour vous tous

    Je marque en "résolu" pour une meilleur lisibilité du forum, mais si quelqu'un a d'autres propositions, qu'il n'hésite surtout pas


    Ps : celui qui a voté -1 pour Menhir ??? Je comprend pas bien la démarche, il est clairement dans le sujet et jette un regard neuf sur les propositions déjà faites ....

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 185
    Points : 167
    Points
    167
    Par défaut
    Bonjour,
    J'avais fait un truc à une époque en VBA que j'avais également aisément transféré en VB6. Ca demandait une certaine rigueur au départ mais ça couvrait très bien ce genre de situation et même plus...
    Mais je n'arrive plus à mettre la main sur ce code (en fait si, je l'ai dans ma messagerie mais je n'arrive pas à le télécharger car il faisait parti d'un plus gros projet et j'ai 17Mo de code... J'ai l'impression que ma boîte courriel a du mal à le gérer).
    Bref, de mémoire, c'était quelque chose comme ça :
    1 - Dans une classe de gestion d'erreur instancié en global, déclaration d'une variable interne d'un tableau dynamique à une dimension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim gstr_StackTrace() As String ' Pile d'appel
    2 - La classe de gestion d'erreurs avec 2 fonctions :
    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
    Sub Initialize(pstr_Run As String, ParamArray pvar_ParameterList() As Variant)
    On Error Goto ErrorManager
     
    Dim lint_Size As Int
     
    lint_Size = UBound(gstr_StackTrace) + 1 // Taille du nouveau tableau
    ReDim Preserve gstr_StackTrace(lint_Size) // Redimensionner le tableau
     
    gstr_StackTrace(lint_Size) = pstr_Run // Enregistrer la procédure (Sub) ou fonction (Function) appelante
     
    ... [code de log dont l'enregistrement de tous les paramètres] ...
     
    Exit Sub
     
    ErrorManager:
    MsgBox "Erreur dans le module de gestion d'erreur (Initialize pour "& pstr_Run  & ")." 
    End Sub
     
    Sub Finalize(perr_Error As ErrorObject, pobj_Result As Object)
    On Error Goto ErrorManager
     
    If perr_Error.Number = 0 then
    ... [code de log dont l'enregistrement du résultat si c'était une fonction]
    Else
    ... [code de log gérant l'erreur]
    End If
     
    ReDim Preserve gstr_StackTrace(UBound(gstr_StackTrace) - 1) // Réduire la taille du tableau
     
    Exit Sub
     
    ErrorManager:
    MsgBox "Erreur dans le module de gestion d'erreur (Finalize)."
    End Sub
    3 - Organisation du code des autres fonctions ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub / Function toto(xxx As yyy) [As zzz]
    Const cstr_Run As String = "toto"
     
    On Error Goto ErrorManager
     
    ErrorManager.Initialize cstr_Run, xxx // Ajouter les paramètres ici
     
    ... [code...] ...
     
    ErrorManager:
    ErrorManager.Finalize // , lvar_Result // A ajouter si c'est une fonction
    End Sub / Function
    La seule contrainte que cela impose, c'est de ne pas sortir de la procédure ou de la fonction par un Exit Sub/Function, tout devait passer par le gestionnaire d'erreur avant de sortir.

    Si j'arrive à récupérer ce code, je le mettrais ici à disposition, la seule chose que je demanderais à ce moment là, c'est qu'en cas d'évolution de ce code pour corriger un bug ou pour développer une autre fonctionnalité à laquelle je n'ai pas pensé, n'hésitez pas à me le retourner.

    Je vais chercher cela pour le mettre ici...

    P.S. : Dois-je vraiment investir du temps pour cela, je n'avais pas fait attention aux dates de poste !!!

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

Discussions similaires

  1. Récupérer le nom de la procédure active
    Par zak_mckraken dans le forum VBA Access
    Réponses: 2
    Dernier message: 02/09/2009, 19h32
  2. Récupérer le nom de la méthode appelante
    Par benratti dans le forum Langage
    Réponses: 6
    Dernier message: 19/09/2007, 09h55
  3. Récupérer le nom de la page appelante
    Par dessinateurttuyen dans le forum Langage
    Réponses: 2
    Dernier message: 31/07/2006, 17h43
  4. comment connaitre le nom de la procédure appelante
    Par korntex5 dans le forum Delphi
    Réponses: 5
    Dernier message: 23/06/2006, 14h59

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