Macros : fréquence d’utilisation

  • Initiateur de la discussion Initiateur de la discussion DoubleZero
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

DoubleZero

XLDnaute Barbatruc
Bonjour à toutes et à tous,

L’un de mes fichiers comporte quelque 150 macros réparties dans une vingtaine de modules, exception faite, par conséquent, des événementielles.

Souhaitant connaître la fréquence d’utilisation de chacune d’elles, les quatre lignes suivantes sont insérées avant leur "End Sub"

Code:
    With Sheets("Macro_utilisée")
        .Range("a" & Rows.Count).End(xlUp)(2) = "rose" 'nom de la macro
        .Range("b" & Rows.Count).End(xlUp)(2) = Now
    End With
Mais… peut-être existe-t-il une façon d’agir bien plus élégante 😱..

Je vous remercie pour votre aide.

A bientôt 🙂🙂
 

Pièces jointes

Re : Macros : fréquence d’utilisation

Bonsoir chère petite ânesse,

Vois si la solution proposée en pièce jointe te convient.

Bonne soirée.

Bises.

NB: je suis trop content de pouvoir répondre à une de tes questions.
 

Pièces jointes

Dernière édition:
Re : Macros : fréquence d’utilisation

Bonjour chère ânesse, hello Papou-net (pas regardé ta solution),

Plus élégant en effet mets dans un module standard :

Code:
Sub Stat(NomMacro$)
With Sheets("Macro_utilisée").Range("a" & Rows.Count).End(xlUp)(2)
  .Value = NomMacro
  .Offset(, 1) = Now
End With
End Sub
Et avant le End Sub d'une autre macro :

Code:
Stat "rose"
A+
 
Re : Macros : fréquence d’utilisation

Bonjour à toutes et à tous,

Un gr😱s merci, Papou-net 😀 et job75 😀 pour vos interventions respectives.

Je ne peux les tester immédiatement mais ne manquerai pas de revenir au plus tôt.

1001 fois merci.

A bientôt 🙂😀
 
Re : Macros : fréquence d’utilisation

Bonjour à toutes et à tous,

Papou-net 😀, job75 😀,

Enfin 😱, j'ai pu tester vos travaux dans le fichier réel. Les résultats sont PARFAITS 😎

Si l’adjonction de vos lignes de code ne peut être automatisé, ce n’est absolument pas grave.

Je vous renouvelle mes 😱 chaleureux remerciements 😱 pour votre aide.

A bientôt 🙂🙂
 
Re : Macros : fréquence d’utilisation

Bonjour DoubleZero, le fil,

Je n'avais pas oublié :

Si l’adjonction de vos lignes de code ne peut être automatisé, ce n’est absolument pas grave.

Oui mais casse-pieds sur 150 macros 🙄

Alors pour compléter mon post #3 :

Code:
Sub InsertionCode()
Dim VBC As Object, i&, t$, nom$, j&, t1$, x$
For Each VBC In ThisWorkbook.VBProject.VBComponents
  With VBC.CodeModule
    For i = .CountOfLines To 1 Step -1
      t = Trim(.Lines(i, 1))
      If InStr(t, "End Sub") Then
        nom = .ProcOfLine(i, 0)
        j = .ProcBodyLine(nom, 0)
        t1 = Trim(.Lines(j, 1))
        x = "Sub " & nom & "()*"
        If t1 Like x Or t1 Like "Public " & x Then
          x = "Stat """ & VBC.Name & "." & nom & """: End Sub"
          If InStr(t, x) = 0 Then .ReplaceLine i, Replace(t, "End Sub", x)
        End If
        i = j
      End If
    Next
  End With
Next
End Sub

Sub Stat(NomMacro$)
With Sheets("Macro_utilisée").Range("a" & Rows.Count).End(xlUp)(2)
  .Value = NomMacro
  .Offset(, 1) = Now
End With
End Sub
Lance donc la 1ère macro.

Seules les macros qui apparaissent dans la liste des macros (Alt+F8) sont traitées.

Edit : il ne faut pas de "End Sub" en commentaire à l'extérieur d'une macro, ce serait du vice...

A+
 
Dernière édition:
Re : Macros : fréquence d’utilisation

Re,

Edit : il ne faut pas de "End Sub" en commentaire à l'extérieur d'une macro, ce serait du vice...

Bon OK une macro peut être mise en commentaire, alors utilise plutôt :

Code:
Sub InsertionCode()
Dim VBC As Object, i&, t$, p%, nom$, j&, t1$, x$
For Each VBC In ThisWorkbook.VBProject.VBComponents
  With VBC.CodeModule
    For i = .CountOfLines To 1 Step -1
      t = Trim(.Lines(i, 1))
      p = InStr(t, "End Sub")
      If p And InStr(Left(t, p), "'") = 0 Then
        nom = .ProcOfLine(i, 0)
        j = .ProcBodyLine(nom, 0)
        t1 = Trim(.Lines(j, 1))
        x = "Sub " & nom & "()*"
        If t1 Like x Or t1 Like "Public " & x Then
          x = "Stat """ & VBC.Name & "." & nom & """: End Sub"
          If InStr(t, x) = 0 Then .ReplaceLine i, Replace(t, "End Sub", x)
        End If
        i = j
      End If
    Next
  End With
Next
End Sub

Sub Stat(NomMacro$)
With Sheets("Macro_utilisée").Range("a" & Rows.Count).End(xlUp)(2)
  .Value = NomMacro
  .Offset(, 1) = Now
End With
End Sub
Bonne fin de soirée.
 
Re : Macros : fréquence d’utilisation

Bonjour 00, le forum,

Il faut aller un peu plus loin 🙄

Une macro peut être déplacée dans un autre module, ou bien le nom du module peut être modifié.

Il faut alors modifier la fin des macros et aussi la feuille "Macro_utilisée" :

Code:
Sub InsertionCode()
Dim VBC As Object, i&, t$, p%, nom$, j&, t1$, x$, q%, y$
For Each VBC In ThisWorkbook.VBProject.VBComponents
  With VBC.CodeModule
    For i = .CountOfLines To 1 Step -1
      t = Trim(.Lines(i, 1))
      p = InStr(t, "End Sub")
      If p And InStr(Left(t, p), "'") = 0 Then
        nom = .ProcOfLine(i, 0)
        j = .ProcBodyLine(nom, 0)
        t1 = Trim(.Lines(j, 1))
        x = "Sub " & nom & "()*"
        If t1 Like x Or t1 Like "Public " & x Then
          x = "Stat """ & VBC.Name & "." & nom & """: "
          q = InStr(t, "Stat ")
          If q Then
            y = Mid(t, q, p - q)
            t = Replace(t, y, "")
            q = InStrRev(y, """")
            If x <> y Then Sheets("Macro_utilisée").[A:A] _
              .Replace Mid(y, 7, q - 7), VBC.Name & "." & nom
          End If
          .ReplaceLine i, Replace(t, "End Sub", x & "End Sub")
        End If
        i = j
      End If
    Next
  End With
Next
End Sub

Sub Stat(NomMacro$)
With Sheets("Macro_utilisée").Range("a" & Rows.Count).End(xlUp)(2)
  .Value = NomMacro
  .Offset(, 1) = Now
End With
End Sub
Il suffit de relancer la 1ère macro pour tout mettre à jour.

Bonne journée.
 
Re : Macros : fréquence d’utilisation

Bonjour, le Fil 🙂, le Forum,

job75 😀,

Tes travaux sont de superbes bouquets de fleurs.

Je te remercie 1 😀😀😀 😀😀😀 de fois !

Encore merci 😱 à chacun de vous.

A bientôt,

😀😀
 
Re : Macros : fréquence d’utilisation

Re,

Puisque j'ai parlé d'un TCD je l'ai mis dans le fichier joint.

Pour l'actualiser lors de l'exécution des macros il suffit d'ajouter une ligne :

Code:
Sub Stat(NomMacro$)
With Sheets("Macro_utilisée").Range("a" & Rows.Count).End(xlUp)(2)
  .Value = NomMacro
  .Offset(, 1) = Now
End With
ThisWorkbook.RefreshAll 'pour mettre à jour le TCD
End Sub
Edit : ah oui, j'avais oublié d'enlever le code (inutile) que tu avais mis à la fin de tes macros.

A+
 

Pièces jointes

Dernière édition:
Re : Macros : fréquence d’utilisation

Re-bonjour,

... Puisque j'ai parlé d'un TCD je l'ai mis dans le fichier joint...


attachment.php
attachment.php
attachment.php
attachment.php



En😀rme MERCI, j😀b75 !

A bientôt 😱😱
 

Pièces jointes

  • Superbe !.gif
    Superbe !.gif
    4.2 KB · Affichages: 46
  • Superbe !.gif
    Superbe !.gif
    4.2 KB · Affichages: 48
  • Superbe !.gif
    Superbe !.gif
    4.2 KB · Affichages: 40
Re : Macros : fréquence d’utilisation

Re,

On peut ne pas mettre la macro Stat dans un module standard, par exemple dans ThisWorkbook :

Code:
Sub InsertionCode()
Dim MaStat$, VBC As Object, i&, t$, p%, nom$, j&, t1$, x$, q%, y$
MaStat = "ThisWorkbook.Stat" 'à adapter
For Each VBC In Me.VBProject.VBComponents
  With VBC.CodeModule
    For i = .CountOfLines To 1 Step -1
      t = Trim(.Lines(i, 1))
      p = InStr(t, "End Sub")
      If p And InStr(Left(t, p), "'") = 0 Then
        nom = .ProcOfLine(i, 0)
        j = .ProcBodyLine(nom, 0)
        t1 = Trim(.Lines(j, 1))
        x = "Sub " & nom & "()*"
        If t1 Like x Or t1 Like "Public " & x Then
          x = MaStat & " """ & VBC.Name & "." & nom & """: "
          q = InStr(t, MaStat)
          If q Then
            y = Mid(t, q, p - q)
            t = Replace(t, y, "")
            q = InStrRev(y, """")
            If x <> y Then Sheets("Macro_utilisée").[A:A] _
              .Replace Mid(y, Len(MaStat) + 3, q - Len(MaStat) - 3), VBC.Name & "." & nom
          End If
          .ReplaceLine i, Replace(t, "End Sub", x & "End Sub")
        End If
        i = j
      End If
    Next
  End With
Next
End Sub

Sub Stat(NomMacro$)
With Sheets("Macro_utilisée").Range("a" & Rows.Count).End(xlUp)(2)
  .Value = NomMacro
  .Offset(, 1) = Now
End With
Me.RefreshAll 'pour mettre à jour le TCD
End Sub
Mais une fois la 1ère macro exécutée, il ne faut plus déplacer le code.

Edit : j'ai retiré la 3ème colonne du tableau (avec les NB.SI) tout à fait inutile.

Fichier (2).

A+
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour