Tester si une Sub existe grâce à son nom

Fermé
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020 - Modifié par Orbital38 le 6/08/2015 à 22:37
NHenry Messages postés 15163 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 1 novembre 2024 - 7 août 2015 à 15:37
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 :
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

NHenry Messages postés 15163 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 1 novembre 2024 345
6 août 2015 à 23:06
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.
0
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020
6 août 2015 à 23:07
D'acc, merci. =)

Je vais DL visual studio community là. Faut bien que je me lance en VB.NET.
Le seul truc dont j'ai peur c'est que Application.Run ne marche plus (ou d'autres trucs du genre).

Je garde le Reflection dans un coin de ma tête en tout cas. ^^
0
NHenry Messages postés 15163 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 1 novembre 2024 345
6 août 2015 à 23:15
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
0
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020
Modifié par Orbital38 le 6/08/2015 à 23:26
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...
0
NHenry Messages postés 15163 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 1 novembre 2024 345
7 août 2015 à 00:00
Il y a pas mal de tutoriels sur le net, tu pourras bien débuter facilement.
0
jordane45 Messages postés 38290 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 18 novembre 2024 4 703
7 août 2015 à 01:39
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/

.
0
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020
Modifié par Orbital38 le 7/08/2015 à 10:03
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 ^^).
0
NHenry Messages postés 15163 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 1 novembre 2024 345
7 août 2015 à 15:37
J'avais vaguement entendu parlé de l'automatisation VBE, je viens d'apprendre des choses, merci Jordane :)
0