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 :

Rechercher un mot dans le code VBA de plusieurs classeurs fermés ? [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 775
    Points : 177
    Points
    177
    Par défaut Rechercher un mot dans le code VBA de plusieurs classeurs fermés ?
    Bonjour.

    J'ai dans le code de plusieurs classeurs une constante dont la valeur est fausse et que je souhaiterai corriger.

    Je pose à tout hasard la question : est-ce possible de rechercher un mot dans le code VBA de plusieurs classeurs fermés, ouvrir le ou les classeurs qui contiennent le mot recherché ou à la limite les lister ?

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    voici un autre sujet où il fallait comparer deux constantes dans deux projets différents

    http://www.developpez.net/forums/d15...e/#post8520378


    avec un peu d'adaptions, tu devrais obtenir ce que tu cherches :

    - si les constantes sont toutes dans un module qui porte le même nom, la fonction le fait déjà. Sinon, faire sauter ce ciblage pour parcourir tous les modules du projet
    - boucler sur les classeurs voulus (idéalement ils sont situés dans un même dossier)
    - ouvrir le classeur
    - chercher la constante
    - remplacer sa valeur (la partie après le "=")
    - fermer le classeur
    - passer au suivant

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Si tu dois vraiment modifier le code, il te faudrait passer par VBIDE, je pense...
    MPi²

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 775
    Points : 177
    Points
    177
    Par défaut
    Bonsoir, bonjour (suivant le fuseau) et merci à vous.

    joe,
    Je me suis mal exprimé, en fait le principe consisterai à rechercher un mot dans le code VBA de plusieurs classeurs fermés, ouvrir ou à la limite lister le ou les classeurs qui contiennent le mot recherché.

    parmi,
    Pourrais-tu m'expliquer ce qu'est "VBIDE" ?

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Je ne comprend pas pourquoi tu veux lister les classeurs contenant la constante fausse... et donc qui est censée être remplacée ?

    Au pire, un remplacement + un listing des classeurs qui étaient impactés, j'aurais compris

    Et peut importe au final ce que tu souhaites faire, le lien que je t'ai proposé provient d'une discussion intitulée "Comment pointer sur une constante déclarée dans un module"

    Sauf erreur, ton problème appartient au même domaine, sauf qu'il est plus générique que la discussion : tu dois boucler sur plusieurs fichiers, éventuellement dans chaque module si tu ne connais pas le nom par avance. Tu es ensuite libre de réaliser l'action de ton choix, comme récupérer le nom du classeur par exemple.

    Ce type de procédures, c'est de la manipulation du Visual Basic Editor, pour répondre à la question que tu poses à parmi
    Un tutoriel à ce sujet : http://silkyroad.developpez.com/VBA/VisualBasicEditor/

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Citation Envoyé par modus57 Voir le message

    parmi,
    Pourrais-tu m'expliquer ce qu'est "VBIDE" ?
    Joe.levrai (salut) t'a donné un bon lien pour ce que j'expliquais...
    MPi²

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 775
    Points : 177
    Points
    177
    Par défaut
    Bonjour à vous.

    Je n'avais pas percuté que "VBIDE" c'est : Visual Basic Editor !

    Effectivement c'est un très bon tutoriel et une mine d'informations que je vais relire avec plus d'attention et dans lequel je devrai trouver une solution.

    J'ai consulté le lien concernant la discussion intitulée "Comment pointer sur une constante déclarée dans un module", en effet le code permet de vérifier si la constante existe dans un autre classeur.

    Maintenant je comprends mieux la marche à suivre.

    Je vais essayer de m'en sortir en construisant une procédure qui permettra de :
    - sélectionner le répertoire
    - boucler sur tous ses fichiers
    - ouvrir le fichier (éventuellement lire dans le fichier fermé : si c'est plus simple ?)
    - boucler dans chaque module (nom par connu par avance)
    - chercher le mot recherché
    - récupérer et lister dans une feuille le ou les noms des classeurs s'ils contiennent le mot recherché
    - fermer le fichier sans le sauvegarder

  8. #8
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    A la bonne heure !

    On se fera une joie de t'aider si ta procédure fonctionne mal (ou pas du tout), ou même si tu souhaites un avis/une optimisation possible

    Tiens nous au courant

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 775
    Points : 177
    Points
    177
    Par défaut
    Bonjour joe

    Voici le code que j'ai bidouillé :
    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 RechercheMot()
    Dim Compteur, Wbk As Workbook, MotRecherché
    MotRecherché = InputBox("", "CHOISIR LE MOT RECHERCHÉ")
        With Application.FileDialog(msoFileDialogFilePicker)
            .Filters.Clear
            .Filters.Add "Classeur xlsm", "*.xlsm"
            .AllowMultiSelect = True
            .Show
             For Compteur = 1 To .SelectedItems.Count
                'Ouverture et masquage de l'objet en question
                Set Wbk = GetObject(PathName:=.SelectedItems(Compteur))
                nomFichier = Split(.SelectedItems(Compteur), "\")(UBound(Split(.SelectedItems(Compteur), "\")))
                If Not ValConst(Workbooks(nomFichier), "un_e21") = ValConst(ThisWorkbook, "un_e21") Then
                'If Not ValConst(Workbooks(nomFichier), MotRecherché) = ValConst(ThisWorkbook, MotRecherché) Then 'BUG Type d'argument ByRef incompatible
                    MsgBox "Les constantes sont différentes dans le classeur : " & nomFichier
                Else
                    MsgBox "Les constantes sont identiques dans le classeur : " & nomFichier
                    'lister les fichiers conntenant le mot recherché dans une feuille du classeur
                    Sheets("Résultat").Columns("A:A").Find("*", [A1], , , , xlPrevious).Offset(1, 0) = .SelectedItems(Compteur)
                    Sheets("Résultat").Columns("A:A").EntireColumn.AutoFit
                End If
                'Fermeture de l'objet (Wbk) sans sauvegarde
                Wbk.Close SaveChanges:=False
             Next
        End With
    End Sub
    
     Function ValConst(Classeur As Workbook, NomConstante As String, Optional NomModule As String = "Module1") As String
    ' recherche dans le module "NomModule" du classeur indiqué la ligne de code de déclaration de la Constante
    ' la fonction retournera la valeur de la constante
    Dim LeModule As Object
    Dim i As Long
     
        ' on tente d'instancier le module
        On Error Resume Next
            Set LeModule = Classeur.VBProject.VBComponents(NomModule)
        On Error GoTo 0
     
        ' si ça échoue : message indiquant que le module n'existe pas
        If LeModule Is Nothing Then
            ValConst = "ECHEC : Le Module " & NomModule & " n'existe pas dans le classeur " & Classeur.Name
            Exit Function
        End If
     
        ' au sein du module
        With LeModule.CodeModule
            ' pour chaque ligne de code
            For i = 1 To .CountOfLines
                ' si la ligne est la déclaration de la constante (= le mot clé "Const" suivi d'un espace et du nom de la constante)
                'If .Lines(i, 1) Like "*" & "Const " & NomConstante & "*" Then 'recherche le nom d'une constante
                If .Lines(i, 1) Like "*" & NomConstante & "*" Then 'recherche un mot quelquonque
                    ' on retourne sa valeur et on quitte la procédure
                    ValConst = Split(.Lines(i, 1), """")(UBound(Split(.Lines(i, 1), """")) - 1)
                    Exit Function
                End If
            Next i
        End With
     
        ' si on a pas trouvé : on retourne un message à cet effet
        ValConst = "ECHEC : Constante " & NomConstante & " inexistante dans le classeur " & Classeur.Name & " au sein du module " & NomModule
    End Function
    SVP comment rechercher dans tous les modules des fichiers sélectionnés et corriger le bug avec l'utilisation de la variable "MotRecherché".

    Et si ce n'est pas trop vous demander : comment sélectionner tous les fichiers xlsm du répertoire choisi ?

    Question : lire dans les classeurs fermés est-ce possible et plus rapides ?

    Merci d'avance de votre concours dans cette discussion.

  10. #10
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    tu cherches à faire courir tout tes chevaux en même temps, forcément c'est beaucoup plus compliqué

    avant de chercher à boucler sur un ensemble de fichier, essaye déjà de développer une procédure qui le fait sur un seul fichier déjà ouvert
    ensuite, quand tu auras ta procédure qui :

    - cherche dans tous les modules du classeur
    - trouve (ou non) la constante
    - indique si la constante a été trouvée ou non

    là tu t'attaquera à :

    - une boucle pour le faire sur plusieurs classeurs


    et quand ta boucle fonctionnera pour deux fichiers ouverts manuellement :

    - tu crées la partie où les classeurs à boucler sont récupérés via l'explorateur


    D'ailleurs, ton sujet parlait de boucler sur TOUT les classeurs d'un répertoire.
    Or, ton code laisse à penser que ce ne sont QUE les classeurs choisis par l'utilisateur ?


    voici la partie du tutoriel où tu trouveras la matière pour boucler sur chaque module d'un classeur : http://silkyroad.developpez.com/VBA/...cEditor/#LII-C

    Malheureusement, je ne pense pas qu'il soit possible, sans ouvrir le classeur, de manipuler le projet ?

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    D'accord avec joe.levrai; je pense que tu devras ouvrir les fichiers pour les modifier.

    Il faudrait aussi voir s'il y a des sous-répertoires à "visiter", ce qui impliquerait une récursivité...
    Et s'il y a des mots de passe sur le code dans certains fichiers, il faudra voir...
    MPi²

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 775
    Points : 177
    Points
    177
    Par défaut
    Bonjour joe.levrai, parmi

    J'ai réussi à faire :
    - une boucle sur tous les fichiers sélectionnés avec la boîte application.FileDialog(msoFileDialogFilePicker)
    - la recherche dans tous les modules du classeur
    - trouvé (ou non) la constante
    - indiqué si la constante a été trouvée ou non
    - une boucle pour le faire sur plusieurs classeurs
    - lister le chemin complet et le nom des fichiers contenant la constante dans une feuille

    D'ailleurs, ton sujet parlait de boucler sur TOUT les classeurs d'un répertoire.
    Or, ton code laisse à penser que ce ne sont QUE les classeurs choisis par l'utilisateur ?
    En effet je souhaiterai soit boucler sur TOUT les classeurs d'un répertoire de des sous répertoires …. ou QUE les classeurs choisis par l'utilisateur.

    Il faudrait aussi voir s'il y a des sous-répertoires à "visiter", ce qui impliquerait une récursivité...
    Et s'il y a des mots de passe sur le code dans certains fichiers, il faudra voir...
    Là ça devient trop compliqué pour moi, un petit coup de pouce svp.

  13. #13
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    et ta procédure, elle est où petit cachottier

    montre-nous ça

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 775
    Points : 177
    Points
    177
    Par défaut
    La voilà
    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
    Sub RechercheMotVBA_1()
    Dim VBComp As VBComponent
    Dim Mdl As CodeModule
    Dim i, MotRecherché
        MotRecherché = InputBox("", "CHOISIR LE MOT RECHERCHÉ")
        If MotRecherché = "" Or MotRecherché = False Then End
        Application.ScreenUpdating = False
        'efface les données
        Sheets("Résultat").Range("A2", Range("A2").End(xlDown)).ClearContents
        'sélection répertoire
        With Application.FileDialog(msoFileDialogFilePicker)
            .Filters.Clear
            .Filters.Add "Classeur xlsm", "*.xlsm"
            .AllowMultiSelect = True
            .Show
            'parcourir tous les fichiers sélectionnés
            For Compteur = 1 To .SelectedItems.Count
            'Ouverture et masquage de l'objet en question
            Set Wbk = GetObject(PathName:=.SelectedItems(Compteur))
                'parcourir tous les fichiers ouverts
                For Each w In Workbooks
                'parcourir tous les modules des fichiers ouverts
                    For Each VBComp In w.VBProject.VBComponents
                        'instancier le module
                        Set Mdl = VBComp.CodeModule
                        'au sein du module
                        With VBComp.CodeModule
                            ' pour chaque ligne de code
                            For i = 1 To .CountOfLines
                                'si la ligne contien la variable MotRecherché
                                If .Lines(i, 1) Like "*" & MotRecherché & "*" Then 'recherche un mot quelquonque
                                    'liste les noms de  fichiers et modules contenant la variable MotRecherché
                                    Sheets("Résultat").Columns("A:A").Find("*", [A1], , , , xlPrevious).Offset(1, 0) = w.Name & " : " & VBComp.Name
                                    Sheets("Résultat").Columns("A:A").EntireColumn.AutoFit
                                End If
                            Next i
                        End With
                    Next VBComp
                Next w
                'Fermeture de l'objet (Wbk) sans sauvegarde
                Wbk.Close SaveChanges:=False
            Next Compteur
        End With
        Range("A1") = "LISTE FICHIERS CONTENANT LA VARIABLE : " & MotRecherché
        'supprime les doublons
        Sheets("Résultat").Range("A1", Range("A1").End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlYes
        Range("A2").EntireColumn.AutoFit
        Application.ScreenUpdating = True
    End Sub

  15. #15
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Très bien

    donc dans l'absolu ce code fonctionne ? Tu voudrais juste pouvoir retailler certains traitements, notamment sur les fichiers à analyser ? (Tout un répertoire, toute une arborescence de répertoire, choisi adhoc de l'utilisateur) ?

    Alors avant de réaliser cette customisation, on va déjà ranger tout tes chevaux dans des box individuels, c'est toujours plus pratique quand tu veux faire évoluer un programme : tu vas dans le box dédié !


    Donc, es-tu en mesure de découper ce programme brut en plusieurs sous-procédures ?

    Dans l'idée la plus simpliste on aurait :

    - une procédure de lancement dans laquelle est paramétré le mot à chercher, et la sélection des dossiers (pour le moment reprend juste la méthode actuelle, on fera la customisation dont j'ai parlé quand les box seront en place)

    - une procédure qui traite l'ouverture et le parcours d'un seul fichier


    Ainsi, on appellera la procédure de recherche dans une boucle présente dans la procédure principale


    Un découpage encore plus complexe peut-être fait ... mais ça à la rigueur, quand t'auras mesuré l'intérêt et la méthode des "box", tu organisera à ta convenance

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 775
    Points : 177
    Points
    177
    Par défaut
    Bonjour joe.levrai

    Voilà ce que j'ai bidouillé, est-ce ça correspond à ce que tu me conseille ?

    Concernant la constante trouvée ou non, je ne trouve pas de solution ?
    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
    Sub RechercheMotVBA_0() 'RECHERCHE UNE CONSTANTE DANS LE CLASSEUR CHOISI
    Dim VBComp As VBComponent, Mdl As CodeModule
    Dim i, MotRecherché As String
        MotRecherché = InputBox("", "CHOISIR LE MOT RECHERCHÉ")
        If MotRecherché = "" Or MotRecherché = False Then End
        Application.ScreenUpdating = False
        'efface les données
        Sheets("Résultat").Range("A2", Range("A2").End(xlDown)).ClearContents
        'sélection répertoire
        With Application.FileDialog(msoFileDialogFilePicker)
            .Title = "CHOIX FICHIER(S)"
            .ButtonName = "Traitement"
            .Filters.Clear
            .Filters.Add "Classeur xlsm", "*.xlsm"
            .AllowMultiSelect = True
            If .Show = True Then
                NomFichierChosi = Split(.SelectedItems(1), "\")(UBound(Split(.SelectedItems(1), "\")))
                'Ouverture et masquage de l'objet en question
                Set Wbk = GetObject(PathName:=.SelectedItems(1))
                    'parcourir tous les modules du fichier chosi
                    For Each VBComp In Workbooks(NomFichierChosi).VBProject.VBComponents
                        'instancier le module
                        Set Mdl = VBComp.CodeModule
                        'au sein du module
                        With VBComp.CodeModule
                            ' pour chaque ligne de code
                            For i = 1 To .CountOfLines
                                ' si la ligne contient la variable MotRecherché
                                If .Lines(i, 1) Like "*" & MotRecherché & "*" Then 'recherche un mot quelquonque
                                    'liste le nom du  fichier et module contenant la variable MotRecherché
                                    Sheets("Résultat").Columns("A:A").Find("*", [A1], , , , xlPrevious).Offset(1, 0) = NomFichierChosi & " : " & VBComp.Name
                                End If
                            Next i
                        End With
                    Next VBComp
                'Fermeture de l'objet (Wbk) sans sauvegarde
                Wbk.Close SaveChanges:=False
            End If
        End With
        Range("A1") = "LISTE FICHIERS CONTENANT LA VARIABLE : " & MotRecherché
        'supprime les doublons
        Sheets("Résultat").Range("A1", Range("A1").End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlYes
        Range("A2").EntireColumn.AutoFit
        Application.ScreenUpdating = True
    End Sub

  17. #17
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Non ce n'était pas tout à fait ça, je te parlais de découper tes traitements en plusieurs procédures

    un exemple fait très rapidement, et pas super optimisé :

    Un fonction qui test si la constante existe, et renvoie le nom du module où elle se trouve.
    Si la constante n'existe pas, la fonction retourne une chaine vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function ConstanteExiste(LaConstante As String, LeProjet As VBProject) As String
    Dim LeModule As VBComponent, i As Long
        For Each LeModule In LeProjet.VBComponents
            With LeModule.CodeModule
                For i = 1 To .CountOfLines
                    If .Lines(i, 1) Like "*" & "Const " & LaConstante & " As*" Then
                        ConstanteExiste = LeModule.Name
                        Exit Function
                    End If
                Next i
            End With
        Next LeModule
    End Function

    Et une procédure principale qui demande le nom de la constante à l'utilisateur, ainsi que la liste des fichiers à vérifier
    Une boucle sur chaque fichier sélectionné appelle la fonction de Test
    Si le test est positif, on ajoute le fichier (et le nom du module) dans un tableau de résultat
    A la fin des tests, on injecte le tableau de résultat en colonne A

    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
    Option Base 1
    Sub RechercheMotVBA_0()
    Dim MotRecherché As String, ListeFichier(), j As Long, MonTest As String
        MotRecherché = InputBox("", "CHOISIR LE MOT RECHERCHÉ")
     If MotRecherché = "" Then Exit Sub
     
    ReDim ListeFichier(1): ListeFichier(1) = "LISTE FICHIERS CONTENANT LA VARIABLE : " & MotRecherché
     
    Application.ScreenUpdating = False
        Sheets("Résultat").Columns(1).ClearContents
        With Application.FileDialog(msoFileDialogFilePicker)
            .Title = "CHOIX FICHIER(S)"
            .ButtonName = "Traitement"
            .Filters.Clear
            .Filters.Add "Classeur xlsm", "*.xlsm"
            .AllowMultiSelect = True
            If .Show = True Then
                For j = 1 To .SelectedItems.Count
                    With Workbooks.Open(.SelectedItems(j))
                        MonTest = ConstanteExiste(MotRecherché, .VBProject)
                        If MonTest <> "" Then
                            ReDim Preserve ListeFichier(UBound(ListeFichier) + 1)
                            ListeFichier(UBound(ListeFichier)) = .Name & " : " & MonTest
                        End If
     
                        .Close False
                    End With
                Next j
     
                Sheets("Résultat").Range("A1").Resize(UBound(ListeFichier)).Value = Application.Transpose(ListeFichier)
                Sheets("Résultat").Columns(1).AutoFit
            End If
        End With
    Application.ScreenUpdating = True
    End Sub

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 775
    Points : 177
    Points
    177
    Par défaut
    Voici le message qui apparait lorsque je lance la procédure :

    Nom : erreur compilation.jpg
Affichages : 1510
Taille : 14,1 Ko
    Corriger en activant la Visual Basic For Applications Extensibility 5.3

  19. #19
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Si tu veux t'affranchir de la référence à cocher (qui peut devenir problématique si tu distribue ton fichier), tu peux remplacer tout les types de variables se rapportant à la référence, par des variables type Object :

    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
    Option Base 1
    Sub RechercheMotVBA_0()
    Dim MotRecherché As String, ListeFichier(), j As Long, MonTest As String
        MotRecherché = InputBox("", "CHOISIR LE MOT RECHERCHÉ")
     If MotRecherché = "" Then Exit Sub
     
    ReDim ListeFichier(1): ListeFichier(1) = "LISTE FICHIERS CONTENANT LA VARIABLE : " & MotRecherché
     
    Application.ScreenUpdating = False
        Sheets("Résultat").Columns(1).ClearContents
        With Application.FileDialog(msoFileDialogFilePicker)
            .Title = "CHOIX FICHIER(S)"
            .ButtonName = "Traitement"
            .Filters.Clear
            .Filters.Add "Classeur xlsm", "*.xlsm"
            .AllowMultiSelect = True
            If .Show = True Then
                For j = 1 To .SelectedItems.Count
                    With Workbooks.Open(.SelectedItems(j))
                        MonTest = ConstanteExiste(MotRecherché, .VBProject)
                        If MonTest <> "" Then
                            ReDim Preserve ListeFichier(UBound(ListeFichier) + 1)
                            ListeFichier(UBound(ListeFichier)) = .Name & " : " & MonTest
                        End If
     
                        .Close False
                    End With
                Next j
     
                Sheets("Résultat").Range("A1").Resize(UBound(ListeFichier)).Value = Application.Transpose(ListeFichier)
                Sheets("Résultat").Columns(1).AutoFit
            End If
        End With
    Application.ScreenUpdating = True
    End Sub
     
    Function ConstanteExiste(LaConstante As String, LeProjet As Object) As String
    Dim LeModule As Object, i As Long
        For Each LeModule In LeProjet.VBComponents
            With LeModule.CodeModule
                For i = 1 To .CountOfLines
                    If .Lines(i, 1) Like "*" & "Const " & LaConstante & " As*" Then
                        ConstanteExiste = LeModule.Name
                        Exit Function
                    End If
                Next i
            End With
        Next LeModule
    End Function
    En l'espèce, ici c'était la variable LeProjet et la variable LeModule

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 775
    Points : 177
    Points
    177
    Par défaut
    Je ne connaissais pas cette subtilité, merci à toi.

    Dans ma procédure si la constante est trouvée elle inscrit dans le titre de la colonne "LISTE FICHIERS CONTENANT LA VARIABLE : MotRecherché" et liste en A2 les noms des classeurs et ses modules qui contiennent la constante.

    En testant ton dernier code ça fonctionne pas ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Protéger le code vba de plusieurs classeurs Excel par mot de passe
    Par Thierry_67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/03/2015, 00h43
  2. [Toutes versions] Protéger le code vba de plusieurs classeurs Excel par mot de passe
    Par BAPOULA dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/10/2014, 14h16
  3. Protéger le code vba de plusieurs classeurs Excel par mot de passe
    Par BAPOULA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/10/2014, 11h34
  4. [XL-2003] Supprimer tous module et code VBA d'un classeur fermé
    Par grand_arnaud dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 20/09/2012, 17h26
  5. [VBA]Comment, dans le code VBA, hasher un mot de passe ?
    Par lord abortion dans le forum VBA Access
    Réponses: 6
    Dernier message: 18/04/2007, 16h41

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