recherche de fichiers contenant macro

wwwhttp

XLDnaute Nouveau
Bonjour,
je suis à la recherche d'une bonne âme afin de m'aider à trouver les fichiers contenant des macros.
le but est d'identifier dans un répertoire et ses sous-répertoires tous les fichiers xls qui contiennent du vba et de les restituer sous une forme de liste quelconque (xls, txt, html, ...).
les fichiers à analyser sont tous sous Excel 2003 et sous environnement windows xp
merci d'avance pour votre aide
 

job75

XLDnaute Barbatruc
Re : recherche de fichiers contenant macro

Bonjour le fil, le forum,

Michel a raison, la méthode la plus simple pour étudier l'arborescence des sous-dossiers est la méthode récursive.

J'ai donc revu le code :

Code:
Option Explicit
Dim ListeDossiers$() 'mémorise la variable

Sub FichiersAvecMacros()
Dim chemin As Variant, lig&, col%, sbar As Boolean
Dim debut&, dossier$, fichier$, test As Boolean, compte&
'---initialisation---
chemin = ThisWorkbook.Path
lig = 2: col = 1
sbar = Application.DisplayStatusBar
Application.DisplayStatusBar = True 'affichage de la barre d'état
Cells.Delete 'RAZ
Cells(1, col).Resize(, 4) = Array("N°", "MACRO", "DOSSIER", "FICHIER")
Columns.AutoFit
Rows(1).Font.Bold = True 'gras
Rows(1).Font.Color = vbBlue
'---liste des dossiers---
ReDim ListeDossiers(0)
ListeDossiers(0) = chemin
If MsgBox("Voulez-vous traiter les sous-dossiers ?", 4) = 6 _
  Then SousDossiers CStr(chemin), 1
'---analyse des fichiers---
Application.ScreenUpdating = False
debut = InStrRev(ListeDossiers(0), "\") + 1
For Each chemin In ListeDossiers
  dossier = Mid(chemin, debut) 'chemin à partir du 1er dossier
  fichier = Dir(chemin & "\*xls")
  While fichier <> ""
    If fichier <> ThisWorkbook.Name Then
      On Error Resume Next
      Workbooks(fichier).Close False 'si un fichier du même nom est ouvert
      On Error GoTo 0
      Workbooks.Open chemin & "\" & fichier
      test = ContientMacros(Workbooks(fichier))
      Workbooks(fichier).Close False
      compte = compte + 1 'compteur
      Application.StatusBar = compte
      Cells(lig, col) = compte
      If test Then Cells(lig, col + 1) = "OUI"
      Cells(lig, col + 2) = dossier
      Cells(lig, col + 3) = fichier
      lig = lig + 1
      If lig = Rows.Count Then 'limite de la feuille, nouvelles colonnes
        lig = 2
        col = col + 4
        Cells(1, col).Resize(, 4) = Array("N°", "MACRO", "DOSSIER", "FICHIER")
      End If
    End If
    fichier = Dir
  Wend
Next
Columns.AutoFit
Application.DisplayStatusBar = sbar
End Sub

Sub SousDossiers(chemin$, n&)
Dim fso As Object, dossier As Object, sd As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set dossier = fso.GetFolder(chemin)
For Each sd In dossier.subfolders
  ReDim Preserve ListeDossiers(n)
  ListeDossiers(n) = sd.Path
  n = n + 1
  SousDossiers sd.Path, n 'méthode récursive
Next
Set fso = Nothing
End Sub

Function ContientMacros(Wb As Workbook) As Boolean
Dim o As Object
For Each o In Wb.VBProject.VBComponents
  With o.CodeModule
    ContientMacros = .CountOfDeclarationLines + 1 < .CountOfLines
  End With
  If ContientMacros Then Exit For
Next
End Function
C'est bien plus propre mais ne change pas grand-chose à la durée d'exécution.

Edit 1 : ajouté le changement de colonnes quand la dernière ligne de la feuille est atteinte.

Edit 2 : compteur dans la barre d'état, pour passer le temps...

A+
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : recherche de fichiers contenant macro

Bonsoir à tous

job75
Tu n'es pas tenté par l'utilisation de findstr ?
(ni même apparemment les autres lecteurs du fil ;) )

Pourtant normalement, on devrait tirer son épingle du jeu niveau durée d’exécution, non ?)

On peut même passer par VBA pour l'occasion
(bien que cela n'apporte rien de plus que de passer par un batch ou directement à partir de l'invite MSDOS)
Code:
Sub FINDSTRenVBA()
Dim objShell, SearchString$, CmdStr$, strPath$
Set objShell = CreateObject("Wscript.Shell")
SearchString = "End Sub"
strPath = "C:\Temp\*.xls"
CmdStr = "cmd /c findstr /s /m " & Chr(34) & SearchString & Chr(34) & " " & strPath & " > " & "c:\temp\test.txt"
objShell.Run CmdStr, 0, True
End Sub
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : recherche de fichiers contenant macro

Bonsoir JM,

Chez moi (Win XP - Excel 2003) bug sur objShell.Run CmdString, 0, True

Même avec comme chemin d'accès ThisWorkbook.Path

Par ailleurs tu recherches "End Sub" mais quid de "End Function" ?

Et si "End Sub" se trouve dans une feuille de calcul n'y aura-t-il pas confusion ?

A+
 

Staple1600

XLDnaute Barbatruc
Re : recherche de fichiers contenant macro

Re,


EDITION: mea culpa :(:p:eek:
Je viens de m'apercevoir que findstr semble "ouvrir" les fichiers.
Car j'ai testé findstr avec un fichier Excel ouvert et j'ai ce message d'erreur
01OHNO.png




job75

Erreur Typo (j'ai édité mon précédent message) (désolé ;))

Avec End Sub, on trouvera des fichiers avec des procédures événementielles, des userforms (s'il y a du code dedans), des procédures dans des modules.

NB: Ma proposition (avec findstr) n'est pas une solution optimum, juste une voie à explorer ;)
(mais normalement comme on ouvre pas les classeurs, cela devrait être beaucoup plus rapide sur un grand nombre de fichiers)

Autre piste
On peut aussi d'utiliser pour les versions récentes de Windows, la recherche avancée Windows
Conseils avancés pour rechercher dans Windows
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : recherche de fichiers contenant macro

Bonsoir wwwhttp, JM, le forum,

Je ne pense pas qu'on puisse faire autrement que d'ouvrir chaque fichier .xls pour voir s'il contient des macros.

Mais alors les durées d'exécution indiquées au post #13 sont rédibitoires pour 900000 fichiers :eek:

On peut quand même s'en sortir en divisant l'analyse :rolleyes:

1) Placez-vous sur la 1ère feuille du fichier pilote, nommez-la du nom du dossier de ce fichier.

Lancez la macro du post #16 et cliquez sur "Non" dans la MsgBox.

2) Ensuite déplacez le fichier dans un des sous-dossiers.

Traitez par exemple un ou 2 sous-dossiers chaque jour.

Placez-vous à chaque fois sur une nouvelle feuille que vous nommez du nom du sous-dossier.

Lancez la macro et cliquez sur "Oui".

S'il y a 10 sous-dossiers cela divisera (peut-être) la durée d'exécution par 10.

Tout dépend de la disposition, à vous d'adapter ce que je viens de dire.

A+
 

wwwhttp

XLDnaute Nouveau
Re : recherche de fichiers contenant macro

Bonjour à tous,
je ne vous ai pas oublié, juste qlq trucs urgents qui me sont tombés dessus.
j'ai réussi grâce à vous à trouver ce que je cherchais, et ça c'est une bonne nouvelle.
j'ai utilisé la macro de job75 et pour éviter de fouiller parmi toutes l'arborescence de mon serveur, j'ai au préalable copié tous les xls dans le même dossier (oui, j'aurai pu y penser avant). Une recherche par nom + taille me permettra de retrouver le bon fichier en cas de doublon sur le serveur.
j'ai ensuite regroupé par lot de 500 fichiers afin ne pas être mobilisé trop longtemps à chaque fois devant l'écran, en effet la macro ne gère pas la validation auto des boites de dialogue lorsque des fichiers sont liés, lorsque le classeur est protégé ou partagé ou bien lorsque les macros sont protégées et dans ce cas, ça plante. il faut donc isoler ces fichiers récalcitrants et relancer.
Au final j'ai analysé en une grosse 1/2 journée près de 10000 fichiers et obtenu le résultats escompté.
Grand merci à tous !
 

Discussions similaires

Réponses
19
Affichages
2 K

Statistiques des forums

Discussions
312 501
Messages
2 089 014
Membres
104 005
dernier inscrit
Maxence