Anzeige
Archiv - Navigation
1556to1560
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

cls-Filesearch von Nepumuk

cls-Filesearch von Nepumuk
19.05.2017 06:54:59
Nepumuk
Guten Morgen Nepumuk,
ich nutze dein Klassenmodul zum Durchsuchen von Files - dabei habe ich jedoch festgestellt, dass bei einer Suche inkl. Unterordner Files vergessen werden - wenn ich die jeweiligen Ordner einzeln durchsuche werden alle Files gefunden...
Hast Du eine Idee an was das liegen kann?
Anbei mal der verwendete Code:
' **********************************************************************
' Modul: Klasse1 Typ: Klassenmodul
Option Explicit
#If Win64 Then
Private Declare PtrSafe Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" ( _
ByVal lpFileName As String, _
ByRef lpFindFileData As WIN32_FIND_DATA) As LongPtr
Private Declare PtrSafe Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileA" ( _
ByVal hFindFile As LongPtr, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare PtrSafe Function FindClose Lib "kernel32.dll" ( _
ByVal hFindFile As LongPtr) As Long
Private Declare PtrSafe Function FileTimeToLocalFileTime Lib "kernel32.dll" ( _
ByRef lpFileTime As FILETIME, _
ByRef lpLocalFileTime As FILETIME) As Long
Private Declare PtrSafe Function FileTimeToSystemTime Lib "kernel32.dll" ( _
ByRef lpFileTime As FILETIME, _
ByRef lpSystemTime As SYSTEMTIME) As Long
#Else
Private Declare Function FileTimeToLocalFileTime Lib "kernel32.dll" ( _
ByRef lpFileTime As FILETIME, _
ByRef lpLocalFileTime As FILETIME) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32.dll" ( _
ByRef lpFileTime As FILETIME, _
ByRef lpSystemTime As SYSTEMTIME) As Long
Private Declare Function FindClose Lib "kernel32.dll" ( _
ByVal hFindFile As Long) As Long
Private Declare Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" ( _
ByVal lpFileName As String, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileA" ( _
ByVal hFindFile As Long, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
#End If
Private Enum FILE_ATTRIBUTE
FILE_ATTRIBUTE_READONLY = &H1
FILE_ATTRIBUTE_HIDDEN = &H2
FILE_ATTRIBUTE_SYSTEM = &H4
FILE_ATTRIBUTE_DIRECTORY = &H10
FILE_ATTRIBUTE_ARCHIVE = &H20
FILE_ATTRIBUTE_NORMAL = &H80
FILE_ATTRIBUTE_TEMPORARY = &H100
End Enum
Private Const MAX_PATH As Long = 260&
Private Const INVALID_HANDLE_VALUE As Long = -1&
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
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 mlngFileCount As Long
Private mudtFiles() As FILEINFO
Private mstrFolderPath As String
Private mstrExtension As String
Private mstrSearchLike As String
Private mblnSubFolders As Boolean
Private mblnCaseSenstiv As Boolean
Friend Property Get Files(lngIndex As Long) As FILEINFO
Files = mudtFiles(lngIndex)
End Property
Friend Property Get FileCount() As Long
FileCount = mlngFileCount
End Property
Friend Property Let FolderPath(strFolderPath As String)
mstrFolderPath = strFolderPath
End Property
Friend Property Let Extension(strExtension As String)
mstrExtension = strExtension
End Property
Friend Property Let SearchLike(strSearchLike As String)
mstrSearchLike = strSearchLike
End Property
Friend Property Let SubFolders(blnSubFolders As Boolean)
mblnSubFolders = blnSubFolders
End Property
Friend Property Let CaseSenstiv(blnCaseSenstiv As Boolean)
mblnCaseSenstiv = blnCaseSenstiv
End Property
Friend Function Execute(Optional enmSortBy As SORT_BY = Sort_by_None, _
Optional enmSortOrder As SORT_ORDER = Sort_Order_Ascending) As Long
Call FindFiles(mstrFolderPath)
If mlngFileCount > 1 And enmSortBy  Sort_by_None Then _
Call prcSort(1, mlngFileCount, enmSortBy, enmSortOrder)
Execute = mlngFileCount
End Function
Private Sub FindFiles(ByVal strFolderPath As String)
#If Win64 Then
Dim lngSearch As LongPtr
#Else
Dim lngSearch As Long
#End If
Dim WFD As WIN32_FIND_DATA, strDirName As String
On Error GoTo ErrorHandling
If Right$(strFolderPath, 1)  "\" Then strFolderPath = strFolderPath & "\"
lngSearch = FindFirstFile(strFolderPath & "*.*", WFD)
If lngSearch  INVALID_HANDLE_VALUE Then
Call GetFilesInFolder(strFolderPath)
If mblnSubFolders Then
Do
If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) Then
strDirName = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr$(0)) - 1)
If (strDirName  ".") And (strDirName  "..") Then _
Call FindFiles(strFolderPath & strDirName)
End If
Loop While FindNextFile(lngSearch, WFD)
End If
Call FindClose(lngSearch)
End If
Exit Sub
ErrorHandling:
MsgBox "Fehler " & CStr(Err.Number) & vbLf & vbLf & _
Err.Description, vbCritical, "Fehler"
End Sub
Private Sub GetFilesInFolder(ByVal strFolderPath As String)
#If Win64 Then
Dim lngSearch As LongPtr
#Else
Dim lngSearch As Long
#End If
Dim WFD As WIN32_FIND_DATA, strFilename As String
Dim udtFiletime As FILETIME, udtSystemtime As SYSTEMTIME
On Error GoTo ErrorHandling
If Right$(strFolderPath, 1)  "\" Then strFolderPath = strFolderPath & "\"
lngSearch = FindFirstFile(strFolderPath & mstrExtension, WFD)
If lngSearch  INVALID_HANDLE_VALUE Then
Do
If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY)  FILE_ATTRIBUTE_DIRECTORY   _
_
Then
strFilename = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr$(0)) - 1)
If IIf(mblnCaseSenstiv, strFilename, LCase$(strFilename)) Like _
IIf(mblnCaseSenstiv, mstrSearchLike, LCase$(mstrSearchLike)) Then
mlngFileCount = mlngFileCount + 1
ReDim Preserve mudtFiles(1 To mlngFileCount)
With mudtFiles(mlngFileCount)
.strPath = strFolderPath & strFilename
.strFilename = strFilename
.lngSize = WFD.nFileSizeLow
FileTimeToLocalFileTime WFD.ftCreationTime, udtFiletime
FileTimeToSystemTime udtFiletime, udtSystemtime
.dmtDateCreate = CDate(DateSerial(udtSystemtime.wYear, udtSystemtime. _
wMonth, udtSystemtime.wDay) + _
TimeSerial(udtSystemtime.wHour, udtSystemtime.wMinute,  _
udtSystemtime.wSecond))
FileTimeToLocalFileTime WFD.ftLastAccessTime, udtFiletime
FileTimeToSystemTime udtFiletime, udtSystemtime
.dmtLastAccess = CDate(DateSerial(udtSystemtime.wYear, udtSystemtime. _
wMonth, udtSystemtime.wDay) + _
TimeSerial(udtSystemtime.wHour, udtSystemtime.wMinute,  _
udtSystemtime.wSecond))
FileTimeToLocalFileTime WFD.ftLastWriteTime, udtFiletime
FileTimeToSystemTime udtFiletime, udtSystemtime
.dmtLastModify = CDate(DateSerial(udtSystemtime.wYear, udtSystemtime. _
wMonth, udtSystemtime.wDay) + _
TimeSerial(udtSystemtime.wHour, udtSystemtime.wMinute,  _
udtSystemtime.wSecond))
End With
End If
End If
Loop While FindNextFile(lngSearch, WFD)
Call FindClose(lngSearch)
End If
Exit Sub
ErrorHandling:
MsgBox "Fehler " & CStr(Err.Number) & vbLf & vbLf & _
Err.Description, vbCritical, "Fehler"
End Sub
Private Sub prcSort(lngLBorder As Long, lngUBorder As Long, enmSortBy As SORT_BY, enmSortOrder   _
_
As SORT_ORDER)
Dim lngIndex1 As Long, lngIndex2 As Long
Dim udtBuffer As FILEINFO, vntTemp As Variant
lngIndex1 = lngLBorder
lngIndex2 = lngUBorder
Select Case enmSortBy
Case Sort_by_Name: vntTemp = mudtFiles((lngLBorder + lngUBorder) \ 2).strFilename
Case Sort_by_Path: vntTemp = mudtFiles((lngLBorder + lngUBorder) \ 2).strPath
Case Sort_by_Size: vntTemp = mudtFiles((lngLBorder + lngUBorder) \ 2).lngSize
Case Sort_by_Last_Access: vntTemp = mudtFiles((lngLBorder + lngUBorder) \ 2). _
dmtLastAccess
Case Sort_by_Last_Modyfy: vntTemp = mudtFiles((lngLBorder + lngUBorder) \ 2). _
dmtLastModify
Case Sort_by_Date_Create: vntTemp = mudtFiles((lngLBorder + lngUBorder) \ 2). _
dmtDateCreate
End Select
Do
Select Case enmSortBy
Case Sort_by_Name
If enmSortOrder = Sort_Order_Ascending Then
Do While mudtFiles(lngIndex1).strFilename  vntTemp
lngIndex1 = lngIndex1 + 1
Loop
Do While vntTemp > mudtFiles(lngIndex2).strFilename
lngIndex2 = lngIndex2 - 1
Loop
End If
Case Sort_by_Path
If enmSortOrder = Sort_Order_Ascending Then
Do While mudtFiles(lngIndex1).strPath  vntTemp
lngIndex1 = lngIndex1 + 1
Loop
Do While vntTemp > mudtFiles(lngIndex2).strPath
lngIndex2 = lngIndex2 - 1
Loop
End If
Case Sort_by_Size
If enmSortOrder = Sort_Order_Ascending Then
Do While mudtFiles(lngIndex1).lngSize  vntTemp
lngIndex1 = lngIndex1 + 1
Loop
Do While vntTemp > mudtFiles(lngIndex2).lngSize
lngIndex2 = lngIndex2 - 1
Loop
End If
Case Sort_by_Last_Access
If enmSortOrder = Sort_Order_Ascending Then
Do While mudtFiles(lngIndex1).dmtLastAccess  vntTemp
lngIndex1 = lngIndex1 + 1
Loop
Do While vntTemp > mudtFiles(lngIndex2).dmtLastAccess
lngIndex2 = lngIndex2 - 1
Loop
End If
Case Sort_by_Last_Modyfy
If enmSortOrder = Sort_Order_Ascending Then
Do While mudtFiles(lngIndex1).dmtLastModify  vntTemp
lngIndex1 = lngIndex1 + 1
Loop
Do While vntTemp > mudtFiles(lngIndex2).dmtLastModify
lngIndex2 = lngIndex2 - 1
Loop
End If
Case Sort_by_Date_Create
If enmSortOrder = Sort_Order_Ascending Then
Do While mudtFiles(lngIndex1).dmtDateCreate  vntTemp
lngIndex1 = lngIndex1 + 1
Loop
Do While vntTemp > mudtFiles(lngIndex2).dmtDateCreate
lngIndex2 = lngIndex2 - 1
Loop
End If
End Select
If lngIndex1  lngIndex2
If lngLBorder 

Könntest Du mir hier eventuell eine Msgbox einbauen, bei welcher Du die Anzahl der gefundenen Files ausgibst? Anhand dieser Information könnte ich dann checken ob die gefundene Anzahl passt...
Wäre voll nett von Dir - besten Dank im Voraus!
Lg und schönes WE,
Chrisi

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: cls-Filesearch von Nepumuk
19.05.2017 08:43:40
Nepumuk
Hallo Chrisi,
dazu müsste ich sehen wie du die Routinen der Klasse aufrufst.
Gruß
Nepumuk
AW: cls-Filesearch von Nepumuk
19.05.2017 08:52:02
Nepumuk
Hallo Nepumuk,
anbei der gewünschte Code:
Public Sub DMM_Import()
Dim objFileSearch As clsFileSearch
Dim lngIndex As Long
Dim lngIndex1 As Long
Dim strSuwort As String
Dim strSuwort1 As String
Dim i As Integer
Dim bolErg As Boolean
Dim Wert As Long
Dim objApp As Object
Dim objDoc As Object
Dim UPDATE As Boolean
Dim UPDATE_C As Long
Dim UPDATE_R As Long
Dim temp_C As Long
Dim temp_R As Long
Dim Betreiber As Boolean
Dim Betreiber_C As Long
Dim Betreiber_R As Long
Dim iZeile As Long, tempZeile As Long, iZähler As Long
Dim WS1 As Worksheet, WS2 As Worksheet
Dim Datum As Date
Dim strOrdner As String
Dim arr(1 To 1, 1 To 10)
Dim Header As String
Set objFileSearch = New clsFileSearch
Set WS1 = Application.ActiveWorkbook.Worksheets("temp")
Set WS2 = Application.ActiveWorkbook.Worksheets("DMM-Import database")
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
If Range("A3")  "" Then
Range("A3").End(xlDown).Offset(1, 0).Select
Else
Range("A3").Select
End If
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = Environ("Userprofile") & "\Documents\"
.Title = "Ordnerauswahl"
.ButtonName = "Auswahl..."
.InitialView = msoFileDialogViewList
If .Show = -1 Then
strOrdner = .SelectedItems(1)
If Right(strOrdner, 1)  "\" Then strOrdner = strOrdner & "\"
Else
strOrdner = ""
End If
End With
If strOrdner = "" Then MsgBox ("Kein Ordner gewählt!") 'Else MsgBox strOrdner
'strSuwort = InputBox("Suchwort eingeben")
strSuwort = "Betreiber"
With objFileSearch
.CaseSenstiv = False
.Extension = "*.doc*"
.FolderPath = strOrdner
.SearchLike = "*"
.SubFolders = False
'.SubFolders = True
If .Execute(Sort_by_Size, Sort_Order_Descending) > 0 Then
Application.ScreenUpdating = False
'Set objApp = OffApp("Word")
'objApp.Visible = True
For lngIndex = 1 To .FileCount
With .Files(lngIndex)
'Set objApp = OffApp("Word")
Set objApp = CreateObject("Word.Application")
Set objDoc = objApp.Documents.Open(.strPath)
strSuwort = "Betreiber"
On Error Resume Next
With objDoc.Content.Find
.Execute FindText:=strSuwort, Forward:=True
If .Found = True Then
objDoc.Content.Copy
WS1.Activate
WS1.Range("A1", ActiveCell.SpecialCells(xlLastCell)).EntireRow.Delete
WS1.Range("A1").Select
WS1.Paste
Header = objApp.ActiveDocument.Sections(1).Headers(1).Range.Text
If Header = "" Then
WS1.Range("H1") = objDoc
Else
WS1.Range("H1") = Header
WS1.Range("I1").FormulaR1C1 = "=RIGHT(RC[-1],11)"
Application.CutCopyMode = False
WS1.Range("I1").Copy
Range("H1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
WS1.Range("I1").ClearContents
End If
WS1.Range("H1").NumberFormat = "dd.mm.yyyy"
Datum = WS1.Range("H1")
objApp.Quit
Set objApp = Nothing
Set objDoc = Nothing
UPDATE = False
With WS1
strSuwort1 = "UPDATE*"
UPDATE = Cells.Find(What:=strSuwort1, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False).Activate
If UPDATE = True Then
UPDATE_C = ActiveCell.Column
UPDATE_R = ActiveCell.Row
Else
'MsgBox "Suchwort" & " " & strSuwort1 & " " & "nicht gefunden"
UPDATE_R = "999"
End If
For temp_C = 1 To ActiveSheet.Cells.SpecialCells(xlLastCell).Column
For temp_R = 1 To ActiveSheet.Cells.SpecialCells(xlLastCell). _
Row
If WS1.Cells(temp_R, temp_C) Like strSuwort & "*" Then
If WS1.Cells(temp_R, temp_C) = "Betreiber" Then
Betreiber_C = WS1.Cells(temp_R, temp_C).Column
Betreiber_R = WS1.Cells(temp_R, temp_C).Row
tempZeile = WS2.Cells(WS2.Rows.Count, 1).End(xlUp).Row + _
1
arr(1, 1) = Datum
If UPDATE_R > Betreiber_R Then
arr(1, 2) = "NEW"
Else
arr(1, 2) = "UPDATE"
End If
arr(1, 3) = WS1.Cells(Betreiber_R, Betreiber_C + 3)
arr(1, 4) = WS1.Cells(Betreiber_R, Betreiber_C + 1)
arr(1, 8) = WS1.Cells(Betreiber_R - 1, Betreiber_C + 5)
arr(1, 9) = WS1.Cells(Betreiber_R - 1, Betreiber_C + 2)
arr(1, 5) = WS1.Cells(Betreiber_R + 1, Betreiber_C + 6)
arr(1, 6) = WS1.Cells(Betreiber_R + 1, Betreiber_C + 3)
arr(1, 7) = WS1.Cells(Betreiber_R, Betreiber_C + 7)
arr(1, 10) = WS1.Cells(Betreiber_R + 2, Betreiber_C)
'--- Array in Zellbereich schreiben
WS2.Cells(tempZeile, 1).Resize(1, 10) = arr
Erase arr
Else
'MsgBox "Suchwort" & " " & "Betreiber" & " " & "nicht  _
gefunden"
End If
Else
'MsgBox "Suchwort" & " " & strSuwort & " " & "nicht  _
gefunden"
End If
Next
Next
'Else
'MsgBox "Suchwort" & " " & strSuwort1 & " " & "nicht gefunden"
'End If
End With
Else
'MsgBox "Suchwort" & " " & strSuwort & " " & "nicht gefunden"
End If
End With
objApp.Quit
Set objApp = Nothing
Set objDoc = Nothing
End With
Next
Else
'MsgBox "Keine Datei gefunden"
End If
Application.ScreenUpdating = True
End With
Set objFileSearch = Nothing
WS2.Activate
End Sub
Private Function OffApp(ByVal strApp As String, _
Optional blnVisible As Boolean = True) As Object
Dim objApp As Object
Dim blnTMP As Boolean
On Error Resume Next
Set objApp = GetObject(, strApp & ".Application")
Select Case Err.Number
Case 429
Err.Clear
Set objApp = CreateObject(strApp & ".Application")
blnTMP = True
If blnVisible = True Then
On Error Resume Next
objApp.Visible = True
Err.Clear
End If
End Select
On Error GoTo 0
Set OffApp = objApp
Set objApp = Nothing
End Function
Besten Dank im Voraus!
Lg,
Chrisi
Anzeige
AW: cls-Filesearch von Nepumuk
19.05.2017 09:01:25
Nepumuk
Hallo Chrisi,
hier:
    .SubFolders = False
schließt du die Suche in Unterordnern aus.
Gruß
Nepumuk
AW: cls-Filesearch von Nepumuk
19.05.2017 10:38:17
Nepumuk
Hallo Nepumuk,
das weiß ich - ich möchte gerne weiterhin in Unterordnern suchen und daher in einem Pop-Up die Gesamtanzahl der gefundenen Dokumente angezeigt bekommen, damit ich nachher kontrollieren kann ob alle Files berücksichtigt wurden...
Ich hoffe Du verstehst was ich meine...
Lg,
Chrisi
AW: cls-Filesearch von Nepumuk
19.05.2017 11:39:39
Nepumuk
Hallo,
ich versteh nicht. Einerseits schließt du Unterordner aus, andererseits willst du in Unterordnern suchen.
Wenn's nur um die MsgBox geht, dann so:
 If .Execute(Sort_by_Size, Sort_Order_Descending) > 0 Then
MsgBox .FileCount

Gruß
Nepumuk
Anzeige
AW: cls-Filesearch von Nepumuk
19.05.2017 19:07:52
Nepumuk
Nepumuk,
Du hast schon recht - momentan schließe ich die Unterordner aus, da nicht alle Files berücksichtigt werden - daher möchte ich ja herausfinden wie viele Files gefunden werden...
Werde deinen Vorschlag probieren - besten Dank und schönes WE!
Lg,
Chrisi

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige