Bonjour à tous,
si jamais vous cherchez à savoir si un classeur a une procédure d'ouverture (Workbook_Open), le bout de code suivant devrait vous intéresser :
A noter que pour fonctionner, vous devrez au préalable cocher la référence Microsoft VB for Applications Extensibility (version 5.3 me concernant), et cocher la case "accès approuvé au modèle d'objet du projet VBA" (onglet Paramètres des macros)
A noter que le code peut s'adapter aux recherches d'autres procédures.
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 Sub detectionWorkbook_open() Dim wb As Workbook Dim a As Long Dim strpath As String Application.EnableEvents = False 'Emplacement du fichier à tester strpath = "C:\temp\test.xlsm" Set wb = Application.Workbooks.Open(strpath) With wb.VBProject.VBComponents("ThisWorkbook") On Error Resume Next a = .CodeModule.ProcBodyLine("Workbook_Open", vbext_pk_Proc) If Err.Number > 0 Then MsgBox "Aucune procédure Workbook_Open dans le classeur " & strpath Else MsgBox "Le classeur " & strpath & " contient bien une procédure Workbook_Open" End If End With wb.Close False End Sub
J'ai généralisé le code en conséquence pour en faire une fonction booleenne à laquelle on passe un emplacement de fichier, un nom de module et un nom de fonction/procédure.
En espérant que cela puisse être utile au plus grand nombre
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 Function Existence_Fonction_Procedure_Dans_Module_de_Classeur(strPath As String, strModuleName As String, strSubFunctionName As String) As Boolean Dim wb As Workbook Dim Comp As Object Dim Code As Object Dim a As Long Dim i As Integer Application.EnableEvents = False Set wb = Application.Workbooks.Open(strPath) On Error Resume Next With wb.VBProject.VBComponents(strModuleName) a = .CodeModule.ProcBodyLine(strSubFunctionName, vbext_pk_Proc) End With If Err.Number > 0 Then Existence_Fonction_Procedure_Dans_Module_de_Classeur = False Else Existence_Fonction_Procedure_Dans_Module_de_Classeur = True End If wb.Close False End Function
Partager