Comment obtenir le nom de la procédure ou de la fonction à l'exécution?
Est-il tout façon de retourner le nom d'une fonction ou d'une procédure au moment de l'exécution?
Je suis actuellement à la gestion des erreurs quelque chose comme ceci:
Sub foo()
Const proc_name as string = "foo"
On Error GoTo ErrHandler
' do stuff
ExitSub:
Exit Sub
ErrHandler:
ErrModule.ShowMessageBox "ModuleName",proc_name
Resume ExitSub
End Sub
J'ai récemment vécu une de mes constantes mentir à moi après que j'ai mis à jour le nom d'une fonction, mais pas la valeur de la constante. Je veux retourner le nom de la procédure à mon gestionnaire d'erreur.
Je sais que je vais avoir à interagir avec les VBIDE.CodeModule
objet à trouver. J'ai fait un peu de méta-programmation avec Microsoft Visual Basic pour Applications la bibliothèque, mais je n'ai pas eu de succès avec cette lors de l'exécution. Je n'ai pas mes précédentes tentatives, et avant que je creuse mes talons pour essayer encore une fois, je veux savoir si c'est même à distance possible.
Choses qui ne fonctionnent pas
- À l'aide de certains VBA intégré de la Bibliothèque pour accéder à la pile d'appel. Il n'existe pas.
- Mettre mon propre pile d'appel, en poussant et en sautant le nom d'une procédure à partir d'un tableau que je suis entrée et de sortie de chacun. Il faut quand même que je passe le proc nom d'ailleurs, comme une chaîne de caractères.
- Un outil tiers comme vbWatchDog. Cette ne travail, mais je ne peux pas utiliser un outil tiers pour ce projet.
Note
vbWatchdog semble le faire en accédant directement à la mémoire du noyau via les appels d'API.
source d'informationauteur RubberDuck
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas tout à fait sûr de savoir comment cela est utile va être...
La bonne chose est que vous n'aurez pas à vous soucier de la sub/nom de la fonction - vous êtes libre de le modifier. Tout ce que vous avez des soins à ce sujet est la de l'unicité du gestionnaire d'erreur, le nom de l'étiquette.
Par exemple
si vous pouvez éviter une double erreur de gestionnaire d'étiquettes dans les différentes sous-marins/fonctions
ne pas faire ⇩⇩⇩⇩⇩
puis le code ci-dessous devrait travail.
Note: je n'ai pas pu le tester à fond, mais je suis sûr que vous pouvez le modifier et le faire fonctionner si elle est d'aucun secours.
Remarque: Ajouter des références à
Visual Basic for Applications Extensibility 5.3
via Outils -> Références dans VBE- Je utiliser lié nœud en fonction de la pile de la classe enveloppé dans un singleton, à l'échelle mondiale instanciées (fait par des Attributs)
CallStack
classe. Il me permet d'effectuer la gestion d'erreur comme David Zemens suggère (en enregistrant le nom de la procédure à chaque fois):S'il serait utile à la discussion, je peux poster le code associé. La Pile des appels de classe a un
Peek
méthode pour trouver le plus récemment fonction appelée est et unStackTrace
fonction pour obtenir une chaîne de caractères en sortie de l'ensemble de la pile.Plus précisément à votre question, j'ai toujours été intéressé dans l'aide de VBA Extensibilité pour ajouter de la chaudière-plaque de code de gestion d'erreur (comme ci-dessus) automatiquement. Je n'ai jamais eu l'occasion de le faire réellement, mais je crois que c'est tout à fait possible.
Utilisation Err.Soulever
Pour le paramètre Source pass:
Ajouter cette fonction dans n'importe quel module que vous aimez:
Et puis dans votre sub/function utiliser comme Err Gestionnaire: