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

VBA Discussion :

Sommaire des procédures dans un Treeview


Sujet :

VBA

  1. #1
    Membre confirmé
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 84
    Par défaut Sommaire des procédures dans un Treeview
    Bonjour,

    Je viens pour vous partager un code que je viens de terminer, je pense et j'espère que ça pourra être utile à d'autres.
    Le but est ici de remplir un Treeview avec pour chaque fichier ouvert, pour chaque module, les procédures.
    Chaque noeud de procédure comporte les lignes de commentaires qui sont écrites au dessus de la procédure.
    Donc si vous avez l'habitude comme moi de commenter au dessus des procédures pour décrire le but de la fonction, le résultat devrait être sympathique !

    Afin de l'intégrer à votre code, il vous suffit de créer un TreeView dans un userform et remplacer la ligne "Set objTvw = MonUserform.tvwSommaire" pour pointer vers votre treeview.

    Il faudra activer la référence à Microsoft Visual Basic for Applications Extensibility. Dans Outils --> Références.

    Vous devriez aussi cocher la case "Trust access to the VBA project object model".
    C'est accessible dans les options Excel --> Trust Center --> Macro Settings --> Developer Macro Settings

    Désolé, je n'ai qu'une version Anglaise sous la main... Dès que j'ai la possibilité, je viendrai modifier le post afin de donner le chemin pour y accéder à partir d'une version Française.
    Options Excel --> Centre de gestion de la confidentialité --> Paramètres du Centre de gestion de la confidentialité --> Paramètres des macros --> Paramètres de macros pour les développeurs.
    Cocher Accès approuvé au modèle d'objet du projet VBA.

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    'A pour but de créer un fichier de sommaire de toutes les procédures des fichiers ouverts
    'Necessite la référence :
        'Microsoft Visual Basic for Applications Extensibility 5.3
    Public Sub SommaireModules()
        Dim objVBProject As VBProject
        Dim objVBComponent As VBComponent
        Dim objCodeModule As CodeModule
        Dim lTypeproc As VBIDE.vbext_ProcKind
        Dim objTvw As TreeView
        Dim objNewNode1 As MSComctlLib.Node
        Dim objNewNode2 As MSComctlLib.Node
        Dim objNewNode3 As MSComctlLib.Node
        Dim objNewNode4 As MSComctlLib.Node
        Dim strNomProc As String
        Dim strLine As String
        
        Dim lngStartComment As Long
        Dim lngStartProc As Long
        Dim lngCountComment As Long
        Dim i As Long
        Dim x As Long
       
        Set objTvw = MonUserform.tvwSommaire
        objTvw.Nodes.Clear                              'Purge les noeuds existants
        For Each objVBProject In Application.VBE.VBProjects     'Boucle pour explorer chaque fichier excel
            Set objNewNode1 = objTvw.Nodes.Add                  'Création du noeud racine contenant le nom de fichier
            objNewNode1.Expanded = True
            On Error Resume Next
            objNewNode1.Text = objVBProject.Filename
            On Error GoTo 0
            If objNewNode1.Text = "" Then
                objNewNode1.Text = objVBProject.Name
            End If
            For Each objVBComponent In objVBProject.VBComponents    'Boucle pour chaque Composant du projet VB (Sheets, ThisWorkbook, Userforms, Modules, Modules de classe)
                Set objNewNode2 = objTvw.Nodes.Add(objNewNode1, tvwChild)   'Ajout d'un noeud enfant contenant le nom de composant de projet VB
                objNewNode2.Expanded = True
                objNewNode2.Text = objVBComponent.Name
                Set objCodeModule = objVBComponent.CodeModule       'Permet d'accéder au code contenu dans le composant du projet VB
                With objCodeModule
                    i = .CountOfDeclarationLines + 1
                    Do Until i >= .CountOfLines
                        strNomProc = .ProcOfLine(i, lTypeproc)
                        i = i + .ProcCountLines(strNomProc, lTypeproc)
                        lngStartComment = .ProcStartLine(strNomProc, lTypeproc)
                        lngStartProc = .ProcBodyLine(strNomProc, lTypeproc)
                        If lngStartComment = lngStartProc Then
                            lngCountComment = .ProcCountLines(strNomProc, lTypeproc)
                        Else
                            lngCountComment = lngStartProc - lngStartComment
                        End If
                        
                        Set objNewNode3 = objTvw.Nodes.Add(objNewNode2, tvwChild)   'Création d'un noeud enfant à chaque procédure (Function, Sub, etc)
                        objNewNode3.Expanded = False
                        objNewNode3.Text = strNomProc & " : L " & lngStartProc
                        
                        For x = 0 To lngCountComment - 1
                            strLine = .Lines(lngStartComment + x, 1)
                            If Replace(strLine, " ", "") <> "" Then
                                Set objNewNode4 = objTvw.Nodes.Add(objNewNode3, tvwChild)   'Création d'un noeud enfant pour chaque ligne de commentaire précédent une procédure
                                objNewNode4.Expanded = True
                                objNewNode4.Text = strLine
                                strLine = ""
                            End If
                        Next x
                    Loop
                End With
            Next objVBComponent
        Next objVBProject
        Set objNewNode4 = Nothing
        Set objNewNode3 = Nothing
        Set objNewNode2 = Nothing
        Set objNewNode1 = Nothing
        Set objTvw = Nothing
        Set objCodeModule = Nothing
        Set objVBComponent = Nothing
        Set objVBProject = Nothing
    End Sub

    PS : J'ai développé sous Excel 2010, je ne sais pas si il peut y avoir des soucis avec d'autres versions.

    [Edit 17/06/18]:
    - Ajout du chemin d'accès en Français.
    - Suite à un plantage dans le cas ou un projet ouvert mais non enregistré est présent, modification de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objNewNode1.Text = objVBProject.Filename
    Pour l'ajout des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    On Error Resume Next
            objNewNode1.Text = objVBProject.Filename
            On Error GoTo 0
            If objNewNode1.Text = "" Then
                objNewNode1.Text = objVBProject.Name
            End If

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 116
    Billets dans le blog
    131
    Par défaut
    Salut.

    Merci pour cette contribution.

    A noter que ce n'est pas réservé à Excel, mais à toute application qui permet d'accéder aux objets du projet VBA, en adaptant éventuellement la ligne For Each objVBProject In Application.VBE.VBProjects à l'application concernée
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/08/2007, 15h46
  2. Supprimer des éléments dans une TreeView ?
    Par souch dans le forum Composants VCL
    Réponses: 4
    Dernier message: 16/09/2005, 12h20
  3. Ordonnée des données dans un TreeView
    Par LoicH dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/04/2005, 18h08
  4. Pbs pour Glisser-Deplacer des noeuds dans un TreeView.
    Par psau dans le forum C++Builder
    Réponses: 3
    Dernier message: 08/09/2004, 21h02
  5. Des colonnes dans un Treeview
    Par mr_langelot dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/07/2004, 09h52

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