Exceldateien nach VBA-Code durchsuchen

Hallo zusammen,

wie könnte ich ein Programm bauen, das mir in allen Exceldateien eines Ordners (mit Unterordnern) nach einem bestimmten String im VBA-Code sucht?
Kennt Ihr dazu ein Programm oder irgend eine Lösung?

Hintergrund:
Ab Excel 2003 gibt es den Befehl Application.FileSearch nicht mehr.
Keine Ahnung warum MS das verschlafen und bis heute nicht korrigiert hat. *grrr*
Alle Excelanwendungen, die Application.FileSearch benutzen, werden bei einer Umstellung auf Excel 2007 oder Excel 2010 nicht mehr funktionieren.

Inzwischen habe ich mir einen Ersatz für Application.FileSearch gebaut und in einigen Exceldateien eingebaut.
Nun möchte ich vollständig alle Programme finden, in denen Application.FileSearch verwendet ist.

Gruß JoKu

wie könnte ich ein Programm bauen, das mir in allen
Exceldateien eines Ordners (mit Unterordnern) nach einem
bestimmten String im VBA-Code sucht?
Kennt Ihr dazu ein Programm oder irgend eine Lösung?

Hallo Joku,

nachstehender Code liest aus allen grad geöffneten Mappen aus und listet die mappennamen und die Module auf in denen „Filesearch“ drinsteht. (Ich habe ihn nur kurz getestet)

Den mußt du mit deinem Code zusammenbasteln.

Gruß
Reinhard

Sub FilesearchSuche()
Dim CMdl, wkb As Workbook, meld1 As String, meld2 As String, Zei As Long
Dim wks As Worksheet
Set wks = ThisWorkbook.Worksheets("Tabelle1")
For Each wkb In Workbooks
 meld1 = wkb.Name
 For Each CMdl In wkb.VBProject.VBComponents
 meld2 = CMdl.Name
 With CMdl.CodeModule
 If .Find("FileSearch", 1, 1, -1, -1, False, False, True) Then
 Zei = Zei + 1
 wks.Cells(Zei, 1).Value = meld1
 wks.Cells(Zei, 2).Value = meld2
 End If
 End With
 Next CMdl
Next wkb
wks.Columns("A:B").AutoFit
End Sub

Hallo,

das Programm sieht ja schon mal gut aus. :smile:

Leider kommt aber beim Ausführen der Zeile
For Each CMdl In wkb.VBProject.VBComponents
die Fehlermeldung
Laufzeitfehler ‚1004‘:
Der programmatische Zugriff auf das Visual Basic-Projekt ist nicht sicher.

Wenn man dann „Debugging“ auswählt und versucht, das Programm weiterlaufen zu lassen (F5), kommt:
Die Methode ‚VBProject‘ für das Objekt ‚_Workbook‘ ist fehlgeschlagen.

Oh, habe es gefunden:
Extras - Makro - Sicherheit > Register „Vertrauenswürdige Quellen“ die Option „Zugriff auf Visual Basic Projekt vertrauen“ aktivieren.

Es funktioniert. - Danke!

Jetzt muss ich es nur noch in ein Progrämmle einbauen, das alle Excelmappen durchkämmt. Das bekomme ich hin.

Hast Du noch eine Idee, wie man von der Fundstelle die jewilige Zeile anzeigen könnte?

Gruß JK

Hallo Joku,

Leider kommt aber beim Ausführen der Zeile
For Each CMdl In wkb.VBProject.VBComponents
die Fehlermeldung
Laufzeitfehler ‚1004‘:
Der programmatische Zugriff auf das Visual Basic-Projekt ist
nicht sicher.

okay, kam bei mir nicht aber hast es ja gefunden. Ich hab nur 2000 und 2007, keine Ahnung seit wann das ist, jedenfalls muß man da in höheren Versionen als 2000 zwei Häkchen irgendwo setzen damit auch eigene Makros laufen.
Aber hast es ja gefunden.

Jetzt muss ich es nur noch in ein Progrämmle einbauen, das
alle Excelmappen durchkämmt. Das bekomme ich hin.

Du hattest gesagt daß du dir das „Durchkämm“_makro geschrieben hast und gehe davon aus du kriegst das hin, wenn nicht melde dich und zeig die Codes.

Und zu Filesearch, das ist für alle Zeiten verschwunden *denk*

Hast Du noch eine Idee, wie man von der Fundstelle die
jewilige Zeile anzeigen könnte?

Was genau willst du von der Fundstellenzeile? Du weißt doch was drin stehen wird, irgendwas mit Filesearch :smile:)

Willst du vielleicht nicht nur Mappenname, Modulname sondern auch Prozedurname?
Oder gar zusätzlich den Code aller Mappen aufgelistet?

Also per Code eine Tabelle erstellt haben mit diesen Überschriften:
Pfad Datei Modul Prozedur Code

So Code sah ich schon bzw. habe ihn mir selbst zusammengebastelt.

Was genau möchtest du?

Übrigens, was viele nicht auf Anhieb wissen, Vba kennt als prozeduren Sub, Function und Property.

Ich sah schon derartigen Code von Profis, wenn du Properties-Prozeduren hast gibt es auch mit deren Code Komplikationen und man muß anders an die Sache rangehen.

Gruß
Reinhard

Danke für Deinen Einsatz!!

Jetzt muss ich es nur noch in ein Progrämmle einbauen, das
alle Excelmappen durchkämmt. Das bekomme ich hin.

Du hattest gesagt daß du dir das „Durchkämm“_makro geschrieben
hast und gehe davon aus du kriegst das hin, wenn nicht melde
dich und zeig die Codes.

Ja, kriege ich hin.

Und zu Filesearch, das ist für alle Zeiten verschwunden *denk*

Diese MS-Dämels!

Hast Du noch eine Idee, wie man von der Fundstelle die
jewilige Zeile anzeigen könnte?

Was genau willst du von der Fundstellenzeile? Du weißt doch
was drin stehen wird, irgendwas mit Filesearch :smile:)

Stimmt.
Prozedurname reicht.

Oder gar zusätzlich den Code aller Mappen aufgelistet?

Besser nicht. :wink:
Das wird zu viel.

Pfad Datei Modul Prozedur

Die ersten 3 Spalten kann ich füllen. Nur für die Prozedur fehlt mir noch das „Zauberwort“.
[[Speak friend and enter!]]

Übrigens, was viele nicht auf Anhieb wissen, Vba kennt als
prozeduren Sub, Function und Property.

Meine Filesearchs stehen immer in SUBs.

Ich sah schon derartigen Code von Profis, wenn du
Properties-Prozeduren hast gibt es auch mit deren Code

Die habe ich nicht - bring mich leiber nicht auf Ideen!

Gruß
JoKu

Hallo Joku,

Danke für Deinen Einsatz!!

gerne.

Du hattest gesagt daß du dir das „Durchkämm“_makro geschrieben
hast und gehe davon aus du kriegst das hin, wenn nicht melde
dich und zeig die Codes.

Ja, kriege ich hin.

Das ist sehr gut, davon hast du langfristig mehr als wenn du fertigen Code übernimmst.

Und zu Filesearch, das ist für alle Zeiten verschwunden *denk*

Diese MS-Dämels!

Was soll’s, MS hat entschieden das Filesearch wegkommt und damit weltweit 100.000ende, Millionen Codes wertlos werden in XL2007.
Damit muß man halt weltweit klarkommen.

Hast Du noch eine Idee, wie man von der Fundstelle die
jewilige Zeile anzeigen könnte?

Was genau willst du von der Fundstellenzeile? Du weißt doch
was drin stehen wird, irgendwas mit Filesearch :smile:)

Prozedurname reicht.

Okay, ich schau mal.

Oder gar zusätzlich den Code aller Mappen aufgelistet?

Besser nicht. :wink:

Pfad Datei Modul Prozedur

Die ersten 3 Spalten kann ich füllen. Nur für die Prozedur
fehlt mir noch das „Zauberwort“.
[[Speak friend and enter!]]

Ich hab nicht die geringste Ahnung wie ich mit meinem Wissen daß speak sprechen heißt, frined Freund was die eine Zeile sinngemäß bedeutet.
Aber egal, schau dir mal diesen w-w-w Beitrag an,

/t/makro-zeile-lesen/4198478/5

Grad den habe ich genommen um für dich was zu basteln.

Hilft das dir, wenn nicht kein Akt, melde dich.

Gruß
Reinhard

Übrigens, was viele nicht auf Anhieb wissen, Vba kennt als
prozeduren Sub, Function und Property.

Meine Filesearchs stehen immer in SUBs.

Ich sah schon derartigen Code von Profis, wenn du
Properties-Prozeduren hast gibt es auch mit deren Code

Die habe ich nicht - bring mich leiber nicht auf Ideen!

Gruß
JoKu

Hallo,

… „Durchkämm“_makro …

Ja, kriege ich hin.

Das ist sehr gut, davon hast du langfristig mehr als wenn du
fertigen Code übernimmst.

Stimmt „Selbermachen“ bringt mehr.

Fundstelle …

Prozedurname reicht.

Habe ich hinbekommen: Pfad Datei Modul Prozedur

[[Speak friend and enter!]]

Ich hab nicht die geringste Ahnung wie ich mit meinem Wissen
daß speak sprechen heißt, frined Freund was die eine Zeile
sinngemäß bedeutet.

Ist ein Zitat aus einer Schlüsselszene in Herr der Ringe (Teil 1):
Die Handelnden stehen vor einem verschlossenen Tor und kommen nicht weiter …
Aber die Lösung zu erklären, nähme die Pointe des Rätsels.
Oder willst Du es statt „Selberlesen“ doch lieber sofort wissen?

Gruß
JoKu

Prozeduren Module vieler Mappen auflisten
Hallo Joku,

Fundstelle …

Prozedurname reicht.

Habe ich hinbekommen: Pfad Datei Modul Prozedur

dann zeige doch den Code wenn er gut klappt, nachfolgende freuen sich wenn sie ihn dann im Archiv finden.

[[Speak friend and enter!]]

Ich hab nicht die geringste Ahnung wie ich mit meinem Wissen
daß speak sprechen heißt, frined Freund was die eine Zeile
sinngemäß bedeutet.

Ist ein Zitat aus einer Schlüsselszene in Herr der Ringe (Teil
1):
Die Handelnden stehen vor einem verschlossenen Tor und kommen
nicht weiter …
Aber die Lösung zu erklären, nähme die Pointe des Rätsels.
Oder willst Du es statt „Selberlesen“ doch lieber sofort
wissen?

-) nein danke. Ich wollt nur wissen woher das kommt, was es ist, jetzt weiß ich es.

Ist jetzt quasi deine Anfrage erledigt, mal weglassend daß du vielleicht noch netterweise deinen Code zeigst?

Gruß
Reinhard

Hallo Reinhard,

Ist jetzt quasi deine Anfrage erledigt,

Ja, danke!!

dann zeige doch den Code wenn er gut klappt, nachfolgende
freuen sich wenn sie ihn dann im Archiv finden.

Das hatte ich (nach Test) eh vor, aber danke für den Hinwewis!

Das Ganze wird mit einer Schaltfäche in der Tabelle1 gestartet.

Option Explicit

'Suche nach "Application.FileSearch"
'
'Wenn dieses Programm nicht läuft,
'dann (bis Excel 2003) in Menü Extras/Makro/Sicherheit
'im Register "Vertrauenswürdige Quellen"
'die Option "Zugriff auf Visual Basic Projekt vertrauen" aktivieren

Sub FilesearchSuche()
 Dim CMdl
 Dim wkb As Workbook
 Dim meld\_pfad As String 'HV für Pfad
 Dim meld\_mappe As String 'HV für Excelmappe
 Dim meld\_modul As String 'HV für Modulname
 Dim meld\_sub As String 'HV für Subroutine oder Funktion
 Dim Zei As Long 'aktuelle Schreibzeile
 Dim ii As Long
 Const Suchwort As String = "Application.FileSearch"
 Dim mywks As Worksheet
 Set mywks = ThisWorkbook.Worksheets("Tabelle1")

 Call Tabelle\_vorbereiten(mywks, Zei)
 
For Each wkb In Workbooks
 meld\_pfad = wkb.Path
 meld\_mappe = wkb.Name
 For Each CMdl In wkb.VBProject.VBComponents
 meld\_sub = ""
 meld\_modul = CMdl.Name
 With CMdl.CodeModule
 
 If .Find(Suchwort, 1, 1, -1, -1, False, False, True) Then
 For ii = 1 To CMdl.CodeModule.CountOfLines
 If InStr(.Lines(ii, 1), "Sub ") \> 0 Or InStr(.Lines(ii, 1), "Function ") \> 0 Then
 meld\_sub = Trim(Mid(.Lines(ii, 1), 1, InStr(.Lines(ii, 1), "(") - 1))
 End If
 If InStr(.Lines(ii, 1), Suchwort) \> 0 Then
 Zei = Zei + 1
 mywks.Cells(Zei, 1).Value = meld\_pfad
 mywks.Cells(Zei, 2).Value = meld\_mappe
 mywks.Cells(Zei, 3).Value = meld\_modul
 mywks.Cells(Zei, 4).Value = meld\_sub
 End If
 Next ii

 End If
 End With
 Next CMdl
Next wkb

Application.ScreenUpdating = False
mywks.Range(Cells(5, 1), Cells(Zei, 4)).Columns.AutoFit
mywks.PageSetup.PrintArea = "$A$1:blush:d$" & Zei
mywks.Range("d3").Select '"Parkstellung" (unter der Schaltfäche)

Application.ScreenUpdating = True

End Sub


Sub Tabelle\_vorbereiten(mywks, Zei)

 Application.ScreenUpdating = False 'gegen Geflackere

 Columns("A:smiley:").Select
 Selection.Clear

 Zei = 2
 mywks.Cells(Zei, 1).Value = "Suche nach Application.FileSearch"
 Rows(Zei).Font.Bold = True
 Rows(Zei).Font.Size = 12

 Zei = Zei + 1
 mywks.Cells(Zei, 1).Value = "im Pfad " & ThisWorkbook.Path

 Zei = Zei + 2
 mywks.Cells(Zei, 1).Value = "Pfad"
 mywks.Cells(Zei, 2).Value = "Datei"
 mywks.Cells(Zei, 3).Value = "Modul"
 mywks.Cells(Zei, 4).Value = "Sub/Function"
 Rows(Zei).Font.Bold = True

 Application.ScreenUpdating = True
End Sub

Gruß
Jochen

Hallo Jochen,

ich sehe in den Codes aber nix was da Ordner ausliest?

Gruß
Reinhard

Hi,

ich sehe in den Codes aber nix was da Ordner ausliest?

Ich bin noch dabei, beides zu verheiraten.

Es ist noch nicht ganz fertig und nicht getestet.
Die Durchnudelei geschieht mit etwa dem Code, den Du in [http://www.klicktipps.de/excel-tipps.php#VBA-Applica…](http://www.klicktipps.de/excel-tipps.php%23VBA-ApplicationFileSearch(untere) Version) siehst. Dabei muss auch noch abgefangen werden, dass der gerade laufende Code mit durchsucht wird. - Sonst gibt es 3 Meldungen mehr. :wink:

Vor jedem Öffnen einer Excel-Mappe wird dann noch geprüft und festgehalten, ob sie bereits offen ist, damit evtl. offene Mappen nicht unbeabsichtigt geschlossen werden.
Diese Tücke kenne ich schon. *grr*

Gruß
Jochen

Hallo Jochen,

ich sehe in den Codes aber nix was da Ordner ausliest?

Ich bin noch dabei, beides zu verheiraten.

ach, die sind quasi erst nur verlobt? *grins* Auch okay.

Es ist noch nicht ganz fertig und nicht getestet.
Die Durchnudelei geschieht mit etwa dem Code, den Du in
[http://www.klicktipps.de/excel-tipps.php#VBA-Applica…](http://www.klicktipps.de/excel-tipps.php%23VBA-ApplicationFileSearch(untere)
Version) siehst. Dabei muss auch noch abgefangen werden, dass
der gerade laufende Code mit durchsucht wird. - Sonst gibt es
3 Meldungen mehr. :wink:

Ohne jetzt da geschaut zu haben, wie wärs mit
if wb.Nmae Thisworkbook.Name Then
oder so.

Vor jedem Öffnen einer Excel-Mappe wird dann noch geprüft und
festgehalten, ob sie bereits offen ist, damit evtl. offene
Mappen nicht unbeabsichtigt geschlossen werden.

Ich weiß ja nicht wie du einen Ordner durchsuchst, kann man mit Dir machen, mit FSO usw.
Wie auch immer hast du danach ja die Information über den Pfad und den reinen Mappennamen.
Den Mappennamen prüfst du ab mit sowas, teilweise Pseudocode:

Dim Offen as Boolean
For each wb in Workbooks
 if wb.name = Name der gefundenen Mappe then
 Offen =true
 exit For
 end if
Next wb
If not offen Then 
 öffne die mappe
 offen=false
end if

Diese Tücke kenne ich schon. *grr*

K.A. was du genau meinst aber ich habe mir schon die personl.xls zerschossen weil die auch in einer For-Schleife der offenen Mappen auftaucht und mein Code absolut nicht für sie gedacht war :frowning:
Naja, so lernt man :smile:)

Gruß
Reinhard

Hallo Reinhard,

ach, die sind quasi erst nur verlobt? *grins* Auch okay.

könnte man so sagen. *ggg*

Dabei muss auch noch abgefangen werden, dass
der gerade laufende Code mit durchsucht wird.

Ohne jetzt da geschaut zu haben, wie wärs mit
if wb.Nmae Thisworkbook.Name Then

Nicht ganz: Ich frage Pfad&Name ab, weil sich ja eine gleichnamige Datei in einem anderen Ordner verstecken könnte; und das soll angezeigt werden.

Dim Offen as Boolean
For each wb in Workbooks
if wb.name = Name der gefundenen Mappe then
Offen =true
exit For
end if
Next wb
If not offen Then
öffne die mappe
offen=false
end if

Nee, so:

Each gefundener Mappenname
 Prüfen und merken, ob Mappe offen
 Mappe öffnen, falls zu
 Mappe auswerten
 if Mappe nicht offen war 'die vorher offenen Mappen bleiben offen
 Mappe schließen
 endif
Nächstes Each


> 

Diese Tücke kenne ich schon. *grr*

K.A. was du genau meinst

Ich hatte Mappen offen und geändert; Excel hat sie zugemacht und die Änderungen waren futsch.

Gruß
Joku