Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
500to504
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
500to504
500to504
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Dateien auflisten, die Makros enthalten

Dateien auflisten, die Makros enthalten
14.10.2004 10:14:23
Boris
Hi Leute,
vorab: VBA nein stimmt nicht - gut wäre aber übertrieben.
Ich möchte gerne alle meine Dateien (sehr viele!) im Ordner D:\Eigene Dateien (mit diversen Subfolders) daraufhin überprüfen, ob sie auch nur irgendein Fitzelchen Makros beinhalten (also sobald beim Öffnen die Makroabfrage kommt).
Otimalerweise werden die Dateinamen (kompletter Pfad) in einem Übersichtsblatt aufgelistet und in der Nachbarspalte ein "x" oder so gesetzt, wenn die entsprechende Datei ein Makro enthält.
Gibt´s da nen schlanken Code für?
Danke und Grüße
Boris
Nachtrag: Nur .xls-Dateien sind interessant oT
Boris
Den Code zum Auflisten hab ich bereits...
Boris
Hi Leute,
...allerdings ist das ja auch nicht das kardinale Problem. Wie bekomme ich die Prüfung hin, dass die jeweilige Datei Makros enthält oder nicht?
Hier der aus dem Archiv entwendete leicht abgewandeltet Code zum Auflisten und gleichzeitigem Verlinken:
Option Explicit

Sub ScanDir()
Const Pfad As String = "D:\Eigene Dateien\"
Dim irow As Long, icounter As Long
Dim icol As Integer
irow = 1
icol = 1
With Application.FileSearch
.LookIn = Pfad
.FileName = "*.xls"
.SearchSubFolders = True
.Execute
For icounter = 1 To .FoundFiles.Count
irow = irow + 1
If irow = 65537 Then
irow = 2
icol = icol + 1
End If
Cells(irow, icol).Value = .FoundFiles(icounter)
Cells(irow, icol).Hyperlinks.Add Cells(irow, icol), .FoundFiles(icounter)
Cells(irow, icol + 1).Value = FileDateTime(.FoundFiles(icounter))
Next icounter
End With
Columns.AutoFit
End Sub

Grüße Boris
Anzeige
AW: Den Code zum Auflisten hab ich bereits...
14.10.2004 12:05:15
Rolf
Hallo Boris,
konzeptionell musst du das Abarbeiten von Dateien
eines bestimmten Verzeichnisses mit der Existenzprüfung
von Modulen verbinden.
Du musst also "nur" die beiden folgenden Makros
kombinieren und deinen Bedürfnissen anpassen.
Stell bitte deine Lösung in's Forum.
Herzliche Grüße
Rolf
'Excel-Dateien auflisten

Sub ShowFileList(folderspec) 'Argumentübergabe z.B "C:\excel\Arbeitsdateien"
Dim fs, f, f1, fc
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(folderspec)
Set fc = f.Files
For Each f1 In fc
If f1.Type = "Microsoft Excel-Arbeitsblatt" Then
Debug.Print f1.Name
End If
Next
End Sub

'Projektkomponenten auflisten

Sub projkomponenten()
Dim vb
Dim vbc
Dim i
Set vb = ActiveWorkbook.VBProject.VBComponents
For Each vbc In vb
i = i + 1
Debug.Print i & "   " & vbc.Name
Next
End Sub


Anzeige
Bevor ich mich jetzt ans Basteln begebe...
Boris
Hi Rolf,
...muss ich denn dafür jede Datei öffnen? Das wird bei ca. 2000 Dateien doch wahrscheinlich ziemlich lange dauern.
Zudem:
Wenn ich die Sub projkomponenten() richtig verstehe, dann werden doch alle VBA-Komponenten aufgelistet - also auch die Standard-Klassenmodule - egal ob Code drinsteht oder nicht. Damit wiederum wäre mir nicht geholfen.
Ich dachte, vielleicht gäb´s ne passende API dazu, die das grad mal übernimmt ;-)
Danke schonmal und Grüße
Boris
AW: Bevor ich mich jetzt ans Basteln begebe...
14.10.2004 12:35:16
Rolf
Hallo Boris,
sorry, mit der von dir gewünschten Eier legenden API-Wollmilchsau
kann ich leider nicht dienen.
Die Komponenten kannst du durch Abfrage auf vbc.Type einschränken.
Das Mengenproblem und die eigentliche Arbeit kann dir auch niemand
abnehmen.
Herzliche Grüße
Rolf
Anzeige
Die eierlegende API-Wollmilchsau...
Boris
Hi Rolf,
...wäre doch aber zu schön (um wahr zu sein?) ;-)
Ansonsten ist mir mit dem vbc.Type allein ja auch nicht geholfen, da ja in den Klassenmodulen durchaus Code stehen kann.
Ins Unreine gesprochen:
Alle Dateien des vorgegebenen Pfades z.B. mit FileSearch (oder auch FSO) ermitteln, dann öffnen, dann in einer Schleife alle VB.Vomponents abgrasen, innerhalb der Schleife jedes Component auf sowas wie "CountOfLines" überprüfen (dabei die Standardanweisung "Option Explicit" außen vor lassen), wenn Ergebnis Null, dann ne Boolsche Variable auf TRUE setzen, Datei wieder schließen, Dateinamen in das Tabellenblatt schreiben und daneben den Wert der Boolschen Variable. Und dann die nächste Datei öffnen usw. usw...
Geht´s nur so?
Grüße Boris
Anzeige
AW: Die eierlegende API-Wollmilchsau...
14.10.2004 13:07:45
Rolf
Hallo Boris,
ich weiß nicht, ob's nur so geht -
aber ich würde es exakt so machen,
wie du es beschreibst.
Viel Erfolg + herzliche Grüße
Rolf
Falls noch jemand die API-Wollmilchsau kennt...
Boris
Hi Rolf,
...oder eine etwas einfacherer Lösung, dann möge er diese bitte posten.
Bin schonmal dankbar für deine Ausführungen und werde mich mal daran begeben, einen entsprechenden Code zu verfassen.
Danke und Grüße
Boris
AW: Falls noch jemand die API-Wollmilchsau kennt...
K.Rola
Hi Boris,
du wirst wohl alle Dateien mit GetObject öffnen müssen und ein clevere Abfrage machen
müssen, ob Code vorhanden ist. Wenn du {Boris} bist, bin ich da optimistisch.
Gruß K.Rola
Anzeige
Lass mich doch nicht am ausgestreckten Arm...
{Boris}
Hi Liebes,
...verhungern...
Spezifiziere doch mal bitte "clevere Abfrage".
Grüße Hasi
AW: Lass mich doch nicht am ausgestreckten Arm...
Rolf
Hallo Ihr beiden Turteltauben,
nicht, dass ich euer tête-à-tête stören wollte -
aber zurück zur Arbeit. Ich würde abfragen
n = vbc.CodeModule.CountofLines
If n größer 0 then
Kreuzchen in Excelsheet
Exit For
End If
Herzliche Grüße
Rolf
AW: Lass mich doch nicht am ausgestreckten Arm...
Reinhard
Hallo Boris,
erst dachte ich, in der .xls steht an einer bestimmten Stelle ob es Makros enthält bzw. da stehen irgendwo die Makronamen oder so. Was auch im Prinzip stimmt, wenn du ein Modul1 anlegst, mit z.B.: einfacher MsgBox-Sub findet sich in der Datei der Eintrag "M.o.d.u.l.1" (kein Punkt sondern 00Hex). Erstaunlicherweise wird dann die Datei mit dem Makro gleich ca 1500 Bytes größer also ohne das Makro.
Wenn das gleiche Makro in "DieseArbeitsmappe" steht wächst die Datei 'nur' um 600 Bytes.
Das war mir eindeutig zuviel Holz um da die Bytes zu überprüfen, ich stiess dann im Internet auf das Dateiformat von Excel (Versioenen 2-XP) https://www.herber.de/bbs/user/12128.zip aber mangels Fachwissen brachte mich das nicht weiter. Naja vielleicht kann ja jmd hier die Infos in der PDF gebrauchen.
In der VBA-Hilfe stiess ich auf die "MacroType"-Eigenschaft, leider kann man damit wohl nur Excel4-Makros herausfinden.
Nachfolgend habe ich mal was gebastelt, probiers mal aus ob es schnell genug ist für 2000 Dateien.
Ansonsten, Schnelligkeit beim Dateinamen einlesen , siehe mal meinen Artikel hier:
https://www.herber.de/forum/messages/499238.html
Gruß
Reinhard

Dim vorh As Boolean
Sub tt()
vorh = False
With Workbooks("testmitArbeitsmappe.xls")
anzahl = .VBProject.VBComponents.Count
If anzahl > 1 + .Sheets.Count Then
vorh = True
GoTo gefunden
End If
Zeilen = 0
For n = 1 To anzahl
Zeilen = Zeilen + .VBProject.VBComponents(n).CodeModule.CountOfLines
Next n
If Zeilen > 0 Then vorh = True
'If Zeilen > 1 + 4 * n Then vorh = True 'bei Option explicit
gefunden:
MsgBox "Datei " & .Name & " hat Makros ist " & vorh
End With
End Sub

Anzeige
Vorerst danke für deine ausführliche Antwort...
Boris
Hi Reinhard,
...ich komm jetzt momentan nur nicht zum Testen - aber ich melde mich später wieder.
Grüße Boris
AW: Vorerst danke für deine ausführliche Antwort...
K.Rola
Hi Boris,
worum gehts dir genau? Willst du wissen ob Code in der Datei ist, oder ob Code in der Datei ist, der ggf. auch zu einer Makrowarnung führt? Code in "echten" Klassenmodulen
und userforms führt nämlich nicht zu einer Warnung. Auch Deklarationen in Tabellenmodulen
und in "DieseArbeitsmappe" löst keine Warnung aus.
Gruß K.Rola
AW: Vorerst danke für deine ausführliche Antwort...
Boris
Hi K.Rola,
tja - da war der "Auftraggeber" etwas ungenau - es heisst nur: "Überprüfe alle Dateien darauf, ob Makros enthalten sind". Das lässt natürlich Interpretationsspielraum.
Da es sich dabei aber um meine eigenen Dateien handelt, kann ich sagen, dass die Dateien weder echte Klassenmodule enthalten noch ausschließlich aus Userforms bestehen.
Daher sollte jeder von mir programmierte Code auch beim Öffnen zu einer Makrowarnung führen.
Ich war jetzt so weit, dass ich alle Dateien in eine Spalte eingelesen habe. Den hatte ich hier https://www.herber.de/forum/messages/500609.html schon gepostet.
Jetzt hab ich das Ganze um ne weitere Routine ergänzt:

Sub Makro_ja_oder_nein()
Dim Wb As Workbook
Dim Vbc As Object
Dim Bol As Boolean
Dim C As Range
For Each C In Selection 'hier steht immer der FullName
On Error Resume Next
Set Wb = GetObject(C)
For Each Vbc In Wb.VBProject.VBComponents
If Vbc.codemodule.countoflines > 2 Then
Bol = True
C.Offset(0, 3) = "m"
Exit For
End If
Next Vbc
Wb.Close
Next C
End Sub

Also zunächst einfach mal die Überprüfung, ob es irgendein Modul gibt, welches mehr als 2 Zeilen beinhaltet (in Mappen ohne Code steht immer nur Option Explicit genau in der ersten Zeile).
Das funktioniert auch soweit (ist wohl nicht sehr schnell) - allerdings bleiben alle Projekte der mit GetObject geöffneten Dateien im Editor sichtbar. Warum nur?
Zudem hab ich bei vielen Dateien im Open-Ereignis ein Userform eingebunden - und der obige Code stoppt dann immer, bis ich das Userform wegklicke. Ist halt nervig.
Also: Ich denke, dass es so klappen wird - aber es interessiert mich schon, wie man es eleganter lösen kann.
Danke und Grüße
{Boris}
Anzeige
AW: Vorerst danke für deine ausführliche Antwort...
NE
Hi auch,
intressantes Thema ;-)
Ich hatte grad ne danz dumme Idee und zwar einmal ne Mappe mit und einmal ohne Code
in nem Editor zu öffnen und zu vergleichen.
Bei der die Module enthält, stehen so ziemlich am Ende paar Infos dazu
Somit dachte ich ja nun müsste auch sowas vom Prinzip her tun, tut aber nicht,
keine Ahnung warum ? [wahrscheinlich weils ne dumme Idee war *g*]
Jedenfalls liest er nur die ersten paar kryptischen Zeichen der Zeile und dann ist Fine
lg Nancy
--

Sub test()
Dim s$, b as Boolean
Open "c:\dummy\test\mit.xls" For Input As #1
Do While Not EOF(1)
Line Input #1, s
If InStr(1, s, "Name=""VBAProject""") Then
b = 1
Exit Do
End If
Loop
Close #1
if b then MsgBox "yeps"
End 

Sub

Anzeige
AW: Vorerst danke für deine ausführliche Antwort..
Reinhard
Hi Nancy,
ungetestet würde ich sagen du musst die Datei binary oder so öffnen.
Kannst ja mal per msbbox anschauen was so gelesen wird, dann im hexeditor nachschauen was an der abbruchstelle(= Stelle die er nicht mehr las) steht, wahrscheinlich in Hex 0d 0A oder so in der Richtung.
Gruß
Reinhard
AW: Vorerst danke für deine ausführliche Antwort..
NE
Hiho Rainhard,
hm ahso ...
sowas hab ich zwar noch nie gemacht, aber werd's mal antesten ;-)
Danke jedenfalls.
lg Nancy
AW: Vorerst danke für deine ausführliche Antwort...
K.Rola
Hi Boris,
viel schlauer bin ich noch immer nicht. Willst du nun nur wissen, ob Code enthalten ist, egal welcher Art oder, wie schon mal gefragt, ob die Makros zu einer Warnmeldung führen.
Die Abfrage nach den ersten zwei Zeilen ist nicht ausreichend, weil Deklarationen und
solche Sachen wie Option Explicit, Option Base 1, Option Private Module, Option Compare Text nicht als Code gewertet werden. Erst wenn da sowas wie Sub, Function, Property steht, wird das gewertet.
Also, nochmal präzisieren.
Gruß K.Rola
Anzeige
Ich weiss es ja selbst nicht genau...
Boris
Hi K.Rola,
wie bereits gesagt, die schlichte Anforderung wurde formuliert: Sind in der Datei Makros enthalten?
Ich interpretiere das jetzt einfach mal so, dass damit alle Dateien gemeint sind, deren Makros zu einer Warnmeldung führen. Nachfragen bzw. genau klären kann ich das leider nicht.
Da es sich überwiegend um alte Dateien von mir handelt, kann ich sagen, dass die Dateien entweder KEINEN Code enthalten (maximal die Anweisung Option Explicit) oder aber nur die Prozeduren "Sub und Function" (sowohl Public als auch Private als auch ohne).
Also - es muss vielleicht gar nicht so kompliziert gedacht werden, wobei ich deine Anmerkungen bestens nachvollziehen kann.
Jetzt klarer?
Danke und Grüße
Boris

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige