Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1040to1044
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
Dateisuche (kriterium Dateiname) Datum Uhrzeit
26.01.2009 10:29:41
chris
Hallo VBA experten,
ich habe eine frage weil ich nicht genau weiß wie ich die Suche am besten umsetzen kann und vielleicht hat von euch einer was für mich parrat auf die schnelle.
Ich habe in meheren Laufwerken alle z.b unter D:\Daten\...
Dateien mit diesen Dateinamen(siehe unten) die sich unterscheiden.
Am anfang die Laufende Nummer und dann am ende des Dateinamens das Datum und Uhrzeit.
Wie kann ich jetzt eine suche auf das laufwerk starten mit der Vorgabe von Datums:
z.b Startdatum = "25.01.2009" EndeDatum = "26.01.2009"
und einer Start Uhrzeit und End Uhrzeit.
jetzt sollen praktisch alle Dateien gesucht werden die im Dateinamen ein datum haben zwischen Start und Enddatum und Zwischen Start und Endzeit.
Ich weiß leider nicht wie ich das mache so das die suche nicht ewig dauert ?:(
Würde mich über Hilfe sehr freuen.Hier noch das Beispiel eines Dateinamens.
Vielen Dank schon einmal im vorraus an alle helfer !
'Dateiname
"00060032009010800363_13_090_2009_01_20_03_08_42.txt"
Datum in dieser beispieldatei ist der "20.01.2009"
Uhrzeit = "3 Uhr" "8 Minuten" "42 Sekunden"
die Ausgabe der gefundenen Dateinamen soll in eine Listbox mit dem Nahmen Listbox1 erfolgen.
Vielen Dank
gruß Chris

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dateisuche (kriterium Dateiname) Datum Uhrzeit
26.01.2009 11:19:54
Tino
Hallo,
teste mal diesen Code, Pfad, Datum von, Datum bis musst Du noch anpassen.
Gelistet wird in Spalte A ab A2.
Option Explicit


Dim ErsteZelle As Range

Sub Read_Write_Files_In_Folder()
Dim VonDatum As Date, BisDatum As Date
Range("A2", Cells(Rows.Count, 1)).Value = ""

VonDatum = "20.01.2009 03:07:00" 'Datum von 
BisDatum = "21.01.2009 03:10:00" 'Datum bis 
'erste Zelle, ab welcher Zelle einfügen? 
Set ErsteZelle = Range("A2")

With Application
 .StatusBar = "Lese Daten, bitte warten..."
 .ScreenUpdating = False

'Pfad anpassen 
'Pfad, VonDatum, BisDatum, Dateiformat, mit Unterordner, kompl. Pfad u. Datei 
    ListFilesInFolder "J:\1 Forum", VonDatum, BisDatum, "*.txt", True, True


  .ScreenUpdating = True
  .StatusBar = False
End With
End Sub

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 
     
    For Each FileItem In SourceFolder.Files
        If (LCase(FileItem) Like LCase(DateiFormat)) And (FileItem Like "*_*") Then
          FileName = Right$(FileItem, Len(FileItem) - InStrRev(FileItem, "\"))
            Debug.Print FunctionDatum(FileName)
         If FunctionDatum(FileName) >= DatumVon And FunctionDatum(FileName) <= DatumBis Then
            ErsteZelle.Value = IIf(FolderName, FileItem, FileName)
            Set ErsteZelle = ErsteZelle.Offset(1, 0)
         End If
        
        End If
    Next FileItem


    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 strTXT As String, strTXT2 As String
Dim Datum As Date
On Error GoTo Fehler:
strTXT = Right$(strText, Len(strText) - InStr(strText, "_" & Year(Date)))
strTXT2 = Replace(Right$(strText, Len(strTXT) - 11), ".txt", "")
strTXT2 = Replace(strTXT2, "_", ":")
strTXT = Replace(Left$(strTXT, 10), "_", ".")

FunctionDatum = CDate(strTXT) + TimeValue(strTXT2)
Exit Function
Fehler:
FunctionDatum = 0
End Function


Gruß Tino

Anzeige
AW: Dateisuche (kriterium Dateiname) Datum Uhrzeit
26.01.2009 11:36:51
Tino
Hallo,
lösche die Zeile
Debug.Print FunctionDatum(FileName)
die war nur zu testzwecken eingebaut.
Gruß Tino
AW: Dateisuche (kriterium Dateiname) Datum Uhrzeit
26.01.2009 11:41:00
chris
Wow,
super code.
Hilft mir.
Ich habe es ganz anders begonnen.
Danke gruß Chris
AW: Dateisuche (kriterium Dateiname) Datum Uhrzeit
26.01.2009 12:00:21
Tino
Hallo,
hier noch die Änderung mit der Idee von Erich.
Option Explicit

Dim ErsteZelle As Range

Sub Read_Write_Files_In_Folder()
Dim VonDatum As Date, BisDatum As Date
Range("A2", Cells(Rows.Count, 1)).Value = ""

VonDatum = "20.01.2009 03:07:00" 'Datum von 
BisDatum = "21.01.2009 03:10:00" 'Datum bis 
'erste Zelle, ab welcher Zelle einfügen? 
Set ErsteZelle = Range("A2")

With Application
 .StatusBar = "Lese Daten, bitte warten..."
 .ScreenUpdating = False

'Pfad anpassen 
'Pfad, VonDatum, BisDatum, Dateiformat, mit Unterordner, kompl. Pfad u. Datei 
    ListFilesInFolder "J:\1 Forum", VonDatum, BisDatum, "*_20##_##_##_##_##_##.txt", True, True

  .ScreenUpdating = True
  .StatusBar = False
End With
End Sub

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 
     
    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) <= DatumBis Then
            ErsteZelle.Value = IIf(FolderName, FileItem, FileName)
            Set ErsteZelle = ErsteZelle.Offset(1, 0)
         End If
        
        End If
    Next FileItem


    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 strTXT As String, strTXT2 As String
Dim Datum As Date
On Error GoTo Fehler:
strTXT = Right$(strText, Len(strText) - InStr(strText, "_" & Year(Date)))
strTXT2 = Replace(Right$(strText, Len(strTXT) - 11), ".txt", "")
strTXT2 = Replace(strTXT2, "_", ":")
strTXT = Replace(Left$(strTXT, 10), "_", ".")

FunctionDatum = CDate(strTXT) + TimeValue(strTXT2)
Exit Function
Fehler:
FunctionDatum = 0
End Function


Gruß Tino

Anzeige
AW: Dateisuche (kriterium Dateiname) Datum Uhrzeit
26.01.2009 13:04:45
chris
Vielen Dank euch allen.
Jetzt habe ich so viele Tipps bekommen weiß gar nicht mehr welchen ich nehmen soll.
Aber ich versuche es mal mit dem von Tino !
Danke an alle und schönen tag noch !
AW: Dateisuche (Datum+Uhrzeit im Namen)
26.01.2009 11:42:00
Erich
Hallo Chris,
mit dieser Routine bekommt du die Verzeichnisse und Dateinamen in das Array arrE.
Die "FileSearchINF" ist von Sepp (Quellverweis steht im Code), ich hab sie nur etwas abgeänwandelt.
Momentan wird areE auf dem aktiven Tabellenblatt ausgegeben.
(Das sollte vorher leer sein):

Option Explicit
Sub ListeFiles()
Dim result As Long, lngF As Long, arrF() As Object, arrE(), lngE As Long
Dim datVon As Date, datBis As Date, strNam As String, datNam As Date
Const strVz As String = "D:\Daten\"
Const strVon As String = "20.01.2009 02:30:00"
Const strBis As String = "20.01.2009 05:00:00"
datVon = CDate(strVon)
datBis = CDate(strBis)
FileSearchINF result, arrF, strVz, "*_20##_##_##_##_##_##.txt", True
If result > 0 Then
ReDim arrE(1 To 2, 1 To result)
For lngF = 1 To result
With arrF(lngF - 1)
strNam = Left(Right(.Name, 23), 19)
datNam = CDate(Replace(Left(strNam, 10), "_", "-"))         ' Datum(Name)
datNam = datNam + CDate(Replace(Right(strNam, 8), "_", ":")) '+Zeit(Name)
If datVon  0 Then
ReDim Preserve arrE(1 To 2, 1 To lngE)
Cells(1, 1).Resize(result, 2) = Application.Transpose(arrE)
End If
End If
End Sub
' Dateien auflisten (auch mit Unterordnern)
' Josef Ehrensberger, 16.01.2009 12:19:13
' www.herber.de/forum/archiv/1040to1044/t1040526.htm#1040532
' modifiziert Erich G. 17.01.2009
Private Sub FileSearchINF(ByRef lngA As Long, _
ByRef varA() As Object, _
ByVal strPath As String, _
Optional ByVal strNam As String = "*", _
Optional ByVal bolSubF As Boolean = False)   'by J.Ehrensberger
' PARAMETER:
'  lngA:    Anzahl Suchergebnisse
'  varA:    Datenfeld für Suchergebnis.  UBound(varA) kann > lngA sein!
'  strPath: zu durchsuchendes Verzeichnis
'  strNam:  gesuchter Dateityp oder -name (Optional, Standard="*.*" findet alle Dateien)
'           Bsp: "*.txt"         alle Textdateien
'                "*name*"        alle Dateien mit "name" im Dateinamen
'                "*.avi;*.mpg"   .avi- und .mpg-Dateien (Dateitypen mit ; trennen)
'  bolSubF: ob Unterordner durchsucht werden sollen (Optional, Standard=False)
Dim objFSO As Object, fsoFold As Object, fsoSubFo As Object, fsoFile As Object
Dim intC As Integer, varTyp As Variant, dummy As Long
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set fsoFold = objFSO.GetFolder(strPath)
If InStr(1, strNam, ";") > 0 Then
varTyp = Split(strNam, ";")
Else
ReDim varTyp(0)
varTyp(0) = strNam
End If
On Error Resume Next                     ' evtl. bei geschützten Verz.
dummy = fsoFold.Files.Count
On Error GoTo 0
If dummy > 0 Then
For Each fsoFile In fsoFold.Files
If Not fsoFile Is Nothing Then
For intC = 0 To UBound(varTyp)
If LCase(objFSO.GetFileName(fsoFile)) Like LCase(varTyp(intC)) Then
If lngA = 0 Then
ReDim varA(1000)
ElseIf lngA > UBound(varA) Then
ReDim Preserve varA(UBound(varA) + 500)
End If
Set varA(lngA) = fsoFile
lngA = lngA + 1
Exit For
End If
Next
End If
Next
End If
If bolSubF Then
On Error Resume Next                     ' evtl. bei geschützten Verz.
dummy = fsoFold.SubFolders.Count
On Error GoTo 0
If dummy > 0 Then
For Each fsoSubFo In fsoFold.SubFolders
FileSearchINF lngA, varA, fsoSubFo, strNam, True
Next
End If
End If
Set objFSO = Nothing
Set fsoFold = Nothing
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Dateisuche (Datum+Uhrzeit im Namen)
26.01.2009 11:52:00
Tino
Hallo Erich,
"*_20##_##_##_##_##_##.txt"
an dieses Format habe ich gar nicht gedacht, super.
Gruß Tino
AW: Format ?
26.01.2009 13:22:00
chris
Hallo noch einmal,
was bedeutet das ?
Ich habe jetzt diesen code so umgebaut aber wozu das format ?
Wobei hilft mir dieser Code ?
Sorry bin leihe..
"*_20##_##_##_##_##_##.txt"
Danke für die Hilfe bis jetzt !!
gruß Chris
AW: Format ?
26.01.2009 13:27:48
Tino
Hallo,
der hilft dabei die richtige Datei zu filtern.
Gruß Tino
AW: Format ?
26.01.2009 13:35:00
chris
Hmm ok.
Klappt das auch wenn der Dateiname nicht so.
"00060032009010800363_13_090_2009_01_20_03_08_42.txt"
sondern so ist ?
00060042009011601464_13_090_2009_01_17_00_41_38.dat
Danke
Anzeige
AW: Format ?
26.01.2009 13:45:29
Tino
Hallo,
geht auch, musst eben beim Filter anstatt .txt, .dat schreiben.
"*_20##_##_##_##_##_##.dat"
Gruß Tino
AW: noch einmal offen(frage dazu)
26.01.2009 22:35:00
chris
Hallo zusammen,
sorry aber ich muss den Beitrag noch einmal öffnen weil ihr mir so gut geholfen habt heute.
Vielleicht kann ich die Geschwindigkeit mit eurer Hilfe weiter verbessern.
Momentane suchzeit(Laufzeit des Programmes) ca 30 Minuten.
Dazu muss ich mal meine Ordnerstruktur erklären.Vielleicht gibt es da einen guten Trick nur die benötigten Ordner zu durchsuchen.
C:\Start
darunter sind die Ordner
2008
2009
Unter jedem der Jahresordner sind 12 ordner für jeweils 1 Monat also 1 , 2 , 3 , usw.. bis 12
Dann sind unter jedem Monatsordner noch einmal 30 oder 31 Ordner für den Tag.
Darunter noch einmal 24 Ordner für die Uhrzeit (Stunde) und dann noch einmal 60 Ordner für die Minuten.
Also wie Ihr erkennt schon eine ganze Menge Ordner und Unterordner.
Wenn ich jetzt meine Suche Starte habe ich als Suchstring für das Makro diesen Pfad.
C:\Start
Es werden also alle Ordner mit Unterordner durchsucht auch diese die nicht möglich sein könnten z.b der Ordner 2008 Wenn also gewnschtes Start Datum der "01.01.2009 10:00:00" ist.
Wie kann ich die suche so umbauen das wirklich nur in den Ordnern gesucht wird in denen auch die Daten vorhanden sein können.
Auf meiner Form habe ich die möglichkeit ein Stardatum +Starzeit festzulegen und ein Enddatum + Endzeit.
Der string sieht dann etwa so aus.
Start = "01.01.2009 10:00:00"
Ende = "10.02.2009 19:00:00"
Jetzt soll auch nur in den Ordnern gesucht werden die möglich sind.also Es muss z.b im UnterOrdner
C:\Start\2008\03\*.... nicht gesucht werden weil ja in diesem Ordner keine Daten von Januar Und Februar mehr vorhanden sein können da \03\ für Monat März steht.
(Momentan werden wirklich alle Unterordner durchsucht.)
Ich hoffe ich konnte es einigermaßen erklären.
Ich würde mich über eine erneute Hilfe mindestens genauso freuen wie heute MIttag.
Und dafür schon einmal vielen Dank!
Und gute nacht wünsche ich euch !
gruß Chris
Anzeige
AW: noch einmal offen(frage dazu)
26.01.2009 23:06:00
Tino
Hallo,
habe mal etwas eingebaut, zumindest kannst Du auf ein Monat einschränken.
Nachteil bei dieser Version, die Abfrage muss sich in einem Monat befinden.
Andere Idee habe ich jetzt nicht, aber dies liegt wahrscheinlich auch an der Uhrzeit.
Habe den Code jetzt aber auch nicht getestet.
Option Explicit

Dim ErsteZelle As Range

Sub Read_Write_Files_In_Folder()
Dim VonDatum As Date, BisDatum As Date
Dim sOJahr As String, sOMonat As String
Dim sPfad As String
Range("A2", Cells(Rows.Count, 1)).Value = ""

VonDatum = "20.01.2009 03:07:00" 'Datum von 
BisDatum = "21.01.2009 03:10:00" 'Datum bis 

'hier Grundpfad angeben ohne \ am ende 
sPfad = "C:\Start"
sOJahr = "\" & Format(VonDatum, "yyyy") & "\"
sOMonat = Format(VonDatum, "mm")
sPfad = sPfad & sOJahr & sOMonat

'erste Zelle, ab welcher Zelle einfügen? 
Set ErsteZelle = Range("A2")

With Application
 .StatusBar = "Lese Daten, bitte warten..."
 .ScreenUpdating = False

'Pfad anpassen 
'Pfad, VonDatum, BisDatum, Dateiformat, mit Unterordner, kompl. Pfad u. Datei 
    ListFilesInFolder sPfad, VonDatum, BisDatum, "*_20##_##_##_##_##_##.txt", True, True

  .ScreenUpdating = True
  .StatusBar = False
End With
End Sub

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 
   
    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) <= DatumBis Then
            ErsteZelle.Value = IIf(FolderName, FileItem, FileName)
            Set ErsteZelle = ErsteZelle.Offset(1, 0)
         End If
        
        End If
    Next FileItem
   

    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 strTXT As String, strTXT2 As String
Dim Datum As Date
On Error GoTo Fehler:
strTXT = Right$(strText, Len(strText) - InStr(strText, "_" & Year(Date)))
strTXT2 = Replace(Right$(strText, Len(strTXT) - 11), ".txt", "")
strTXT2 = Replace(strTXT2, "_", ":")
strTXT = Replace(Left$(strTXT, 10), "_", ".")

FunctionDatum = CDate(strTXT) + TimeValue(strTXT2)
Exit Function
Fehler:
FunctionDatum = 0
End Function


Gruß Tino

Anzeige
AW: noch einmal offen(frage dazu)
26.01.2009 23:09:29
chris
Ok Vielen dank.
Wenn dir vielleicht noch bis morgen etwas einfällt sag bescheid.
Aber ist schon mal riesig wie du mir hilfst.
Dafür danke.
Leider verstehe ich den Code nicht so ganz und kann daher auch selbst keine erweiterungen einbauen.
Danke
AW: noch einmal offen(frage dazu)
27.01.2009 00:22:38
Tino
Hallo,
versuche es mal hiermit.
Option Explicit

Dim ErsteZelle As Range
Dim sGrundPfad As String
Sub Read_Write_Files_In_Folder()
Dim VonDatum As Date, BisDatum As Date
Dim sOJahr As String, sOMonat As String

Range("A2", Cells(Rows.Count, 1)).Value = ""

VonDatum = "01.01.2009 03:07:00" 'Datum von 
BisDatum = "02.01.2009 23:59:59" 'Datum bis 

'hier Grundpfad angeben ohne \ am ende 
sGrundPfad = "C:\Start"

'erste Zelle, ab welcher Zelle einfügen? 
Set ErsteZelle = Range("A2")

With Application
 .StatusBar = "Lese Daten, bitte warten..."
 .ScreenUpdating = False

'Pfad anpassen 
'Pfad, VonDatum, BisDatum, Dateiformat, mit Unterordner, kompl. Pfad u. Datei 
    ListFilesInFolder sGrundPfad, VonDatum, BisDatum, "*_20##_##_##_##_##_##.txt", True, True

  .ScreenUpdating = True
  .StatusBar = False
End With
End Sub

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) <= DatumBis Then
            ErsteZelle.Value = IIf(FolderName, FileItem, FileName)
            Set ErsteZelle = ErsteZelle.Offset(1, 0)
         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 strTXT As String, strTXT2 As String
Dim Datum As Date
On Error GoTo Fehler:
strTXT = Right$(strText, Len(strText) - InStr(strText, "_" & Year(Date)))
strTXT2 = Replace(Right$(strText, Len(strTXT) - 11), ".txt", "")
strTXT2 = Replace(strTXT2, "_", ":")
strTXT = Replace(Left$(strTXT, 10), "_", ".")

FunctionDatum = CDate(strTXT) + TimeValue(strTXT2)
Exit Function
Fehler:
FunctionDatum = 0
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) < 11 Then
    DatumOrdner = False
    Exit Function
Else
    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 <= Int(DatumBis) Then
      DatumOrdner = True
      Exit Function
    End If
End If

DatumOrdner = False
End Function


Gruß Tino

Anzeige
AW: noch einmal offen(frage dazu)
27.01.2009 07:34:00
chris
Vielen dank.Werde gleich mal schauen obs klappt.
Danke und schönen Tag !!!
AW: super aber noch einmal offen
27.01.2009 08:25:50
chris
Hallo Tino,
recht herzlichen Dank aber irgendwas klappt noch nicht.Und ich blicke den code nicht komplett.
das ist mein Pfad.
\\10.10.10.10\test\Data\test\Data\ML03\Production\Stat\test1\2009
Diese Datums habe ich eingetragen.
VonDatum = "08.01.2009 00:00:01" 'Datum von
BisDatum = "09.01.2009 00:00:00" 'Datum bis
Das Programm findet jetzt 4 dateien aus dem Ordner
\\10.10.10.10\test\Data\test\Data\ML03\Production\Stat\test1\2009\01\08\09
Aber es sind ja auch noch dateien mit dem gleichen Datum im Ordner'
\\10.10.10.10\test\Data\test\Data\ML03\Production\Stat\test1\2009\01\08\10
und
\\10.10.10.10\test\Data\test\Data\ML03\Production\Stat\test1\2009\01\08\11
usw... diese Ordner werden glaube ich nicht durchsucht ?
Kannst du mir noch einmal helfen Oder jemand anders ?
Wäre echt klasse weil ich gerade davor sitze und nicht weiter komme.
Danke
Vielen Dank gruß Chris
Noch eins Wenn ich als Datum diese Datums vorgebe findet er gar keine Datei obwohl ja dateien mit dem datum und diese Zeit vorhanden sind.
VonDatum = "08.01.2009 00:00:01" 'Datum von
BisDatum = "08.01.2009 23:59:00" 'Datum bis
Anzeige
Versuche es nochmal.
27.01.2009 08:42:44
Tino
Hallo,
teste mal, habe es nicht getestet, müsste mir erst die Umgebung schaffen.
Option Explicit

Dim ErsteZelle As Range
Dim sGrundPfad As String
Sub Read_Write_Files_In_Folder()
Dim VonDatum As Date, BisDatum As Date
Dim sOJahr As String, sOMonat As String

Range("A2", Cells(Rows.Count, 1)).Value = ""

VonDatum = "01.01.2009 03:07:00" 'Datum von 
BisDatum = "02.01.2009 23:59:59" 'Datum bis 

'hier Grundpfad angeben ohne \ am ende 
sGrundPfad = "C:\Start"

'erste Zelle, ab welcher Zelle einfügen? 
Set ErsteZelle = Range("A2")

With Application
 .StatusBar = "Lese Daten, bitte warten..."
 .ScreenUpdating = False

'Pfad anpassen 
'Pfad, VonDatum, BisDatum, Dateiformat, mit Unterordner, kompl. Pfad u. Datei 
    ListFilesInFolder sGrundPfad, VonDatum, BisDatum, "*_20##_##_##_##_##_##.txt", True, True

  .ScreenUpdating = True
  .StatusBar = False
End With
End Sub

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) <= DatumBis Then
            ErsteZelle.Value = IIf(FolderName, FileItem, FileName)
            Set ErsteZelle = ErsteZelle.Offset(1, 0)
         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 strTXT As String, strTXT2 As String
Dim Datum As Date
On Error GoTo Fehler:
strTXT = Right$(strText, Len(strText) - InStr(strText, "_" & Year(Date)))
strTXT2 = Replace(Right$(strText, Len(strTXT) - 11), ".txt", "")
strTXT2 = Replace(strTXT2, "_", ":")
strTXT = Replace(Left$(strTXT, 10), "_", ".")

FunctionDatum = CDate(strTXT) + TimeValue(strTXT2)
Exit Function
Fehler:
FunctionDatum = 0
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) < 11 Then
    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 <= Int(DatumBis) Then
      DatumOrdner = True
      Exit Function
    End If
End If

DatumOrdner = False
End Function


Gruß Tino

Anzeige
AW: Versuche es nochmal.
27.01.2009 09:23:00
chris
Hallo Tino,
klappt wunderbar.
Kleine frage noch.
Wenn ich die Daten statt in der Exceltabelle in einer Listbox ausgeben will wie mache ich das ?
Gibt es was schnelleres als das oder ist der code hier OK.?
'ErsteZelle.Value = IIf(FolderName, FileItem, FileName)
frm_main.ListBox1.AddItem = IIf(FolderName, FileItem, FileName)
'Set ErsteZelle = ErsteZelle.Offset(1, 0)
Danke Tino
AW: Versuche es nochmal.
27.01.2009 09:29:00
chris
Wieder zu.
ich versuche es jetzt so zu lösen.
Erst die Daten in Tabelle einzufügen und dann in Array einzulesen und dann ausgeben in Listbox.
Danke für Alles !
gruß Chris
AW: kleine Korrektur
27.01.2009 09:30:38
Erich
Hallo Chris und Tino,
ein Problem steckt wohl noch im Code. Das Ergebnis der Funktion FunctionDatum hängt davon ab,
wann die Fkt. aufgerufen wird. In der Zeile
strTXT = Right$(strText, Len(strText) - InStr(strText, "_" & Year(Date)))
wird nach dem aktuellen Jahr gesucht. Das sollte aber wohl überhaupt keine Rolle spielen.
(Momentan müsste im Text "2009" vorkommen,
ein Aufruf mit "2008" oder "2010" bringt Fehler, also 0.)
Mein Vorschlag:

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

FunctionDatum muss im Fehlerfall nicht mit 0 belegt werden, denn 0 ist der Initialwert.
Noch ein Vorschlag: Ich würde die Fkt. anders nennen, z. B. DatAusTxt().
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: kleine Korrektur
27.01.2009 09:47:00
chris
Sorry blicke nicht durch.
Tino was meinst du ?
Soll ich was umstellen ?
Danke Erich für den Tipp !!
AW: kleine Korrektur
27.01.2009 10:06:00
chris
Hallo Erich, habe jetzt einmal deine function eingebaut.
geht auch:)
Wo der fehler besteht verstehe ich noch nicht so ganz aber wird schon passen.
Danke dir und Tino noch einmal !!!
gruß Chris
@Erich
27.01.2009 10:08:00
Tino
Hallo,
man bist Du gut, genau ist mir nicht aufgefallen. Super echt Klasse.
Gruß Tino
AW: noch einmal offen(frage dazu)
27.01.2009 09:01:00
chris
Wow,
super klappt perfekt.
Muss jetzt mal beide Codes nebeneinander stellen und den unterschied finden:)
Blicke da gar nicht durch.
Danke und schönen Tag !
gruß Chris
AW: Dateisuche (kriterium Dateiname) Datum Uhrzeit
26.01.2009 11:56:00
fcs
Hallo Chris,
hier ein Beispiel.
Ob es "ewig" dauert hängt natürlich von der Anzahl der Dateien im Verzeichnis ab.
Den Namen der Listbox muss du anpassen und ggf. auch die Vorgabe-Werte in den Inputboxen.
Gruß
Franz

Sub ListboxFuellen()
Dim objDatei As Variant, objFS As FileSearch, lngCount As Long, lngFound As Long
Dim eingabe As Variant, strPrompt1 As String, strPrompt2 As String
Dim start As Date, ende As Date, strZeit As String, dateZeit As Date
Dim varVerzeichnis As Variant
'Verzeichnis auswahl (via Dateiauswahl)
varVerzeichnis = Application.GetOpenFilename(Filefilter:="Textdateien(*.txt,*.txt", _
Title:="Bitte Datei im gewünschten Verzeichnis auswählen und öffnen")
If varVerzeichnis = False Then Exit Sub
varVerzeichnis = VBA.CurDir
'Start- und Ende-datum eingeben
strPrompt2 = ""
strPrompt1 = "Bitte Startdatum und ggf. Zeit eingeben" & vbLf & _
"Format: JJJJ-MM-TT hh:mm:ss" & vbLf & "   oder TT.MM.JJJJ hh:mm:ss" & vbLf & _
"Uhrzeit kann weggelassen werden"
StartDatum:
eingabe = InputBox(Prompt:=strPrompt2 & strPrompt1, _
Title:="Dateisuche - Start-Datum", _
Default:=Format(Date - 10, "YYYY-MM-DD hh:mm:ss"))
If eingabe = "" Then Exit Sub
If IsDate(eingabe) Then
start = CDate(eingabe)
Else
strPrompt2 = "Eingabe war kein gültiges Datum!" & vbLf & vbLf
GoTo StartDatum
End If
strPrompt2 = ""
strPrompt1 = "Bitte Endedatum und ggf. Zeit eingeben" & vbLf & _
"Format: JJJJ-MM-TT hh:mm:ss" & vbLf & "   oder TT.MM.JJJJ hh:mm:ss" & vbLf & _
"Uhrzeit kann weggelassen werden"
EndeDatum:
eingabe = InputBox(Prompt:=strPrompt2 & strPrompt1, _
Title:="Dateisuche - Ende-Datum", _
Default:=Format(start, "YYYY-MM-DD hh:mm:ss"))
If eingabe = "" Then Exit Sub
If IsDate(eingabe) Then
ende = CDate(eingabe)
Else
strPrompt2 = "Eingabe war kein gültiges Datum!" & vbLf & vbLf
GoTo EndeDatum
End If
If ende  0 Then
'Listbox mit Dateinamen füllen
Me.ListBox1.Clear
lngCount = 0
lngFound = .FoundFiles.Count
For Each objDatei In .FoundFiles
Application.StatusBar = "Datei  " & lngCount & "  von  " & lngFound
'Zeit aus dem dateinamen herausschneiden
strZeit = Left(Right(objDatei, 23), 19)
'UnderScores "_" durch Zeit-Trennzeichen erstzen
strZeit = Replace(Left(strZeit, 10), "_", "-") & " " _
& Replace(Right(strZeit, 8), "_", ":")
'Prüfung, ob ausgeschnittener Text eine gültige Zeit-Angabe ist
If IsDate(strZeit) Then
dateZeit = CDate(strZeit)
'Vergleich der Zeit im dateinamen mit den Eingabe-Zeiten
If dateZeit >= start And dateZeit 


299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige