Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Analyse d'un module VBA contenant beaucoup de macros

8 réponses
Avatar
M41
Bonjour

Existe t il un programme qui liste les macros subs et Functions d'un module
et donne pour chaque macro la liste des subs et Functions directement
utilisés ?

Cordialement

M41

8 réponses

Avatar
Modeste
Bonsour® M41 avec ferveur ;o))) vous nous disiez :

Existe t il un programme qui liste les macros subs et Functions d'un
module et donne pour chaque macro la liste des subs et Functions
directement utilisés ?



à une époque.... j'avais utilisé avec satisfaction cela de Stephen Bullen

http://www.oaltd.co.uk/DLCount/DLCount.asp?fileÊllTree.zip
This routine reads all of the modules in selected open workbooks, extracting a complete list of procedures and the calls between them.
From this it generates some pivot tables, enabling you to easily identify which procedures call, or are called by another procedure
and how many calls there are between the modules.
Finally, it displays a procedure flow diagram for the workbook in a tree structure.
The zip file contains a single xls file, which is hidden when opened.
This update fixes a few problems reported by some users and also handles multi-workbook projects (when referenced using Tools, References).
Documentation is included in the zip file.

j'avais réussi à bidouiller pour le fonctionnement avec Excel 2002
je ne sais pas si cela fonctionne encore avec Excel 2003 et encore moins avec Excel 2007 :-(
Avatar
fetnat
Bonjour,


FYI

Avec XL2003, CallTree ne voit pas le classeur ouvert.
On voit l'accès à la procédure par le menu Outils Create procedure Calltree

La fenêtre suivant reste vide.

Snif...

Si un expert a une version actualisée 2003, merci d'avance.

fetnat



Le 22/12/2009 00:55, Modeste a écrit :
Bonsour® M41 avec ferveur ;o))) vous nous disiez :

Existe t il un programme qui liste les macros subs et Functions d'un
module et donne pour chaque macro la liste des subs et Functions
directement utilisés ?



à une époque.... j'avais utilisé avec satisfaction cela de Stephen Bullen

http://www.oaltd.co.uk/DLCount/DLCount.asp?fileÊllTree.zip
This routine reads all of the modules in selected open workbooks, extracting a complete list of procedures and the calls between them.
From this it generates some pivot tables, enabling you to easily identify which procedures call, or are called by another procedure
and how many calls there are between the modules.
Finally, it displays a procedure flow diagram for the workbook in a tree structure.
The zip file contains a single xls file, which is hidden when opened.
This update fixes a few problems reported by some users and also handles multi-workbook projects (when referenced using Tools, References).
Documentation is included in the zip file.

j'avais réussi à bidouiller pour le fonctionnement avec Excel 2002
je ne sais pas si cela fonctionne encore avec Excel 2003 et encore moins avec Excel 2007 :-(





Avatar
fetnat
dans ce bout de code, oSource.Name <> ThisWorkbook.Name ont le même
fichier "calltree.xls", du coup on ne passe pas dans la boucle.


'Get list of all open workbooks containing modules, excluding this file
i = 1
ReDim asFiles(1)
For Each oSource In Workbooks
If oSource.Modules.Count > 0 And oSource.Name <> ThisWorkbook.Name Then
ReDim Preserve asFiles(i)
asFiles(i) = oSource.Name
i = i + 1
End If
Next




Le 22/12/2009 10:29, fetnat a écrit :

Bonjour,


FYI

Avec XL2003, CallTree ne voit pas le classeur ouvert.
On voit l'accès à la procédure par le menu Outils Create procedure Calltree

La fenêtre suivant reste vide.

Snif...

Si un expert a une version actualisée 2003, merci d'avance.

fetnat



Le 22/12/2009 00:55, Modeste a écrit :
Bonsour® M41 avec ferveur ;o))) vous nous disiez :

Existe t il un programme qui liste les macros subs et Functions d'un
module et donne pour chaque macro la liste des subs et Functions
directement utilisés ?



à une époque.... j'avais utilisé avec satisfaction cela de Stephen Bullen

http://www.oaltd.co.uk/DLCount/DLCount.asp?fileÊllTree.zip
This routine reads all of the modules in selected open workbooks,
extracting a complete list of procedures and the calls between them.
From this it generates some pivot tables, enabling you to easily
identify which procedures call, or are called by another procedure
and how many calls there are between the modules.
Finally, it displays a procedure flow diagram for the workbook in a
tree structure.
The zip file contains a single xls file, which is hidden when opened.
This update fixes a few problems reported by some users and also
handles multi-workbook projects (when referenced using Tools,
References).
Documentation is included in the zip file.

j'avais réussi à bidouiller pour le fonctionnement avec Excel 2002
je ne sais pas si cela fonctionne encore avec Excel 2003 et encore
moins avec Excel 2007 :-(









Avatar
michdenis
Bonjour,

Cette macro liste toutes les procédures et les fonctions
de tous les modules d'un classeur.

Dans la procédure, tu dois indiquer le classeur de ton choix.
Évidemment, ce classeur doit être ouvert !

Il faut ajouter la référence : "OBLIGATGOIRE"
"Microsoft Visual Basic For Application Extensibility 5.3"

'-----------------------------------
Sub ListeMacrosModule()

Dim Wbk As Workbook, Sh As Worksheet
Dim VBCodeMod As Object, Comp As Object, C As Object
Dim StartLine As Long, i As Long, ProcName As String

'Identifie le classeur source où sont les procédures
Set Wbk = Workbooks("Classeur4.XLS") 'ou ce que tu veux

'Détruit la feuille si elle existe déjà.
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("MesProcs").Delete
Application.DisplayAlerts = True

'Ajoute une feuille au projet où sera fait le listing
Set Sh = Wbk.Worksheets.Add
'Nomme la feuille
Sh.Name = "MesProcs"

i = 1
'Boucle sur toutes les modules du projet, incluant le formulaire.
For Each C In Wbk.VBProject.VBComponents
Set Comp = C
sds = C.Name
Set VBCodeMod = Wbk.VBProject.VBComponents(C.Name).CodeModule

With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine >= .CountOfLines
Sh.Cells(i, 1).Value = .ProcOfLine(StartLine, vbext_pk_Proc)
StartLine = StartLine + .ProcCountLines(.ProcOfLine(StartLine, _
vbext_pk_Proc), vbext_pk_Proc)
Sh.Cells(i, 1).Offset(, 1).Value = .Name
StartLine = StartLine + 1
i = i + 1
Loop
End With
Next

Set VBCodeMod = Nothing: Set Comp = Nothing: Set C = Nothing
Set Wk = Nothing: Set Sh = Nothing
End Sub
'-----------------------------------



"M41" a écrit dans le message de groupe de discussion :
4b3004d8$0$907$
Bonjour

Existe t il un programme qui liste les macros subs et Functions d'un module
et donne pour chaque macro la liste des subs et Functions directement
utilisés ?

Cordialement

M41
Avatar
fetnat
Merci michdenis, encore une pièce de plus.

fetnat


Le 22/12/2009 16:06, michdenis a écrit :
Bonjour,

Cette macro liste toutes les procédures et les fonctions
de tous les modules d'un classeur.

Dans la procédure, tu dois indiquer le classeur de ton choix.
Évidemment, ce classeur doit être ouvert !

Il faut ajouter la référence : "OBLIGATGOIRE"
"Microsoft Visual Basic For Application Extensibility 5.3"

'-----------------------------------
Sub ListeMacrosModule()

Dim Wbk As Workbook, Sh As Worksheet
Dim VBCodeMod As Object, Comp As Object, C As Object
Dim StartLine As Long, i As Long, ProcName As String

'Identifie le classeur source où sont les procédures
Set Wbk = Workbooks("Classeur4.XLS") 'ou ce que tu veux

'Détruit la feuille si elle existe déjà.
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("MesProcs").Delete
Application.DisplayAlerts = True

'Ajoute une feuille au projet où sera fait le listing
Set Sh = Wbk.Worksheets.Add
'Nomme la feuille
Sh.Name = "MesProcs"

i = 1
'Boucle sur toutes les modules du projet, incluant le formulaire.
For Each C In Wbk.VBProject.VBComponents
Set Comp = C
sds = C.Name
Set VBCodeMod = Wbk.VBProject.VBComponents(C.Name).CodeModule

With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine>= .CountOfLines
Sh.Cells(i, 1).Value = .ProcOfLine(StartLine, vbext_pk_Proc)
StartLine = StartLine + .ProcCountLines(.ProcOfLine(StartLine, _
vbext_pk_Proc), vbext_pk_Proc)
Sh.Cells(i, 1).Offset(, 1).Value = .Name
StartLine = StartLine + 1
i = i + 1
Loop
End With
Next

Set VBCodeMod = Nothing: Set Comp = Nothing: Set C = Nothing
Set Wk = Nothing: Set Sh = Nothing
End Sub
'-----------------------------------



"M41" a écrit dans le message de groupe de discussion :
4b3004d8$0$907$
Bonjour

Existe t il un programme qui liste les macros subs et Functions d'un module
et donne pour chaque macro la liste des subs et Functions directement
utilisés ?

Cordialement

M41



Avatar
M41
Bonjour

Avec vos réponses j'ai constitué ce programme correspondant à ma question
initiale.
La résolution se fait en 2 passes.
Il faudrait encore le modifier pour avoir en colonne 3 les mots Sub ou
Function....
Cordialement
M41

================================================
'Il faut ajouter la référence :
'"Microsoft Visual Basic For Application Extensibility 5.3"
'
Sub ListeMacrosModule()
'
Dim V As Variant, A As String, B As String, Code As String, D As String, u
As Boolean
Dim i As Long, j As Long, k As Long, n As Long, L As Long, StartLine As
Long, L2 As Long, Lx As Long
Dim Wbk As Workbook, Sh As Worksheet
Dim VBCodeMod As Object, Comp As Object, C As Object, ProcName As String
'
Set Wbk = ThisWorkbook 's ("MonClasseur.XLS")
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("MesProcs").Delete
Application.DisplayAlerts = True
'
On Error GoTo Erreur_ListeMacrosModule
Set Sh = Wbk.Worksheets.Add
Sh.Name = "MesProcs"
ActiveWindow.Zoom = 75
'
i = 1
'Boucle sur toutes les modules du projet, incluant le formulaire.
For Each C In Wbk.VBProject.VBComponents
Set Comp = C
sds = C.Name
Set VBCodeMod = Wbk.VBProject.VBComponents(C.Name).CodeModule
'
With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine >= .CountOfLines
Sh.Cells(i, 1).Value = .Name
Sh.Cells(i, 2).Value = .ProcOfLine(StartLine, vbext_pk_Proc)
StartLine = StartLine + .ProcCountLines(.ProcOfLine(StartLine,
vbext_pk_Proc), vbext_pk_Proc)
StartLine = StartLine + 1
i = i + 1
Loop
End With
Next
'
V = Sh.Range("A1").CurrentRegion: m = UBound(V, 1)
i = 1
For Each C In Wbk.VBProject.VBComponents
Set Comp = C
sds = C.Name
Set VBCodeMod = Wbk.VBProject.VBComponents(C.Name).CodeModule
'
With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine >= .CountOfLines
A = .Name
B = .ProcOfLine(StartLine, vbext_pk_Proc)
Do: For j = 1 To m
If Cells(j, 1) = A Then
For k = j To m
If Cells(k, 2) = B Then L = CLng(k): Exit Do
Next k
End If
Next j: Exit Sub: Loop Until True
Lx = .ProcCountLines(.ProcOfLine(StartLine, vbext_pk_Proc),
vbext_pk_Proc)
L2 = StartLine + Lx
Code = .Lines(StartLine, Lx)
If Code <> "" Then
k = 3
For j = 1 To UBound(V, 1)
D = Sh.Cells(j, 2).Value
u = Not ((k = 3) And (B = D))
If InStr(1, Code, D) > 0 And u Then
Sh.Cells(L, k).Value = D: k = k + 1
If k > n Then n = k
End If
If k > 250 Then Sh.Cells(L, k).Value = ".../...": Exit For
Next j
End If
StartLine = L2 + 1
i = i + 1
Loop
End With
Next
'
With Sh
.Range(.Cells(1, 1), .Cells(m, n)).Sort Key1:=.Cells(1, 1),
Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:úlse, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
.Rows("1:1").Insert Shift:=xlDown
.Range("A1").FormulaR1C1 = "MODULES"
.Range("B1").FormulaR1C1 = "SUB/FONCTIONS"
.Range("C1").FormulaR1C1 = "APPELS."
.Range("A1").Select
.Columns("A:Z").ColumnWidth = 20
With .Rows("1:1"): .RowHeight = 40.5: .Font.Bold = True: End With
End With
'
Set VBCodeMod = Nothing: Set Comp = Nothing: Set C = Nothing
Set Wk = Nothing: Set Sh = Nothing
Exit Sub
Erreur_ListeMacrosModule:
Debug.Print "Erreur"
'
End Sub




"M41" a écrit dans le message de news:
4b3004d8$0$907$
Bonjour

Existe t il un programme qui liste les macros subs et Functions d'un
module et donne pour chaque macro la liste des subs et Functions
directement utilisés ?

Cordialement

M41



Avatar
michdenis
La procédure suivante liste toutes les procédures et fonctions
d'un classeur ouvert.

En colonne A:A se retrouve le nom de la procédure ou
de la fonction avec la spécification "Proc." ou "Fonct."
associée à chacune.
En Colonne B:B spécifie le module où se retrouve la procédure.

Attention, si tu travailles avec des modules de classe, les procédures
de type "Get", "Let", "Set" ne sauront pas inclus dans la liste retenue.
Si besoin, tu fais signe !

Tu dois définir la variable "Wbk" avec le nom du classeur désiré
La référence suivante doit être ajouté à ton projetVBA:
"Microsoft Visual Basic For Application Extensibility 5.3"

'-----------------------------------
Sub ListeMacrosModule()

Dim Wbk As Workbook, Sh As Worksheet
Dim VBCodeMod As Object, Comp As Object, C As Object
Dim StartLine As Long, i As Long, ProcName As String
Dim S As String, Texte As String, LeType As String

'Identifie le classeur source où sont les procédures
Set Wbk = Workbooks("MonClasseur.xls") 'ou ce que tu veux

'Détruit la feuille si elle existe déjà.
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("MesProcs").Delete
Application.DisplayAlerts = True

'Ajoute une feuille au projet où sera fait le listing
Set Sh = Wbk.Worksheets.Add
'Nomme la feuille
Sh.Name = "MesProcs"

i = 1
'Boucle sur toutes les modules du projet, incluant le formulaire.
For Each C In Wbk.VBProject.VBComponents
Set Comp = C
sds = C.Name
Set VBCodeMod = Wbk.VBProject.VBComponents(C.Name).CodeModule

With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine >= .CountOfLines
S = .ProcOfLine(StartLine, vbext_pk_Proc)
Y = .ProcBodyLine(S, vbext_pk_Proc)
Texte = .Lines(Y, 1)
If InStr(1, Texte, "Sub", vbTextCompare) > 0 Then
LeType = " (Proc.)"
Else
LeType = " (Fonct.)"
End If
Sh.Cells(i, 1).Value = S & LeType
StartLine = StartLine + .ProcCountLines(S, vbext_pk_Proc)
Sh.Cells(i, 1).Offset(, 1).Value = .Name
StartLine = StartLine + 1
i = i + 1
Loop
End With
Next
Sh.Range("A:B").EntireColumn.AutoFit = True
Set VBCodeMod = Nothing: Set Comp = Nothing: Set C = Nothing
Set Wk = Nothing: Set Sh = Nothing
End Sub
'-----------------------------------
Avatar
michdenis
Une variante à la dernière, celle-ci te permet d'obtenir
la ou les lignes de déclaration des procédures incluant
les paramètres de la procédure ou de la fonction le cas
échéant.

'------------------------------------------------
Sub ListeMacrosModule1()

Dim Wbk As Workbook, Sh As Worksheet
Dim VBCodeMod As Object, Comp As Object, C As Object
Dim StartLine As Long, i As Long, ProcName As String
Dim S As String, Texte As String, LeType As String

'Identifie le classeur source où sont les procédures
Set Wbk = ThisWorkbook 'ou ce que tu veux

'Détruit la feuille si elle existe déjà.
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("MesProcs").Delete
Application.DisplayAlerts = True

'Ajoute une feuille au projet où sera fait le listing
Set Sh = Wbk.Worksheets.Add
'Nomme la feuille
Sh.Name = "MesProcs"

i = 1
'Boucle sur toutes les modules du projet, incluant le formulaire.
For Each C In Wbk.VBProject.VBComponents
Set Comp = C
sds = C.Name
Set VBCodeMod = Wbk.VBProject.VBComponents(C.Name).CodeModule

With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine >= .CountOfLines
S = .ProcOfLine(StartLine, vbext_pk_Proc)
Y = .ProcBodyLine(S, vbext_pk_Proc)
Texte = ""
w = Y
Do
Texte = Texte & .Lines(w, 1) & Chr(10)
w = w + 1
Loop Until Mid(Texte, Len(Texte) - 1, 1) <> "_"

Texte = Left(Texte, Len(Texte) - 1)
If InStr(1, Texte, "Sub", vbTextCompare) > 0 Then
LeType = Texte & " (Proc.)"
Else
LeType = Texte & " (Fonct.)"
End If
Sh.Cells(i, 1).Value = Trim(Texte)
StartLine = StartLine + .ProcCountLines(S, vbext_pk_Proc)
Sh.Cells(i, 1).Offset(, 1).Value = .Name
StartLine = StartLine + 1
i = i + 1
Loop
End With
Next
Sh.Range("A1").CurrentRegion.EntireColumn.AutoFit = True
Sh.Range("A1").CurrentRegion.EntireRow.AutoFit = True
Set VBCodeMod = Nothing: Set Comp = Nothing: Set C = Nothing
Set Wk = Nothing: Set Sh = Nothing
End Sub
'------------------------------------------------



"michdenis" a écrit dans le message de groupe de discussion :

La procédure suivante liste toutes les procédures et fonctions
d'un classeur ouvert.

En colonne A:A se retrouve le nom de la procédure ou
de la fonction avec la spécification "Proc." ou "Fonct."
associée à chacune.
En Colonne B:B spécifie le module où se retrouve la procédure.

Attention, si tu travailles avec des modules de classe, les procédures
de type "Get", "Let", "Set" ne sauront pas inclus dans la liste retenue.
Si besoin, tu fais signe !

Tu dois définir la variable "Wbk" avec le nom du classeur désiré
La référence suivante doit être ajouté à ton projetVBA:
"Microsoft Visual Basic For Application Extensibility 5.3"

'-----------------------------------
Sub ListeMacrosModule()

Dim Wbk As Workbook, Sh As Worksheet
Dim VBCodeMod As Object, Comp As Object, C As Object
Dim StartLine As Long, i As Long, ProcName As String
Dim S As String, Texte As String, LeType As String

'Identifie le classeur source où sont les procédures
Set Wbk = Workbooks("MonClasseur.xls") 'ou ce que tu veux

'Détruit la feuille si elle existe déjà.
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("MesProcs").Delete
Application.DisplayAlerts = True

'Ajoute une feuille au projet où sera fait le listing
Set Sh = Wbk.Worksheets.Add
'Nomme la feuille
Sh.Name = "MesProcs"

i = 1
'Boucle sur toutes les modules du projet, incluant le formulaire.
For Each C In Wbk.VBProject.VBComponents
Set Comp = C
sds = C.Name
Set VBCodeMod = Wbk.VBProject.VBComponents(C.Name).CodeModule

With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine >= .CountOfLines
S = .ProcOfLine(StartLine, vbext_pk_Proc)
Y = .ProcBodyLine(S, vbext_pk_Proc)
Texte = .Lines(Y, 1)
If InStr(1, Texte, "Sub", vbTextCompare) > 0 Then
LeType = " (Proc.)"
Else
LeType = " (Fonct.)"
End If
Sh.Cells(i, 1).Value = S & LeType
StartLine = StartLine + .ProcCountLines(S, vbext_pk_Proc)
Sh.Cells(i, 1).Offset(, 1).Value = .Name
StartLine = StartLine + 1
i = i + 1
Loop
End With
Next
Sh.Range("A:B").EntireColumn.AutoFit = True
Set VBCodeMod = Nothing: Set Comp = Nothing: Set C = Nothing
Set Wk = Nothing: Set Sh = Nothing
End Sub
'-----------------------------------