lien ou macro

  • Initiateur de la discussion vloom
  • Date de début
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.
 

myDearFriend!

XLDnaute Barbatruc
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

  • TestMacrosClasseurs_20050620185908.zip
    15 KB · Affichages: 8
V

vloom

Guest
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
 

myDearFriend!

XLDnaute Barbatruc
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

  • TestMacrosLiens.zip
    13.5 KB · Affichages: 11
V

vloom

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

myDearFriend!

XLDnaute Barbatruc
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

  • TestMacrosLiens_20050621230706.zip
    18.4 KB · Affichages: 7
V

vloom

Guest
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.
 
V

vloom

Guest
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à?
 

Discussions similaires

Réponses
7
Affichages
513

Statistiques des forums

Discussions
312 492
Messages
2 088 942
Membres
103 989
dernier inscrit
jralonso