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 :

Balayage par le code VBA d'un code VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut Balayage par le code VBA d'un code VBA
    Bonjour,

    Je cherche à balayer un code VBA et faire sortir dans une feuille Excel tous les noms de fonctions et de procédures où apparaissent un mot clé : on error resume next.

    J'espère que ma question est assez claire.

    Est-ce que vous pôurriez m'aider s'il vous plait ?

    Par avance merci.

    Marco.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 84
    Points : 90
    Points
    90
    Par défaut
    Voir cette discution... on utilise VBComponent ensuite c'est une histoire de chaines de caractères...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonsoir,

    Merci de cette réponse.

    J'ai essayé de travailler sur le sujet en m'aidant de ce que tu m'as transmis.

    Par contre je bloque encore sur la manière de récupérer le contenu des lignes de code à l'intérieur de mes fonctions.

    Voici mon code :

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
     
     
    Option Explicit
     
    Function Audit() As Boolean
        Dim MyWorkbook      As Workbook
        Dim MySheet         As Worksheet
     
        Dim VBCodeMod       As CodeModule
        Dim MyComponent     As VBComponent
        Dim ProcType        As VBIDE.vbext_ProcKind
     
        Dim StrNomProc      As String
        Dim StrTypeProc     As String
     
        Dim LngStartProc    As Long
        Dim LngEndProc      As Long
     
        Dim StrContenuFonction  As String
        Dim StrChaineCherchee   As String
        Dim MaLigneCode    As String
     
    '    Dim ArrResume()
     
        Dim LngCpt          As Long
        Dim LngLigne        As Long
        Dim StartLine       As Long
     
    On Error GoTo erreur
     
       Set MyWorkbook = ActiveWorkbook
    '   Set MyWorkbook = Application.Workbooks("")
       Set MySheet = MyWorkbook.Sheets(1)
     
       StrChaineCherchee = "on error resume next"
     
       LngLigne = 1
     
        For Each MyComponent In MyWorkbook.VBProject.VBComponents
            'On recupere le type du composant
            Select Case MyComponent.Type
                Case vbext_ct_StdModule
                    StrTypeProc = "Module"
                Case vbext_ct_ClassModule
                    StrTypeProc = "Class"
                Case vbext_ct_Document
                    StrTypeProc = "Feuille"
                Case vbext_ct_MSForm
                    StrTypeProc = "UserForm"
            End Select
     
            Set VBCodeMod = MyWorkbook.VBProject.VBComponents(MyComponent.Name).CodeModule
     
            'On récupère la taille de la procédure
            With VBCodeMod
                StrNomProc = VBCodeMod.ProcOfLine(1, ProcType)
                If StrNomProc <> "" Then
                    StartLine = 1 '.CountOfLines + 1
                    StrNomProc = VBCodeMod.ProcOfLine(StartLine, ProcType)
                    'On recherche le type de la procédure
                    MaLigneCode = .Lines(StartLine, 1)
     
                    'On récupère le nom de la fonction et son type
                    LngStartProc = VBCodeMod.ProcBodyLine(StrNomProc, ProcType) + 1
                    LngEndProc = .ProcStartLine(StrNomProc, ProcType) + .ProcCountLines(StrNomProc, ProcType) - 2
     
                    LngCpt = StartLine
                    Do Until LngLigne >= LngEndProc
     
     
                       ********** MON problème est à ce niveau... **********
                        StrContenuFonction = LTrim(VBCodeMod.Lines(LngCpt, 1))
                       ********** MON problème est à ce niveau... **********
     
                        If InStr(1, StrChaineCherchee, StrContenuFonction) Then
                            MySheet.Range("A" & LngLigne) = MyComponent.Name
                            MySheet.Range("B" & LngLigne) = StrNomProc
                            MySheet.Range("C" & LngLigne) = StrTypeProc
                            MySheet.Range("D" & LngLigne) = StrChaineCherchee
                            LngLigne = LngLigne + 1
     
                        End If
                        LngCpt = LngCpt + 1
                    Loop
                End If
            End With
     
        Next
     
    erreur:
    Resume
        Set MyWorkbook = Nothing
     
    End Function

    Comment faire donc pour récupérer le contenu d'une ligne de code à l'intérieur de la fonction. A partir de là, j'ai une chaîne de caractére. Je veux savoir si elle contient la chaîne "on error resume next" dans ce cas précis et insérer un ligne dans une feuille excel pour en avoir une liste.

    J'espère être assez clair dans ma question. N'hésitez pas à me demander des éclaicissements.

    Bonne soirée et merci d'avance.

    Marc.

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Une petite question, quel est le but final, je veux dire trouver un texte dans un code VBA, ok, mais l’intérêt de tout ça? Pourquoi ne pas simplement ouvrir le fichier et faire une recherche voir un remplacement, tu as une grande quantité de donnée a traiter ?

    Sinon pour trouver une ligne, je suppose que j'utiliserait InStr pour trouver la position du mot en question, puis je chercherais de part et d'autre de se mot les caractères de mise a la ligne (vbNewLine ou vbCrLf).
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonjour,

    Tout d'abord merci de ta réponse.
    La finalité, comme je le disais plus haut c'est de retrouver certaines chaines de caractères dans une application.

    Je dois reprendre le développement d'une application qui a déja beucoup vécu et qui n'a pas été programmé trop dans les régles : elle a été faite principalement par des stagiaires et depuis le départ, de nombreuses personnes y ont participé.

    Le premier problème auquel je dois m'attaquer, c'est la gestion des erreur (qui est pour ainsi dire inexistante ou au mieu consiste à masquer des erreurs).

    Dans de nombreux cas le programme s'arrête et par dans le débugeur. Au bureau c'est ennuyeux, mais devant le client je vous laisse imaginer.

    Je dois dans un premier temps faire l'inventaire, proposer des solutions et après on verra pour un planning des corrections. C'est la première étape d'une chantier pour le refactoring de ce code.

    Au fait si tu as d'autres suggestions je susi preneur.

    Bonne journée.

    Marco.

  6. #6
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    bonjour,

    moi dans ce genre de cas.

    j'imprime le code... je m'arme d'un fluo... une latte... et hop je passe en revue le code.

    rapide et j'ai une meilleure vue d'ensemble par la suite...

    aaahh le bon vieux papier
    Alleï Bonjour chez vous!

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Salut,

    Oui c'est vrai que la vue papier est assez incomparable, mais là on quelque chose comme "90 000" lignes de code VBA.

    Et on me demande d'avoir une vue d'ensemble pour pouvoir prévoir à quelle échéance tout dsera fait.

    En plus de ça le petit "challenge" a du piquant vous ne trouvez pas ?

    A plus et merci pour la réponse.

    Marco.

  8. #8
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Il y a également la possibilité de faire une recherche dans l'éditeur VBA via Ctrl+F avec l'option de pouvoir faire cette recherche dans tout le projet.
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonjour,

    Merci tout d'abord de ta réponse. En fait j'ai besoin de créer un rapport de manière automatique sur ce sujet. Mon but est d'explorer le code et d'extraire certaines informations... Ceci n'est qu'une première étape.

    Je cherche aussi à comprendre comment ça marche en fait. Effectivement j'avais déja pensé un peut tout seul au Ctrl+F en premier lieu et comme un grand.

    Je voudrais passer par le code et lister toutes ces information dans une feuille Excel.

    Par avance merci.

    Marco.

  10. #10
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Soyons pragmatiques: Si le but est de "fluoriser" une chaine de caractères particulières, copie ton code module par module dans Word et effectue un remplacement via CTRL+H en remplaçant avec un autre format (surlignage, ...).

    Simple et efficace.

    Pour la récupération du code, je peux regarder cela tout à l'heure.
    "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...
    ---------------

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonjour,

    Non mon but n'est pas de "fluoriser, mais bein de tracer et de le faire de manière automatique. En clair, je vaus vreaiement lister certains mots clés éventuellement passés en paramétre.

    Par ailleur j'aimerais apprendre à me servir des objets qui permettent d'explorer le code. C'est pour moi un première étappe, afin de pouvoir aller plus loin pour pouvoir éventuellement me construire mes propres outils pour "auditer" un code (mêrme si c'est un binen grand mot ).

    Merci en tous els cas de vos réponses et de votre aide si celà est possible.

    Marco.

  12. #12
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Voici une procédure qui permet de récupérer dans une feuille excel les lignes des procédures qui contiennent une chaine donnée.

    Elle vide la feuille à partir de la ligne 4, puis remplit la feuille en fonction en cherchant la chaine en B1 dans la ligne scannée.

    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
    Sub AuditCode()
      ' Audite le code à la recherche d'une chaine
      ' pour lister dans une feuille excel les occurrences et les proc/fonctions qui les contiennent
     
      Dim Feuille As Worksheet ' Feuille qui contiendra la liste
      Dim Cellule As Range ' Cellule en A de la ligne sur laquelle écrire la prochaine occurrence
      Dim ValeurCherchee As String
     
      Dim MonModule As Object 'VBA.vbcomponent
      Dim MonCode As Object
      Dim NomDuModule As String
      Dim NomProcedure As String
      Dim ValeurLigne As String
      Dim i As Long
     
      Set Feuille = Feuil4
      'Set Cellule = Feuil4.Range("a4")
      ValeurCherchee = Feuille.Range("b1")
      Feuille.Range("4:" & Feuille.Rows.Count).Delete
     
      For Each MonModule In ThisWorkbook.VBProject.VBComponents
        NomDuModule = MonModule.Name
        Set MonCode = MonModule.codemodule
        For i = 1 To MonCode.Countoflines
          ValeurLigne = Trim(MonCode.Lines(i, 1))
          If ValeurLigne Like "Sub*" Or ValeurLigne Like "Function*" Or ValeurLigne Like "Property" Then
            NomProcedure = ValeurLigne
          End If
          If ValeurLigne Like "*" & ValeurCherchee & "*" Then
            Set Cellule = Feuille.Range("a" & Feuille.Rows.Count).End(xlUp)(2)
            Cellule.Value = NomDuModule
            Cellule(1, 2) = NomProcedure
            Cellule(1, 3) = i
          End If
        Next i
      Next MonModule
    End Sub
    Pour utiliser la procédure, j'ai utilisé une feuille illustrée comme ci-dessous

    "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...
    ---------------

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonsoir pierre,

    Je te remercies pour cette réponse.

    Je vais tester ce que tu me donnes, mais déja ça va pouvoir m'aider. En plus en extrapolant, je pense que je peux aussi tester pour sortir toutes les fonctions/Sub qui n'ont aucune gestion d'erreur ?

    Enfin, merci déja. C'est beaucoup. Je vais partir de ton travail.

    Je fais un retour dès que possible.

    Bon weeeknd.

    Marco.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 84
    Points : 90
    Points
    90
    Par défaut faire un export des macros
    Je reviens sur le sujet après plusieurs mois... c'est peut être inutil pour toi cotmar mais ça pourrait être util pour d'autres...

    Une autre solution possible, donc, pour analyser les sources: faire un export des macros. On va se retrouver avec des fichiers texte avec le contenu des macros (le code source) et ensuite on pourra faire des recherches plus classiques dans des fichiers texte (moi je le ferais en unix/linux avec cat, grep, etc).

    Pour exporter les macros, on peut utiliser la fonction suivante:
    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
    Sub ExporterFrmEtModules()
        ' Pour que ça marche, faire Excel/Outils/Options/Sécurité/Sécurité des macros/Faire confiance au projet Visual Basic
        'Nécéssite d'activer la référence Microsoft Visual Basic for Applications Extensibility 5.3
        Dim rep1 As String
        rep1 = "sources"
        rep1 = ThisWorkbook.Path + Application.PathSeparator + rep1 + Application.PathSeparator
        Dim LeFich
        k1 = 0
        k2 = 0
        k3 = 0
        k4 = 0
        For Each LeFich In ThisWorkbook.VBProject.VBComponents
            Select Case LeFich.Type
            Case 1
                ThisWorkbook.VBProject.VBComponents(LeFich.Name).Export rep1 & LeFich.Name & ".bas"
                k1 = k1 + 1
            Case 2
                ThisWorkbook.VBProject.VBComponents(LeFich.Name).Export rep1 & LeFich.Name & ".cls"
                k2 = k2 + 1
            Case 3
                ThisWorkbook.VBProject.VBComponents(LeFich.Name).Export rep1 & LeFich.Name & ".frm"
                k3 = k3 + 1
            Case 100
                ThisWorkbook.VBProject.VBComponents(LeFich.Name).Export rep1 & LeFich.Name & ".cls"
                k4 = k4 + 1
            End Select
        Next
        k = k1 + k2 + k3 + k4
        MsgBox CStr(k) & " objets exportés dont:" & vbCrLf & _
               CStr(k1) & " bas" & vbCrLf & _
               CStr(k3) & " frm" & vbCrLf & _
               CStr(k2 + k4) & " cls"
    End Sub

  15. #15
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    pas vu passer le sujet...

    mais pour les développeur, il y a un outils qui rentabilise largement le temps qu'on peut passer à connaître son fonctionnement :

    il s'agit de MZ-Tolls

    Dans les cas présent, il suffit de numéroter les lignes avec la commande ad-hoc, de faire rechercher (de MZ, pas le natif) et en 1 clic on obtient la liste de toutes les occurrences voulues classées par projets, modules, procédures.
    On a du coup les N°s de lignes direct et en double cliquant sur une des lignes citées, on se place direct dessus dans l'éditeur !

    Le temps passé à la découverte de l'outil est largement compensé par celui consacré à l'écriture d'un code visant à faire la même chose et de plus l'utilisation de l'outil est portable et récurrente, ce que recherche toujours un programmeur

    je ne parle pas du reste des fonctions d'analyse présentes encore à l'auteur.

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

Discussions similaires

  1. [XL-2013] Classer des âges par tranches d'âges via un code VBA - Erreur 1004
    Par Estriny dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/12/2014, 21h04
  2. [VBA-E] executer code d'un userform depuis un autre
    Par zouille dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 03/04/2006, 19h35
  3. [VBA-E]Pb code VLOOKUP
    Par fabrice92 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/03/2006, 20h15
  4. [VBA-E] mon code ne marche pas sur un autre PC
    Par yannph dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/01/2006, 21h03

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