Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
28.04.2024 14:18:05
Anzeige
Archiv - Navigation
1944to1948
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

Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde

Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 08:54:29
Chris
Guten Morgen liebe Excel-Freunde,

ich habe u.a. Code im Netz gefunden:

Option Explicit


Private Declare Sub OemToChar Lib "user32" Alias "OemToCharA" (ByVal StrFrom As String, ByVal StrTo As String)

Sub listFilesInPath()
Dim sPath As String, sFiles() As String, i As Long

sPath = "C:\Temp" ' === anpassen!

sFiles = getFilesInPath(sPath)
For i = LBound(sFiles) To UBound(sFiles) - 1
Debug.Print sFiles(i)
Next i
End Sub

' Liefert die Dateinamen aller passenden Dateien im angegebenen Pfads als Stringarray in Datumsreihenfolge (älteste Datei zuerst)
Private Function getFilesInPath(ByVal sPath As String, Optional ByVal sPattern As String = "*.*") As String()
sPath = IIf(Right$(sPath, 1) > Application.PathSeparator, sPath & Application.PathSeparator, sPath) & sPattern
getFilesInPath = Split(Ascii2Ansi(CreateObject("wscript.shell").exec("cmd /c dir """ & sPath & """ /b /a:-d /o:-d").StdOut.ReadAll), vbCrLf)
End Function

' Wandelt DOS-ASCII-Zeichen zu Windows-ANSI um
Private Function Ascii2Ansi(ByVal sAscii As String) As String
OemToChar sAscii, sAscii
Ascii2Ansi = sAscii
End Function


Ich möchte gerne den Code dahingehend abändern, damit die Dateien nur solange durchsucht werden (es werden ja zuerst die jüngsten Dateien durchsucht), bis das Datum der Zelle "A1" erreicht wurde.

Somit anstatt FOR mit Do While - weiß aber nicht, wie ich das mit dem Datum machen kann.

Wäre nett, wenn sich das jemand ansehen könnte - vielen Dank!

Lg,

Chris

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 09:22:45
Ulf
Würde dir raten mit FSO zu arbeiten, da kann man Attribute, Datum usw direkt abfragen und ASCII-ANSI obsolet
But:


Option Explicit

Private Declare Sub OemToChar Lib "user32" Alias "OemToCharA" (ByVal StrFrom As String, ByVal StrTo As String)

Dim colDateien As New Collection

Sub listFilesInPath()
Dim strDate As String
Dim dtDate As Date, dtMaxDate As Date
Dim lngDateien As Long, lngZ As Long
Dim sPath As String, sFiles() As String, i As Long
dtMaxDate = CVDate(ThisWorkbook.Worksheets(1).Range("A1").Value)
sPath = "C:\Temp" ' === anpassen!
sFiles = getFilesInPath(sPath)
For lngZ = LBound(sFiles) To UBound(sFiles) - 1
If sFiles(lngZ) > "" Then
strDate = Split(sFiles(lngZ), " ")(0)
If IsDate(strDate) Then
dtDate = CVDate(strDate)
If dtDate = dtMaxDate Then
colDateien.Add Trim(Mid$(sFiles(lngZ), 36))
End If
End If
End If
'Debug.Print sFiles(lngZ)
Next lngZ
'Mit Collection arbeiten oder:
lngDateien = colDateien.Count
If lngDateien > 0 Then
ReDim sFiles(colDateien.Count - 1)
For lngZ = 1 To lngDateien
sFiles(lngZ - 1) = colDateien(lngZ)
Next
End If
End Sub

' Liefert die Dateinamen aller passenden Dateien im angegebenen Pfads als Stringarray in Datumsreihenfolge (älteste Datei zuerst)
Private Function getFilesInPath(ByVal sPath As String, Optional ByVal sPattern As String = "*.*") As String()
sPath = IIf(Right$(sPath, 1) > Application.PathSeparator, sPath & Application.PathSeparator, sPath) & sPattern
getFilesInPath = Split(Ascii2Ansi(CreateObject("wscript.shell").exec("cmd /c dir """ & sPath & """ /a:-d /o:-d").StdOut.ReadAll), vbCrLf)
End Function

' Wandelt DOS-ASCII-Zeichen zu Windows-ANSI um
Private Function Ascii2Ansi(ByVal sAscii As String) As String
OemToChar sAscii, sAscii
Ascii2Ansi = sAscii
End Function

hth
Ulf
Anzeige
AW: Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 09:34:48
volti
Hallo Chris,

hier eine Idee dazu.
Ich würd es wahrscheinlich anders machen, aber um bei Deiner DOS-Version zu bleiben eine entsprechende Ergänzung, die Du noch anpassen kannst.

Option Explicit


Private Declare PtrSafe Function OemToCharA Lib "user32" ( _
ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Sub listFilesInPath()
Dim sPath As String, sFiles() As String, i As Long
Dim oFSO As Object, sDatum As String

Set oFSO = CreateObject("Scripting.FileSystemObject")
sPath = "C:\Temp" ' === anpassen!
sDatum = "31.05.2001"

sFiles = getFilesInPath(sPath)
For i = LBound(sFiles) To UBound(sFiles) - 1

With oFSO.GetFile(sPath & "\" & sFiles(i))
Debug.Print sFiles(i), .datelastmodified '.datecreated
If Left$(.datelastmodified, 10) = sDatum Then
MsgBox "gefunden": Exit For
End If
End With
Next i
End Sub

' Liefert die Dateinamen aller passenden Dateien im angegebenen Pfads als Stringarray in Datumsreihenfolge (älteste Datei zuerst)
Private Function getFilesInPath(ByVal sPath As String, Optional ByVal sPattern As String = "*.*") As String()
sPath = IIf(Right$(sPath, 1) > Application.PathSeparator, sPath & Application.PathSeparator, sPath) & sPattern
getFilesInPath = Split(Ascii2Ansi(CreateObject("wscript.shell").exec("cmd /c dir """ & sPath & """ /b /a:-d /o:-d").StdOut.ReadAll), vbCrLf)
End Function

' Wandelt DOS-ASCII-Zeichen zu Windows-ANSI um
Private Function Ascii2Ansi(ByVal sAscii As String) As String
OemToCharA sAscii, sAscii
Ascii2Ansi = sAscii
End Function


Gruß
Karl-Heiz
Anzeige
Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 09:51:17
Chris
Hallo Ulf & Karl-Heinz,

vielen Dank für eure Mühe!

Was mir bis jetzt noch nicht ganz gefällt, dass hinsichtlich Datum ALLE Dateien des Ordners durchsucht werden müssen und das Datum dann erst via IF-Abfrage überprüft wird. Das kann bei mehr als 1000 Dateien ziemlich lange dauern und vorallem ist das dann verschwendete Zeit, wenn z.B. nur 10 Dateien in Frage kommen. Ich möchte nämlich vermeiden, dass bereits geprüfte Dateien in einen anderen Ordner verschoben werden müssen, daher auch die Bedingung mit dem Datum.

Das ist der Grund warum ich gemeint habe, ob man nicht mit Do While arbeiten kann und nur solange die nach Datum sortierten Dateien durchsucht bis das definierte Datum erreicht wurde.

Wäre super, wenn ihr Euch das nochmals ansehen könntet. Natürlich sind auch alle anderen gerne eingeladen das Thema zu lösen um eine performante Suche zu ermöglichen.

Vielen Dank!

Lg
Anzeige
Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 09:52:59
Chris
Frage ist natürlich noch offen - habe ich vergessen - sorry
AW: Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 10:01:56
volti
Hallo Chris,

die DOS-Version ist wahnsinnig schnell. Da sind 1000 Dateien nichts. Und sie liefert ja bereits eine Reihenfolge.

Eine Do-WHILE-Schleife ist m.E. auch nicht schneller, zumal ja da auch alle Dateien durchsucht werden müssen.
Denn es geht hier nach der FAT, also die Reihenfolge auf der Festplatte, da ist nicht sicher, dass die jüngere Datei vor der älteren liegt.

Trotzdem, wie Ulf schon anführte, gehen viele mit FSO in einer Schleife durch die Dateien.
Ist aber ein abweichender Ansatz, da kannst Du Deinen bisherigen Code vergessen.

Im Moment habe ich keine Zeit, wenn es keine Lösung durch jemand anderen gibt, schaue ich mir das gerne später noch mal an.

Gruß KH
Anzeige
AW: Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 11:57:03
volti
Hallo Chris,

hier doch noch mal was Modifiziertes aus meiner Bastelkiste. Vielleicht gefällt es Dir ja besser.
Alle relevanten Dateien werden in ein Array geschafft. Da kannst Du dann ja mit machen, was Du willst.
Es liest auch optional die Unterordner mit ein.
Code:


Option Explicit Sub ListeDateienAbDatum() Dim iZl As Long, iMax As Long Dim sPfad As String, sDatum As String, sArr() As String Dim bArt As Boolean, oFSO As Object Dim j j = Timer sPfad = "D:\Pictures\Videos\2019\" sDatum = "10.10.2019" ' "10.10.2019 15:54:00" 'Range("A1").value Set oFSO = CreateObject("Scripting.FileSystemObject") GetFiles iMax, sArr, oFSO.GetFolder(sPfad), sDatum, True ' Dateien in Array schaffen For iZl = 0 To iMax - 1 ' Mach was mit mir Debug.Print sArr(0, iZl), sArr(1, iZl), sArr(2, iZl) Next iZl Set oFSO = Nothing MsgBox "Zeit: " & Timer - j End Sub Sub GetFiles(i As Long, sArr() As String, oPath As Object, sDatum As String, bUO As Boolean) ' Ermittelt alle relevanten Dateien in einem Array Dim oFile As Object, oDir As Object, Obj As Variant On Error Resume Next For Each oFile In oPath.Files ' Ordner durchsuchen If Err = 0 And CVDate(oFile.datelastmodified) >= CVDate(sDatum) Then With oFile ReDim Preserve sArr(2, i) sArr(0, i) = Replace(.Path, "\" & .Name, "") & "\" sArr(1, i) = .Name sArr(2, i) = .datelastmodified ' Zuletzt geändert i = i + 1 End With End If Next oFile If bUO = False Then Exit Sub ' Keine Unterordner =>raus For Each oDir In oPath.SubFolders ' Unterordner durchsuchen Obj = FileDateTime(oDir) GetFiles i, sArr, oDir, sDatum, bUO Next oDir End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 15:04:15
Chris
Hallo Karl-Heinz,

die erste lösung gefällt mir besser, da ich mit dem Array wenig anfangen kann, weil wenn eine Datei im gültigen Datumsbereich liegt, muss ich im SAP prüfen, ob diese hochgeladen wurde.

Ein Problem was ich jedoch habe ist, dass bei einer Datei der Fehler 53 "Datei nicht gefunden" angezeigt wird, obwohl die Datei vorhanden ist und normal geöffnet werden kann.

Anbei mein Code:

Private Declare PtrSafe Sub OemToChar Lib "user32" Alias "OemToCharA" (ByVal StrFrom As String, ByVal StrTo As String)


' Liefert die Dateinamen aller passenden Dateien im angegebenen Pfads als Stringarray in Datumsreihenfolge (älteste Datei zuerst)
Private Function getFilesInPath(ByVal sPath As String, Optional ByVal sPattern As String = "*.xlsm") As String()
sPath = IIf(Right$(sPath, 1) > Application.PathSeparator, sPath & Application.PathSeparator, sPath) & sPattern
getFilesInPath = Split(Ascii2Ansi(CreateObject("wscript.shell").exec("cmd /c dir """ & sPath & """ /b /a:-d /o:-d").StdOut.ReadAll), vbCrLf)
End Function

' Wandelt DOS-ASCII-Zeichen zu Windows-ANSI um
Private Function Ascii2Ansi(ByVal sAscii As String) As String
OemToChar sAscii, sAscii
Ascii2Ansi = sAscii
End Function

Sub Check_uploads()

Dim WS1 As Worksheet
Dim sPath As String
sPath = "L:\GS\SOX\closed\"
'sPath = "C:\temp\"
Dim sFiles() As String
Dim i As Long
Dim oFSO As Object
Dim sDatum As String
Dim Vendor As Long
Dim Upload As Boolean
Dim mc As Object
Dim GuiStatusBar As SAPFEWSELib.GuiStatusBar
Dim Eingabewert As Byte
Dim Fdate As Long
Set WS1 = ActiveWorkbook.ActiveSheet

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False

If Not IsObject(Appl) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set Appl = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
Set Connection = Appl.Children(0)
End If
If Not IsObject(session) Then
Set session = Connection.Children(0)
End If
If IsObject(wscript) Then
wscript.ConnectObject session, "on"
wscript.ConnectObject Appl, "on"
End If

Set GuiStatusBar = session.FindById("wnd[0]/sbar")
Set oFSO = CreateObject("Scripting.FileSystemObject")

sDatum = WS1.Range("Date")
sFiles = getFilesInPath(sPath)

For i = LBound(sFiles) To UBound(sFiles) - 1

With oFSO.GetFile(sPath & "\" & sFiles(i))
Debug.Print sFiles(i), .datelastmodified '.datecreated
Fdate = DateValue(Left$(.datelastmodified, 10))

If Fdate >= sDatum Then
With CreateObject("VBScript.RegExp")
'.Pattern = "[\d]+"
.Pattern = "([0-9]{6})"
Set mc = .Execute(sFiles(i))
If (mc.Count > 0) Then
Vendor = mc(0)

session.FindById("wnd[0]").maximize
session.FindById("wnd[0]/tbar[0]/okcd").Text = "MK03"
session.FindById("wnd[0]").sendVKey 0
session.FindById("wnd[0]/usr/chkRF02K-D0110").Selected = True
session.FindById("wnd[0]/usr/ctxtRF02K-LIFNR").Text = Vendor
session.FindById("wnd[0]").sendVKey 0

Select Case GuiStatusBar.MessageType
Case "W": session.FindById("wnd[0]").sendVKey 0
Case "E": MsgBox session.FindById("wnd[0]/sbar/pane[0]").Text & " - Macro will be terminated!"
On Error Resume Next
session.FindById("wnd[0]/tbar[0]/btn[15]").press
On Error Resume Next
session.FindById("wnd[0]/tbar[0]/btn[15]").press
On Error Resume Next
session.FindById("wnd[1]/usr/btnSPOP-OPTION2").press
End Select

session.FindById("wnd[0]/titl/shellcont/shell").pressContextButton "%GOS_TOOLBOX"
session.FindById("wnd[0]/titl/shellcont/shell").selectContextMenuItem "%GOS_VIEW_ATTA"
Set GRID1 = session.FindById("wnd[1]/usr/cntlCONTAINER_0100/shellcont/shell")

For sapRow = 0 To GRID1.RowCount - 1
If GRID1.GetCellValue(sapRow, "BITM_DESCR") = Left(sFiles(i), Len(sFiles(i)) - 5) Then
' session.FindById("wnd[1]").Close
session.FindById("wnd[1]/tbar[0]/btn[12]").press
session.FindById("wnd[0]/tbar[0]/btn[15]").press
Upload = True
Exit For
Else
Upload = False
End If
' If sapRow Mod 90 And sapRow GRID1.RowCount - 1 Then
' Exit For
' End If
Next

If Upload = False Then
' Eingabewert = MsgBox("Request " & "" & Datname & "> was not uploaded - should this be done now?", vbYesNo, "Message")
'
' If Eingabewert = vbNo Then
' session.FindById("wnd[1]/tbar[0]/btn[12]").press
' session.FindById("wnd[0]/tbar[0]/btn[15]").press
' Else
'Session.FindById("wnd[0]/titl/shellcont/shell").pressButton "%GOS_TOOLBOX"
session.FindById("wnd[1]/usr/cntlCONTAINER_0100/shellcont/shell").PressToolbarContextButton "%ATTA_CREATE"
session.FindById("wnd[1]/usr/cntlCONTAINER_0100/shellcont/shell").selectContextMenuItem "%GOS_PCATTA_CREA"
session.FindById("wnd[1]/usr/ctxtDY_PATH").Text = sPath '& "\"
session.FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = sFiles(i) '& ".xlsm"
session.FindById("wnd[1]/tbar[0]/btn[0]").press
session.FindById("wnd[1]/tbar[0]/btn[0]").press
session.FindById("wnd[0]/tbar[0]/btn[15]").press
' End If
End If

Upload = False

End If
Set mc = Nothing
End With
End If
End With
Next i

Set GRID1 = Nothing
Set GuiStatusBar = Nothing
Set oFSO = Nothing

End Sub


Vielleicht fällt ja Dir / Euch etwas auf, was die Ursache sein kann;
das einzige was mir auffällt ist folgendes Sonderzeichen: Č

Vielen Dank!

Lg


Anzeige
Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 15:05:24
Chris
Und wieder die Checkbox vergessen, dass die Frage noch offen ist... Asche über mein Haupt!
AW: Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
12.09.2023 15:49:52
volti
Hallo Chris,

da ich mit dem Array wenig anfangen???

Ein wenig Aufklärung:
Beide Varianten arbeiten mit Arrays.
Die erste DOS-Version splittet über die Funktion Split die von DIR gelieferten Daten in ein Array auf übergibt sie dem Array sFiles.

Meine zweite Version erweitert mit jedem gültigen Dateinamen das Array sArr. Allerdings handelt es sich hier um ein zweidimensionales Array, da ich dort Pfad, Dateiname und das entsprechende Datum einer jeden gültigen Datei sammele. Wenn man nur den Dateinamen braucht, kann man hier auch ein eindimensionales Array nehmen und hat dann das gleiche wie bei der ersten Variante.

Aber Du kannst bei der zweiten Variante ja auch ganz auf das Array verzichten und machst Deine Prüfung direkt an Ort und Stelle:

Code:


Sub ListeDateienAbDatum() Dim sPfad As String, sDatum As String Dim bArt As Boolean, oFSO As Object sPfad = "D:\Pictures\Videos\2019\" sDatum = "10.10.2019" ' "10.10.2019 15:54:00" 'Range("A1").value Set oFSO = CreateObject("Scripting.FileSystemObject") GetFiles oFSO.GetFolder(sPfad), sDatum, True ' Dateien in Array schaffen Set oFSO = Nothing End Sub Sub GetFiles(oPath As Object, sDatum As String, bUO As Boolean) ' Ermittelt alle relevanten Dateien in einem Array Dim oFile As Object, oDir As Object, Obj As Variant On Error Resume Next For Each oFile In oPath.Files ' Ordner durchsuchen If Err = 0 And CVDate(oFile.datelastmodified) >= CVDate(sDatum) Then With oFile ' Mach was mit mir Debug.Print .Name, .datelastmodified ' Zuletzt geändert i = i + 1 End With End If Next oFile If bUO = False Then Exit Sub ' Keine Unterordner =>raus For Each oDir In oPath.SubFolders ' Unterordner durchsuchen Obj = FileDateTime(oDir) GetFiles oDir, sDatum, bUO Next oDir End Sub



Möchtest Du jedoch immer noch bei der DOS-Version bleiben (ich nehme die auch oft), kann es sein, dass es bei bestimmten Zeichen oder Gegebenheiten Probleme geben kann. Es ist ein uralter DOS-Befehl aus der Pre-Windowszeit. Da rümpfen Superprofis manche eh die Nase.
Und ich kann mir vorstellen, dass es das von Dir angeführte Zeichen ist. Da habe ich keine Lösung (schon gar nicht ohne Testmöglichkeit) und lasse die Frage mal offen.

Frage meinerseits: Hast Du zeitmäßig mal beide Varianten ggü. gestellt?
Hat die zweite Variante auch das Problem mit dem Zeichen?

Gruß KH
Anzeige
Dateien nur solange durchsuchen bis Ab-Datum erreicht wurde
13.09.2023 15:06:06
Chris
Hallo nochmal,

danke deinen Codes funktioniert das ganze bis auf die eine Datei wunderbar - vielen Dank nochmal!

Lg

209 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige