IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Liste de macro [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Août 2017
    Messages : 23
    Par défaut Liste de macro
    Bonjour.
    Je voulais trouver une macro qui me liste la totalité des macros située dans les 120 feuilles de mon classeur. J'ai trouvé le code suivant, mais qui ne fonctionne pas. Il affiche une erreur au sujet de ByRef que je ne sais pas résoudre.
    Si quelqu'un a la solution, merci.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Sub ListAllSheetMacros()
        Dim ws As Worksheet
        Dim vbComp As Object
        Dim vbMod As Object
        Dim macroNames() As String
        Dim wsMacroList As Worksheet
        Dim rowIndex As Long
        Dim i As Long
        Dim macroListIndex As Long
     
        ' Créer une nouvelle feuille ou utiliser une feuille existante pour lister les macros
        On Error Resume Next
        Set wsMacroList = ThisWorkbook.Sheets("Liste des Macros")
        On Error GoTo 0
     
        If wsMacroList Is Nothing Then
            Set wsMacroList = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
            wsMacroList.Name = "Liste des Macros"
        Else
            ' Effacer le contenu de la feuille existante si elle existe déjà
            wsMacroList.Cells.Clear
        End If
     
        ReDim macroNames(1 To 1000) ' Ajuster la taille du tableau si nécessaire
     
        ' Parcourir toutes les feuilles du classeur
        For Each ws In ThisWorkbook.Worksheets
            If ws.CodeName <> "" Then ' Vérifier si la feuille a un nom de code VBA
                Set vbMod = ThisWorkbook.VBProject.VBComponents(ws.CodeName).CodeModule
                For i = 1 To vbMod.CountOfLines
                    macroName = vbMod.ProcOfLine(i, vbext_pk_Proc)
                    If macroName <> "" Then
                        If Not IsMacroSheetInList(macroNames, macroName) Then
                            macroListIndex = macroListIndex + 1
                            macroNames(macroListIndex) = macroName
                        End If
                    End If
                Next i
            End If
        Next ws
     
        ' Afficher les noms des macros dans la feuille "Liste des Macros"
        rowIndex = 1
        For i = 1 To macroListIndex
            wsMacroList.Cells(rowIndex, 1).Value = macroNames(i)
            rowIndex = rowIndex + 1
        Next i
    End Sub
     
    Function IsMacroSheetInList(arr() As String, macroName As String) As Boolean
        Dim i As Long
     
        For i = LBound(arr) To UBound(arr)
            If arr(i) = macroName Then
                IsMacroSheetInList = True
                Exit Function
            End If
        Next i
     
        IsMacroSheetInList = False
    End Function

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 605
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    Le type de l'argument d'une fonction ou d'une procédure ne semble pas convenir :

    Vous passer peut être un argument en variant à une procédure ou une fonction alors qu'il attend un argument avec un type précis (integer, string, etc.).

    Peut-être mettre :

    en haut du module vous voir s'il y a des variables non déclarées ..

    https://learn.microsoft.com/fr-fr/of...icit-statement
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  3. #3
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Août 2017
    Messages : 23
    Par défaut
    Bonjour.
    La seule variable non déclarée au regard d'Option Explicit, c'est macroName et même lorsque je la déclare (sans spécifier As ... ne sachant pas quoi mettre) l'erreur reste la même : Erreur de compilation : Type d'argument ByRef incompatible.

    Je suis très loin d'être calé en VBA et je ne sais absolument pas ce que cette erreur signifie ni comment y remédier.

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 605
    Billets dans le blog
    67
    Par défaut
    Essayez voir avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim macroName As String
    Après indiquer la ligne de l'erreur serait bien
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Hello,

    Premièrement, il faut ajouter la référence Microsoft Visual Basic for Application Extensibility, ou déclarer la constante vbext_pk_Proc.
    Deuxièmement, une déclaration de variable est manquante comme l'a souligné User.

    Enfin, lorsqu'il est fonctionnel, ce code ne liste que les fonctions membre des feuilles, j'espère que c'est ce que tu recherches.

    Voici le code corrigé par mes soins (sans référence supplémentaire):
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Option Explicit
     
    Sub ListAllSheetMacros()
        Const vbext_pk_Proc = 0     '// Declaration de constante manquante
        Dim ws As Worksheet
        Dim vbComp As Object
        Dim vbMod As Object
        Dim macroNames() As String
        Dim wsMacroList As Worksheet
        Dim rowIndex As Long
        Dim i As Long
        Dim macroListIndex As Long
     
        ' Créer une nouvelle feuille ou utiliser une feuille existante pour lister les macros
        On Error Resume Next
        Set wsMacroList = ThisWorkbook.Sheets("Liste des Macros")
        On Error GoTo 0
     
        If wsMacroList Is Nothing Then
            Set wsMacroList = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
            wsMacroList.Name = "Liste des Macros"
        Else
            ' Effacer le contenu de la feuille existante si elle existe déjà
            wsMacroList.Cells.Clear
        End If
     
        ReDim macroNames(1 To 1000) ' Ajuster la taille du tableau si nécessaire
     
        ' Parcourir toutes les feuilles du classeur
        For Each ws In ThisWorkbook.Worksheets
            If ws.CodeName <> "" Then ' Vérifier si la feuille a un nom de code VBA
                Set vbMod = ThisWorkbook.VBProject.VBComponents(ws.CodeName).CodeModule
                For i = 1 To vbMod.CountOfLines
                    Dim macroName As String     '// Declaration de variable manquante
                    macroName = vbMod.ProcOfLine(i, vbext_pk_Proc)
                    If macroName <> "" Then
                        If Not IsMacroSheetInList(macroNames, macroName) Then
                            macroListIndex = macroListIndex + 1
                            macroNames(macroListIndex) = macroName
                        End If
                    End If
                Next i
            End If
        Next ws
     
        ' Afficher les noms des macros dans la feuille "Liste des Macros"
        rowIndex = 1
        For i = 1 To macroListIndex
            wsMacroList.Cells(rowIndex, 1).Value = macroNames(i)
            rowIndex = rowIndex + 1
        Next i
    End Sub
     
    Function IsMacroSheetInList(arr() As String, macroName As String) As Boolean
        Dim i As Long
     
        For i = LBound(arr) To UBound(arr)
            If arr(i) = macroName Then
                IsMacroSheetInList = True
                Exit Function
            End If
        Next i
     
        IsMacroSheetInList = False
    End Function

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Bonjour, je peux avoir l'usage de cette macro dans certains cas. J'ai donc repris la macro de deedolith (que je salue), et apporté une petite modification pour mon usage personnel, à savoir l'affichage du nom de la feuille contenant la macro, si ça t'intéresse modifie cette portion de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                    If macroName <> "" Then
                        If vbMod.ProcStartLine(macroName, vbext_pk_Proc) = i Then
                            If Not IsMacroSheetInList(macroNames, macroName) Then
                                macroListIndex = macroListIndex + 1
                                macroNames(macroListIndex) = ws.Name & "!" & macroName
                            End If
                        End If
                    End If

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Liste des macros et de leurs actions
    Par Creuc dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/05/2012, 09h40
  2. [XL-2010] aide sur les zones de liste en macro
    Par nicdodo dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 05/03/2012, 22h13
  3. Listes déroulantes (MACROS)
    Par hortencia dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/06/2011, 14h26
  4. [XL-2007] remplir liste par macro
    Par samaedae dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/04/2011, 12h54
  5. [Excel] ComboBox - extension liste via macro
    Par Chewi dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/01/2007, 21h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo