• Initiateur de la discussion Initiateur de la discussion vloom
  • 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 !

V

vloom

Guest
Bonjour,

J'ai tout un tas de fichiers xls et doc et je voudrais connaitre lesquels ont des liens ou des macros sans avoir à les ouvrir un à un...
Existe-t'il une solution?

Merci.
 
Bonjour vloom, le Forum.

Pour les fichiers xls contenant ou non des macros, il y a quelques temps j'avais réalisé le classeur ci-joint en réponse à une demande similaire...

Cordialement, [file name=TestMacrosClasseurs_20050620185908.zip size=15397]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/TestMacrosClasseurs_20050620185908.zip[/file]

Message édité par: myDearFriend!, à: 20/06/2005 18:59
 

Pièces jointes

hey mon cher ami,
j'ai un plantage à : For Each Obj In Classeur.VBProject.VBComponents
est-ce parceque je n'ai pas la bonne librairie?
je suis sous xl2003...
sinon c'est exactement ce que je cherche.
tu n'aurais pas dans un vieux tiroir la même chose pour les fichiers avec liens?
encore merci
 
Re vloom,

Ci-joint une adaptation de mon exemple précédent pour tenter de répondre à la détection des liens...
Cette adaptation utilise le code suivant :
Sub TestClasseurs()
Dim Dossier As Object, Fichier As Object
Dim
Chemin As String, CeFichier As String
Dim
L As Long
Dim
MemAskL As Boolean
      Application.ScreenUpdating = False
      CeFichier = ThisWorkbook.Name
      'Chemin du dossier à analyser (à adapter au besoin)
      Chemin = ThisWorkbook.Path & '\'
      'Analyse du dossier
      MemAskL = Application.AskToUpdateLinks
      Application.AskToUpdateLinks = False
      L = 1
      Set Dossier = CreateObject('Scripting.FileSystemObject').GetFolder(Chemin)
      For Each Fichier In Dossier.Files
            If Fichier.Name <> CeFichier Then
                  'Liste les fichiers Excel en précisant s'ils contiennent des macros ou des liens
                  If Right(Fichier.Name, 3) = 'xls' Then
                        L = L + 1
                        Application.EnableEvents = False
                        Workbooks.Open Chemin & Fichier.Name
                        With ThisWorkbook.Sheets('Test')
                              .Cells(L, 1) = IIf(ContientMacros(ActiveWorkbook), 'OUI', '')
                              .Cells(L, 2) = IIf(ContientLiens(ActiveWorkbook), 'OUI', '')
                              .Cells(L, 3) = Fichier.Name
                        End With
                        ActiveWorkbook.Close False
                        Application.EnableEvents = True
                  End If
            End If
      Next
      Set Dossier = Nothing
      Application.AskToUpdateLinks = MemAskL
      Application.ScreenUpdating = True
      MsgBox L & ' classeurs trouvés !'
End Sub
'______________________________________________________________________________________

Private Function ContientMacros(Classeur As Workbook) As Boolean
Dim
Obj As Object
      For Each Obj In Classeur.VBProject.VBComponents
            With Obj.CodeModule
                  ContientMacros = .CountOfDeclarationLines + 1 < .CountOfLines
            End With
            If ContientMacros Then Exit For
      Next Obj
End Function
'______________________________________________________________________________________

Private Function ContientLiens(Classeur As Workbook) As Boolean
      ContientLiens = Not IsEmpty(Classeur.LinkSources)
End Function
Evidemment, l'ensemble n'est pas très rapide...

Cordialement, [file name=TestMacrosLiens.zip size=13821]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/TestMacrosLiens.zip[/file]
 

Pièces jointes

c'est génial!
allez, j'abuse:
- ca ne fonctionne pas si le fichier a une macro et un lien
- j'ai pas l'affichage du OUI dans la colonne lien (le fichier est bien détecté)
- comment scaner l'ensemble d'un dossier et des sous-dossier sans être un bourrin?

désolé... ne perd pas trop ton temps là-dessus, c'est déjà chouette.
 
Bonsoir vloom,

Ci-joint une ultime version modifiée de l'exemple précédent. Cette version scanne l'ensemble des fichiers Excel présent dans le dossier du classeur ainsi que dans ces sous-dossiers (le chemin de chaque fichier est précisé également)...

J'ai modifié le code comme suit :
Sub TestClasseurs()
Dim Dossier As Object, Fichier As Object
Dim
Chemin As String, CeFichier As String
Dim
TabDossiers As Variant
Dim
L As Long, D As Long
Dim
MemAskL As Boolean
      Application.ScreenUpdating = False
      CeFichier = ThisWorkbook.Name
      'Empêcher les alertes de lien à l'ouverture des classeurs
      MemAskL = Application.AskToUpdateLinks
      Application.AskToUpdateLinks = False
      L = 1
      'Création du tableau des sous-dossiers existants
      TabDossiers = lstDossiers(ThisWorkbook.Path, True)
      For D = 1 To UBound(TabDossiers)
            'Chemin du dossier (ou sous-dossier) à analyser
            Chemin = TabDossiers(D) & '\'
            'Analyse du dossier (ou sous-dossier)
            Set Dossier = CreateObject('Scripting.FileSystemObject').GetFolder(Chemin)
            For Each Fichier In Dossier.Files
                  If Fichier.Name <> CeFichier Then
                        'Liste les fichiers Excel
                        If Right(Fichier.Name, 3) = 'xls' Then
                              L = L + 1
                              'Empêche les macros à l'ouverture
                              Application.EnableEvents = False
                              Workbooks.Open Chemin & Fichier.Name
                              With ThisWorkbook.Sheets('Test')
                                    .Cells(L, 1) = IIf(ContientMacros(ActiveWorkbook), 'OUI', '')
                                    .Cells(L, 2) = IIf(ContientLiens(ActiveWorkbook), 'OUI', '')
                                    .Cells(L, 3) = Chemin
                                    .Cells(L, 4) = Fichier.Name
                              End With
                              ActiveWorkbook.Close False
                              Application.EnableEvents = True
                        End If
                  End If
            Next
      Next D
      Set Dossier = Nothing
      'Rétablit l'alerte de lien éventuelle dans les options Excel
      Application.AskToUpdateLinks = MemAskL
      Application.ScreenUpdating = True
      MsgBox L & ' classeurs trouvés !'
End Sub
'______________________________________________________________________________________

Private Function lstDossiers(Chemin As String, Optional Debut As Boolean) As Variant
Dim
Dossier As Object, SD As Object, D As Object
Static
TabTemp() As String
      If Debut Then
            ReDim TabTemp(1 To 1)
            TabTemp(1) = Chemin
      End If
      Set Dossier = CreateObject('Scripting.FileSystemObject').GetFolder(Chemin)
      'examen du dossier courant
      For Each D In Dossier.subfolders
            ReDim Preserve TabTemp(1 To UBound(TabTemp) + 1)
            TabTemp(UBound(TabTemp)) = D.Path
      Next
      'Traitement récursif des sous-dossiers (d'après un code de F.Sigonneau)
      For Each SD In Dossier.subfolders
        lstDossiers SD.Path
      Next SD
      lstDossiers = TabTemp()
      Set Dossier = Nothing
End Function

'______________________________________________________________________________________

Private Function ContientMacros(Classeur As Workbook) As Boolean
Dim
Obj As Object
      For Each Obj In Classeur.VBProject.VBComponents
            With Obj.CodeModule
                  ContientMacros = .CountOfDeclarationLines + 1 < .CountOfLines
            End With
            If ContientMacros Then Exit For
      Next Obj
End Function
'______________________________________________________________________________________

Private Function ContientLiens(Classeur As Workbook) As Boolean
      ContientLiens = Not IsEmpty(Classeur.LinkSources)
End Function
En ce qui concerne les 2 premiers points que tu cites, j'avoue ne pas trop savoir quoi te dire... J'ai testé ce classeur sur XL97, 2002 et 2003 sans avoir rencontré de problème particulier...

Cordialement, [file name=TestMacrosLiens_20050621230706.zip size=18858]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/TestMacrosLiens_20050621230706.zip[/file]
 

Pièces jointes

cher didier,
j'ai essayé sur 2003 et 97 et je n'ai pas le oui pour les classeurs avec des liens.
un autre truc étrange: si un classeur contient un dessin (pas de macro ni de lien), il apparait dans la liste?!
si un projet est protégé, ca stoppe...
bon, c'est du détail je le reconnais, mais je suis tellement nuuul.
 
pour les projets protégés j'ai mis:

Private Function ContientMacros(Classeur As Workbook) As Boolean
Dim Obj As Object
If Application.VBE.ActiveVBProject.Protection = vbext_pp_none Then
For Each Obj In Classeur.VBProject.VBComponents
With Obj.CodeModule
ContientMacros = .CountOfDeclarationLines + 1 < .CountOfLines
End With
If ContientMacros Then Exit For
Next Obj
End If
End Function

j'ai bon, là?
 
- 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
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

  • Question Question
Microsoft 365 Liens hypertexte
Réponses
4
Affichages
412
  • Question Question
Microsoft 365 Fonction si
Réponses
7
Affichages
215
Réponses
15
Affichages
631
W
Réponses
1
Affichages
160
Retour