Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1044to1048
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
Inhaltsverzeichnis

Dateisuche weiter beschleunigen

Dateisuche weiter beschleunigen
05.02.2009 09:57:00
chris
Hallo VBA Experten,
ich stehe vor einem Problem und weiß mir nicht zu helfen.
Würde mich über Hilfe freuen.
ich habe eine Userform erstellt mit u.a zwei datumsfeldern.
Start und End Datum.
Als Start Datum z.b "15.01.2009 06:30:00"
Als End Datum z.b "17.01.2009 18:30:00"
Jetzt habe ich in meinen Laufwerken verschiedene ordner mit meheren Tausend Dateien.
Habe schon eine Optimierte such Routine die aber trotzdem noch sehr lange braucht um alle Dateien zu suchen und mir in meine Tabelle zu schreiben.(Ich glaube es wird auch in Ordnern gesucht die nicht durchsucht werden müssen weil in diesen Ordnern diese Datums nicht vorkommen können)
Ich habe Folgende Ordner struktur:
Also Beispiel.
R:\Safe\ZXR\Result\ML03\Data\Stat_1\FUTT\2009\02\02\20
Dieser Ordner enthält Dateien von der Zeit:
Jahr = 2009
Monat = Februar
Tag = "2" Tag im Monat
Stunde = "20" Uhr
in diesem Ordner sind Datein in diesem Format. (Zahl am Anfang geändert)
"0006xx220555126666627_13_090_2009_02_02_20_12_24.dat"
Diese Dateiname sollen gefunden werden.
Diese Datei ist entstanden z.b am
Jahr = 2009
Monat = Februar
Tag = "2" Tag im Monat
Stunde = "20" Uhr
Minute = "12"
Sekunde = "24"
Also Datum 02.02.2009 20:12:24"
die nächste Datei kann so aussehen.
"0006xx220555126666627_13_090_2009_05_02_24_12_34.dat"
Jahr = 2009
Monat = Mai
Tag = "2" Tag im Monat
Stunde = "24" Uhr
Minute = "12"
Sekunde = "34"
Wie kann ich diese suche Optimieren(beschleunigen) ?
Ich weiß es ist viel verlangt aber vielleicht geht es irgend wie schneller.
So dauert die suche manchmal über 10 Minuten.
danke an alle Helfer !!!
Momentan suche ich So:
'In Einem Modul
VonDatum = frm_main.cbo_Datum_von & " " & frm_main.tb_stunde_von & ":" & frm_main.tb_minute_von & ":00"
'VonDatum z.b SO VonDatum = 18.01.2009 06:15:00
BisDatum = frm_main.cbo_Datum_bis & " " & frm_main.tb_stunde_bis & ":" & frm_main.tb_minute_bis & ":00"
'BisDatum z.b SO VonDatum = 19.01.2009 08:30:00
'Hier wird das suchen aufgerufen
Pfad, VonDatum, BisDatum, Dateiformat, mit Unterordner, kompl. Pfad u. Datei
ListFilesInFolder sGrundPfad, VonDatum, BisDatum, "*_20##_##_##_##_##_##.dat", True, True
Sub ListFilesInFolder(SourceFolderName As String, DatumVon As Date, DatumBis As Date, Optional DateiFormat As String = "*.*", Optional IncludeSubfolders As Boolean = False, Optional FolderName As Boolean = False)
Dim FSO As Object, SourceFolder As Object, SubFolder As Object
Dim FileItem
Dim FileName As String
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.GetFolder(SourceFolderName)
On Error GoTo Err_Zugriff: 'sollte Ordener geschützt sein
If DatumOrdner(DatumVon, DatumBis, SourceFolderName) Then
For Each FileItem In SourceFolder.Files
If LCase(FileItem) Like LCase(DateiFormat) Then
FileName = Right$(FileItem, Len(FileItem) - InStrRev(FileItem, "\"))
If FunctionDatum(FileName) >= DatumVon And FunctionDatum(FileName) 'Einfügen der Daten in Tabelle
ErsteZelle.Value = IIf(False, FileItem, FileName) 'False = Nur Dateiname ausgeben
ErsteZelle.Offset(rowOffset:=0, columnOffset:=2).Value = FunctionDatum(FileName)
Set ErsteZelle = ErsteZelle.Offset(1, 0)
'Einfügen der daten in Listbox
'frm_main.ListBox1.AddItem IIf(False, FileItem, FileName) 'False = Nur Dateiname ausgeben
End If
End If
Next FileItem
End If
If IncludeSubfolders Then
For Each SubFolder In SourceFolder.SubFolders
ListFilesInFolder SubFolder.Path, DatumVon, DatumBis, DateiFormat, IncludeSubfolders, FolderName
Next SubFolder
End If
Err_Zugriff:
Set FileItem = Nothing: Set SourceFolder = Nothing: Set FSO = Nothing
End Sub


'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Private Function FunctionDatum(strText As String) As Date
Dim strT As String
On Error Resume Next
strT = Left(Right(strText, 23), 19)
FunctionDatum = CDate(Replace(Left(strT, 10), "_", "-") & _
" " & Replace(Right(strT, 8), "_", ":"))
End Function


'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Function DatumOrdner(DatumVon As Date, DatumBis As Date, sPfad As String) As Boolean
Dim Datum As Date, stempPfad As String, sDatum As String
stempPfad = Replace(sPfad, sGrundPfad, "")
If Len(stempPfad) DatumOrdner = False
Exit Function
Else
stempPfad = Left$(stempPfad, 11)
stempPfad = Right$(stempPfad, Len(stempPfad) - 1)
sDatum = Right$(stempPfad, 2) & "."
sDatum = sDatum & Mid$(stempPfad, 6, 2) & "."
sDatum = sDatum & Left$(stempPfad, 4)
Datum = CDate(sDatum)
If Datum >= Int(DatumVon) And Datum DatumOrdner = True
Exit Function
End If
End If
DatumOrdner = False
End Function


4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Historie
05.02.2009 10:21:00
chris
Hallo Erich,
Danke für deinen Link.
Kannst du mir weiterhelfen ?
Bitte deshalb um weitere Ansätze ?
gruß Chris
AW: suchmakro gefunden
05.02.2009 10:35:00
chris
Hallo Errich,
ich habe jetzt eine Suchroutine gefunden die schneller ist.
Es werden einfach erst einmal alle *.dat Dateien gesucht.
Aber leider bekomme ich jetzt alle Dateien aus allen Laufwerken in die Tabelle Eingetragen.
Wie kann ich die die ich nicht benötigen löschen ?
Also die die nicht zwischen meinen gewünschten Datum sind.
Hier das Suchmakro.
Option Explicit
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = -1
Private Const FILE_ATTRIBUTE_ARCHIVE = &H20
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10
Private Const FILE_ATTRIBUTE_HIDDEN = &H2
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const FILE_ATTRIBUTE_READONLY = &H1
Private Const FILE_ATTRIBUTE_SYSTEM = &H4
Private Const FILE_ATTRIBUTE_TEMPORARY = &H100
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Private lngDirCount As Long
Private lngFileCount As Long
Private strFiles() As String

Public Sub start()
Application.ScreenUpdating = False
lngDirCount = 1
lngFileCount = 0
FindFiles "R:\Safe\ZZr\Data\ML03\Data\0090\FU1\", "*.dat"
MsgBox UBound(strFiles)
Range(Cells(1, 1), Cells(lngFileCount, 1)) = WorksheetFunction.Transpose(strFiles)
Application.ScreenUpdating = True
End Sub



Private Sub FindFiles(ByVal strFolderPath As String, ByVal strSearch As String)
Dim WFD As WIN32_FIND_DATA
Dim lngSearch As Long
Dim strDirName As String
If Right$(strFolderPath, 1)  "\" Then strFolderPath = strFolderPath & "\"
lngSearch = FindFirstFile(strFolderPath & "*.*", WFD)
If lngSearch  INVALID_HANDLE_VALUE Then
GetFilesInFolder strFolderPath, strSearch
Do
If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) Then
strDirName = TrimNulls(WFD.cFileName)
If (strDirName  ".") And (strDirName  "..") Then
lngDirCount = lngDirCount + 1
FindFiles strFolderPath & strDirName, strSearch
End If
End If
Loop While FindNextFile(lngSearch, WFD)
FindClose lngSearch
End If
End Sub



Private Sub GetFilesInFolder(ByVal strFolderPath As String, ByVal strSearch As String)
Dim WFD As WIN32_FIND_DATA
Dim lngSearch As Long
Dim strFileName As String
If Right$(strFolderPath, 1)  "\" Then strFolderPath = strFolderPath & "\"
lngSearch = FindFirstFile(strFolderPath & strSearch, WFD)
If lngSearch  INVALID_HANDLE_VALUE Then
Do
If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY)  FILE_ATTRIBUTE_DIRECTORY  _
Then
strFileName = TrimNulls(WFD.cFileName)
lngFileCount = lngFileCount + 1
ReDim Preserve strFiles(1 To lngFileCount)
strFiles(lngFileCount) = strFolderPath & strFileName
End If
Loop While FindNextFile(lngSearch, WFD)
FindClose lngSearch
End If
End Sub



Private Function TrimNulls(ByVal strStringIn As String) As String
If InStr(strStringIn, Chr(0)) > 0 Then strStringIn = Left$(strStringIn, InStr(strStringIn,  _
Chr(0)) - 1)
TrimNulls = strStringIn
End Function


Anzeige
AW: suchmakro gefunden
05.02.2009 11:02:23
chris
habe mir selbst etwas zusammen gebastelt.
Danke

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige