Tester si une Sub existe grâce à son nom
Orbital38
Messages postés
71
Date d'inscription
Statut
Membre
Dernière intervention
-
NHenry Messages postés 15235 Date d'inscription Statut Modérateur Dernière intervention -
NHenry Messages postés 15235 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Je voulais savoir si il y avait une commande pour tester par une variable String si une macro du même nom existe.
Du style :
C'est parce que je gère l'appelle de macro part une image dans un UserForm et je crée cette image avec une fonction. Un des paramètres de cette fonction est le nom de la macro. Puis plus loin dans le code, pour appeler la macro je fais
Merci d'avance. J'ai un doute quant à la possibilité de faire ça. x)
Après au fond si ça plante je suis vite fixé pour savoir si un truc va pas mais je voudrais un truc plus soft que le debug.
PS : J'utilise le VBA
Je voulais savoir si il y avait une commande pour tester par une variable String si une macro du même nom existe.
Du style :
For Each Sub in Module1
If nom_macro = Sub.Name Then
Application Run nom_macro
Else
MsgBox "La Macro n'existe pas"
End If
Next Sub
C'est parce que je gère l'appelle de macro part une image dans un UserForm et je crée cette image avec une fonction. Un des paramètres de cette fonction est le nom de la macro. Puis plus loin dans le code, pour appeler la macro je fais
Application Run nom_dans_fonction_image, et la macro se lance. Mais si jamais j'écris mal le nom d'une macro j'aimerai afficher un message plutôt qu'essayer de continuer le code et de tout faire buguer.
Merci d'avance. J'ai un doute quant à la possibilité de faire ça. x)
Après au fond si ça plante je suis vite fixé pour savoir si un truc va pas mais je voudrais un truc plus soft que le debug.
PS : J'utilise le VBA
2 réponses
-
A ma connaissance, cela n'est pas possible en VBA, en VB.NET, c'est faisable avec Reflection, mais en VB6/A, aucun mécanisme n'est prévu.
-
-
Application.Run permettant de lancer une fonction/sub, il y a des mécanismes similaires d'appel, Il est possible d'utiliser Excel à partir de .NET, mais c'est pas super évident, Reflection n'est pas non plus facile, car il faut bien comprendre la logique de construction du framework et de ses principes sous-jacents.
En l'état, si tu y arrive avec un On Error, ce sera plus simple.
Voir ce petit article avant de te lancer :
https://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net -
Hop, favori. Merci. =)
De toute façon je vais y aller mollo. Déjà je vais passer en VB.NET petit à petit mes fonctions/sub/module et y aller pas à pas. Faire des tests à part si j'ai trop d'erreur pour savoir d'où vient le problème de syntaxe. ^^
Par contre je n'ai absolument aucune idée de comment est construit le "framework" (aucune idée de ce que ça veut dire aussi d'ailleurs XD).
Edit : je vais ressortir mes cours de C++ pour revoir la construction typique d'un petit programme avec les constructeur, destructeur, etc... -
-
-
bonjour,
En vba ....Oui c'est faisable ... il suffit de regarder les codes de manipulation du visual basir editor (vbe).
https://www.mrexcel.com/board/threads/vba-function-to-check-if-a-particular-macro-exists.284317/#post1397461'================================================================================= '- CHECK IF A MODULE & SUBROUTINE EXISTS '- VBA constant : vbext_pk_Proc = All procedures other than property procedures. '- An error is generated if the Module or Sub() does not exist - so we trap them. '--------------------------------------------------------------------------------- '- VB Editor : Tools/References - add reference TO ...... '- .... "Microsoft Visual Basic For Applications Extensibility" '---------------------------------------------------------------------------------- '- Brian Baulsom October 2007 '================================================================================== Sub MacroExists() Dim MyModule As Object Dim MyModuleName As String Dim MySub As String Dim MyLine As Long '--------------------------------------------------------------------------- '- test data MyModuleName = "TestModule" MySub = "Number2" '---------------------------------------------------------------------------- On Error Resume Next '- MODULE Set MyModule = ActiveWorkbook.VBProject.vbComponents(MyModuleName).CodeModule If Err.Number <> 0 Then MsgBox ("Module : " & MyModuleName & vbCr & "does not exist.") Exit Sub End If '----------------------------------------------------------------------------- '- SUBROUTINE '- find first line of subroutine (or error) MyLine = MyModule.ProcStartLine(MySub, vbext_pk_Proc) If Err.Number <> 0 Then MsgBox ("Module exists : " & MyModuleName & vbCr _ & "Sub " & MySub & "( ) : does not exist.") Else MsgBox ("Module : " & MyModuleName & vbCr _ & "Subroutine : " & MySub & vbCr _ & "Line Number : " & MyLine) End If End Sub
Pour savoir quelles autres possibilités tu as concernant la manipulation du VBE par VBA.. tu peux regarder ceci : http://www.cpearson.com/excel/vbe.aspx
Tu trouveras aussi de très bons exemples sur developpez.com
https://silkyroad.developpez.com/VBA/VisualBasicEditor/
.-
Jamais entendu parlé de VBE. XD
Merci en tout cas, j'essaierai ça dans 2/3 jours après mon week-end dans le Sud. :p
Si je passe en VB.NET je suppose que, si je n'utilise pas Reflection, je pourrais tout de même écrire :Set MyModule = VBProject.vbComponents(MyModuleName).CodeModule
ou tout du moins son équivalent en VB.NET, non ? Je ne pose la question que sur cette ligne car c'est la seule qui implique obligatoirement du VBA avec ActiveWorkbook (à mes yeux seulement bien sûr ^^). -
-