Hallo Glombus,
… Leider
läuft die Suche zu langsam. 91 Excel Dateien durchsucht das
Makro im gegebenen Hardwaresetup (Computer/Netzwerk) in
gefühlten fünf Minuten und lastet den Rechner komplett aus.
Wie lang sind denn die „gefühlten 5 Minuten“ in Realität?
5 * 60 Sekunden / 91 = 3 bis 4 Sekunden pro Datei für Suche nach allen Exceldateien in Haupt- und Unterverzeichnissen und Öffnen/Suchen/Schliessen für jede Datei.
Das ist je nach Größe der Dateien innerhalb eine Netzwerkes doch ein recht ordentlicher Wert.
-Gibt es die Möglichkeit dem Makro zu sagen wenn du in einem
Ordner fündig geworden bist, durchsuche diesen zu Ende und
schreibe dann die Ergebnisse ohne die nächsten Ordner zu
durchsuchen?
Ja, das ist kein Problem - 1. Fundstelle merken, dann Suchschleife verlassen, wenn sich der Ordner der Datei ändert
Allerdins bringt das bezüglich der Laufzeit wenig, wenn die Fundstelle sich in den zuletzt durchsuchten Ordnern befindet.
Du solltest dir also mal überlegen, ob man die Anzahl der zu öffnenden Dateien reduzieren lässt durch Anpassen des Dateisuchfilters oder auch des Datums der letzten Speicherung.
-Gibt es die Möglichkeit bei dem Fenster wo ich angebe welchen
Ordner ich durchsuchen möchte, einen gewissen Ordner
voreinzustellen…
Ja, man kann für den Auswahldialog ein Startverzeichnis vorgeben. Ich kenne aber nicht die exakte Schreibweise, die du bei einem Netzzwerk ggf. einhalten muss (Zeichne ein Makro auf mit Aktion „Datei öffnen“, dann sollte sollte da der Pfad entsprechend vorhanden sein.
Nachfolgend die angepasste Prozedur „Search_in_Files“
Gruß
Franz
Sub Search\_in\_Files()
Dim varSuchen, rngFind As Range
Dim wbkQ As Workbook, wksQ As Worksheet
Dim wbkZ As Workbook, wksZ As Worksheet
Dim lngZeile As Long, lngFile As Long, StatusCalc As Long
Dim strVerz As String
On Error GoTo Fehler
varSuchen = InputBox("Suchbegriff", "Suche in Dateien")
If varSuchen = "" Then GoTo Fehler
With Application.FileDialog(msoFileDialogFolderPicker)
strVerz = "C:\Users\Public" 'Start-Verzeichnis für die Verzeichnisauswahl - ANPASSEN!!
.InitialFileName = strVerz
.Title = "Bitte zu durchsuchendes Verzeichnis auswhlen"
If .Show = -1 Then
strVerz = .SelectedItems(1)
'Dateiliste zurücksetzen
lngp\_File = 0
Erase arrp\_Files()
'Subroutine aufrufen zur Erstellung der Dateiliste
Call ListFilesInFolder(SourceFolderName:=strVerz, \_
Datei:="\*.xls\*", \_
IncludeSubfolders:=True)
If lngp\_File = 0 Then
MsgBox "Keine Dateien im gewählten Verzeichnis gefunden"
Else
With Application
StatusCalc = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
.ScreenUpdating = False
End With
'Dateiliste abarbeiten
strVerz = ""
For lngFile = 1 To lngp\_File
Application.StatusBar = "Datei " & lngFile & " von " \_
& lngp\_File & " wird bearbeitet: " & arrp\_Files(3, lngFile)
If strVerz "" And strVerz arrp\_Files(2, lngFile) Then Exit For
'Quelldatei öffnen
Set wbkQ = Workbooks.Open(Filename:=arrp\_Files(3, lngFile), ReadOnly:=True, \_
UpdateLinks:=False)
'Tabellenblätter in Quelldatei durchsuchen
For Each wksQ In wbkQ.Worksheets
'Suchbegriff suchen - Übereinstimmung mit ganzem Zellinhalt
Set rngFind = wksQ.Cells.Find(What:=varSuchen, LookIn:=xlValues, \_
lookat:=xlWhole, MatchCase:=False)
If Not rngFind Is Nothing Then
If wbkZ Is Nothing Then
'Datei mit Tabellenblatt für Ergebnisliste erstellen
Set wbkZ = Workbooks.Add(Template:=xlWBATWorksheet)
'Spaltentitel beschriften
lngZeile = 1
Set wksZ = wbkZ.Sheets(1)
wksZ.Cells(lngZeile, 1) = "Suchbegriff: " & varSuchen
wksZ.Cells(lngZeile, 2) = "Datum Zeit: " & Format(Now, "YYYY-MM-DD hh:mm:ss")
lngZeile = 2
wksZ.Cells(lngZeile, 1) = "Verzeichnis"
wksZ.Cells(lngZeile, 2) = "Dateiname"
Range("A3").Select
ActiveWindow.FreezePanes = True
strVerz = arrp\_Files(2, lngFile) 'Verzeichnis mit Fundstelle merken
End If
lngZeile = lngZeile + 1
wksZ.Cells(lngZeile, 1) = arrp\_Files(2, lngFile) 'Verzeichnis
wksZ.Cells(lngZeile, 2) = arrp\_Files(1, lngFile) 'Dateiname
Exit For
End If
Next wksQ
Set rngFind = Nothing
wbkQ.Close savechanges:=False
Next lngFile
If wbkZ Is Nothing Then
MsgBox "Suchbegriff in keiner der Dateien gefunden"
Else
wksZ.Columns.AutoFit
End If
End If
End If
End With
Fehler:
With Err
Select Case .Number
Case 0
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
With Application
.StatusBar = False
.Calculation = StatusCalc
.EnableEvents = True
.ScreenUpdating = True
End With
lngp\_File = 0
Erase arrp\_Files()
Set wbkQ = Nothing: Set wksQ = Nothing: Set wbkZ = Nothing: Set wksZ = Nothing
End Sub