Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Dateien einschließlich Unterzerzeichnis auslesen und in Tabelle ablegen

Begonnen von HabNeFrage, November 04, 2016, 17:00:01

⏪ vorheriges - nächstes ⏩

HabNeFrage

Hallo,
ich weiß das Thema ist schon des öfteren behandelt worden.

Als erstes findet Access 2010 den Code nicht. Ich habe ihn versucht über ein Macro mit AusführenCode mit "Einlesen()" aufzurufen (ohne Anf.Zeichen)
Bekomme ich immer: "Der von ihnen eingegebene Ausdruck enthält den Namen einer Funktion die von Microsoft Access nicht gefunden werden kann."
Fehlernummer: 2425

Rufe ich den Code direkt im Editor auf, kein Ding läuft er, und befüllt meine Tabelle "T_ausgelesene_Dateien"

Unabhängig davon, er macht nicht ganz was sie soll.

Er soll auch leere Verzeichnisse auflisten, denn ich will diese Auflistung zu einem Hyperlink machen damit ich direkt drauf zu greifen kann. (liegt alles etwas weit unten in der Struktur...)

Weiterhin soll der Dateiname in einem anderen Feld stehen.
Wenn alle Verzeichnisse zusätzlich dann noch extra ständen wäre es noch eine tolle Sache,
dann ließe sich das ganze noch besser nutzen.

Sehe gerade dass das löschen der Tabelle "T_ausgelesene_Dateien" wie beschrieben auch nicht funktioniert, der scheint hinten anzuhängen.

Ich habe versucht... nix bei raus gekommen.

Option Compare Database

Option Compare Database

Private Type BrowseInfo
    hwndOwner As Long
    pIDLRoot As Long
    pszDisplayName As Long
    lpszTitle As Long
    ulFlags As Long
    lpfnCallback As Long
    lParam As Long
    iImage As Long
End Type

Private Declare Function SHBrowseForFolder Lib "shell32" _
    (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" _
    (ByVal pIDList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" _
    Alias "lstrcatA" (ByVal lpString1 As String, _
                      ByVal lpString2 As String) As Long
Private Declare Function GetDriveType Lib "kernel32" _
    Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
   
Private Verzeichnisse()
Private Dateien()
Private Anzdateien As Long
Private Dateiendung As String

Sub Einlesen()
    Dim Ordnername
    Dim Pfad1 As String
    Dim Obergrenze As Long
    Dim Anzordner As Long
    Dim i As Long
    Dim Start As Long
    Dim CD_Bezeichnung As String
    Dim rs As DAO.Recordset

    Ordnername = Ordnerwählen("Ab welchem Verzeichnis einlesen?")
    If Ordnername = False Then Exit Sub
    ChDir Ordnername
    'Wir gehen eine Ebene nach oben, damit wir von dort in dieses erste
    'Verzeichnis wechseln können
    ChDir ".."
    If Ordnername <> "" Then
        Anzdateien = 0
        Pfad1 = Ordnername    'Arbeitspfad merken
        If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
        ReDim Verzeichnisse(0)      'Die Hauptebene wird das 0. Element
        Verzeichnisse(0) = Pfad1
        Obergrenze = UBound(Verzeichnisse)
        ReDim Dateien(0)
Rekursion:
        For i = Start To Obergrenze
            Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
            Start = Start + 1
            Obergrenze = UBound(Verzeichnisse)
            GoTo Rekursion
        Next
        Anzordner = Obergrenze + 1 'Für Anzeige; da Array mit 0 beginnt 1 dazu
        'Lies in ein zweites Array alle Dateien aller gefundenen Verzeichnisse
        'ein. Damit das Dateien-Array auch entsprechend erweitert werden kann,
        'übergeben wirdie aktuelle Obergrenze als Startwert für neue
        'Arrayelemente
        For i = 0 To Obergrenze
            Suche_Dateien Verzeichnisse(i), UBound(Dateien)
        Next
        'War die Dateisuche erfolglos?
        If UBound(Dateien) = 0 Then
            If Len(Dateien(0)) = 0 Then
                                 'Es wurde nicht mal eine Excel-Datei gefunden
                MsgBox "In keinem der " & Anzordner & " Ordner konnte " & _
                       "eine Datei gefunden werden. " & vbCr & _
                       "Es gibt nichts zu tun!", vbInformation + vbOKOnly, _
                       "Keine Dateien"
            End If
          Else
            'Wir nehmen die letzte Ebene, die ein leeres Feld enthält,
            'wieder raus.
            Set rs = CurrentDb.OpenRecordset("T_ausgelesene_Dateien")
            ReDim Preserve Dateien(UBound(Dateien) - 1)
            With rs
                For i = 0 To UBound(Dateien)
                    .AddNew
                    !Dateiname = Dateien(i)
                    .Update
                Next
            End With
        End If
    End If
End Sub

Private Sub Verzeichnisse_suchen(ByVal Pfad As String, _
                                 ByVal Arraygrenze As Long)
'Lies die Verzeichnisse in Pfad ein. Die Prozedur wird in OK_Click "rekursiv"
'aufgerufen, so dass wir ab einem Startverzeichnis eine Struktur einlesen
'können.
    Dim Name1 As String
   
    Name1 = Dir(Pfad, vbDirectory)    ' Ersten Eintrag abrufen.
    Do While Name1 <> ""    ' Schleife beginnen.
        ' Aktuelles und übergeordnetes Verzeichnis ignorieren.
        If Name1 <> "." And Name1 <> ".." Then
            'Ist die gefundene Datei ein Verzeichnis?
            If (GetAttr(Pfad & Name1) And vbDirectory) = vbDirectory Then
                Arraygrenze = Arraygrenze + 1
                ReDim Preserve Verzeichnisse(Arraygrenze)
                Verzeichnisse(Arraygrenze) = Pfad & Name1 & "\"
            End If
        End If
        Name1 = Dir    'Nächstes Verzeichnis finden
    Loop
End Sub

Private Sub Suche_Dateien(ByVal Pfad As String, ByVal Arraygrenze As Long)
'Suche nach allen XL-Dateien im angegebenen Pfad
    Dim Name2 As String
   
    Name2 = Dir(Pfad & "*.*", vbNormal)
    Do While Name2 <> ""
        If (GetAttr(Pfad & Name2) And vbNormal) = vbNormal Then
            ReDim Preserve Dateien(Arraygrenze + 1)
            'Die Ebene, die wir hier vorsorglich schon mal erweitern,
            'wird später wieder entfernt - aber erst ganz zum Schluss,
            'wenn keine weiteren Dateien gefunden wurden.
            Dateien(Arraygrenze) = Pfad & Name2
            Arraygrenze = Arraygrenze + 1
            Anzdateien = Anzdateien + 1
        End If
        Name2 = Dir()
    Loop
End Sub

Private Function Ordnerwählen(ByVal strTitle As String) As String
'Stellt ein Windows-Dialogfeld zur Verfügung, mit dem sich ein beliebiger
'Ordner auswählen läßt.
'Entweder wird dieser oder (bei Abbruch) "" zurückgeliefert.
    Dim lngIDList As Long
    Dim strBuffer As String
    Dim UserBrowseInfo As BrowseInfo
   
    With UserBrowseInfo
        .hwndOwner = 0
        .lpszTitle = lstrcat(strTitle, "")
        .ulFlags = 3
    End With
    lngIDList = SHBrowseForFolder(UserBrowseInfo)
    If (lngIDList) Then
        strBuffer = Space(260)
        SHGetPathFromIDList lngIDList, strBuffer
        strBuffer = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
        Ordnerwählen = strBuffer
    End If
End Function

DF6GL

Hallo,

es wäre angenehm, das/die Problem/e verständlich zu beschreiben....

--erstelle eine Tabelle mit Namen "T_ausgelesene_Dateien"  mit den Feldern "Dateiname" und "Pfadname", Datentyp Text (ein zusätzliches ID-Feld (Autowert) wäre nicht verkehrt.
-- Lösche eine "Option Compare Database"-Zeile
-- füge stattdessen "Option Explicit" hinzu
-- ändere "If Ordnername = False Then Exit Sub" in "If Ordnername = vbNullString Then Exit Sub"
-- füge den folgenden Code nach der For-Schleife für die Dateinamen ein:
                For i = 0 To UBound(Verzeichnisse)
                    .AddNew
                    !Pfadname = Verzeichnisse(i)
                    .Update
                Next


--schreibe vor "set rs =Currentdb.Openrecordset......    diese Zeile:              CurrentDb.Execute "Delete * from T_ausgelesene_Dateien", dbFailOnError
-- führe im VBA-Editor "debuggen/kompilieren" durch.
-- Starte die Prozedur "Einlesen", entweder direkt  im VBA-Editor oder ruf sie in einer Ereignisprozedur (Klick-Ereignis einer Schaltfläche) auf.






HabNeFrage

Guten Morgen DF6GL,
Du siehst es beschäftigt mich. Nur habe ich mich gerade via Fernwartung auf meinen PC geschaltet, konnte somit nicht früher antworten.
Sicher hast Du längst bemerkt, das der Code nicht von mir stammt, sondern aus einem anderen Beitrag. Nur konnte ich den Ersteller nicht mehr erreichen, der Beitrag war sehr alt. Deswegen konnte ich hier keine genaueren Angaben machen.

Sobald ich nachher wieder am PC sitze werde ich es ausprobieren und Deine Änderungen durchführen.
Du hast es sehr gut beschriebe, ich hoffe es auch umsetzen zu können.
Habe sicher noch andere Dinge in dem Zusammenhang. (Dies ist nur ein Teil von einer Gesamtaufgabe)

HabNeFrage

#3
Guten Morgen,
ich habe den folgenden Code nach DF6GL eingefügt, aber der funktioniert nun gar nicht mehr.
Auch hier kommt die Meldung "Der von ihnen eingegebene Ausdruck enthält den Namen einer Funktion die von Microsoft Access nicht gefunden werden kann."
Fehlernummer: 2425
Ausserdem wird diese Fehlermeldung gebracht, das die For-Steurvaiable bereits verwendet wird.

Vielleicht habe ich auch etwas falsch gemacht.

Die Zeile  "set rs =Currentdb.Openrecordset......  " (nat.ohne diese Punkte) nicht gefunden.
Wenn ich es mir aber recht überlege, ich muß mehrere Verzeichnisse in die Tabelle bringen da wäre das löschen ja unsinnig.




Option Compare Database

Option Explicit

Private Type BrowseInfo
    hwndOwner As Long
    pIDLRoot As Long
    pszDisplayName As Long
    lpszTitle As Long
    ulFlags As Long
    lpfnCallback As Long
    lParam As Long
    iImage As Long
End Type

Private Declare Function SHBrowseForFolder Lib "shell32" _
    (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" _
    (ByVal pIDList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" _
    Alias "lstrcatA" (ByVal lpString1 As String, _
                      ByVal lpString2 As String) As Long
Private Declare Function GetDriveType Lib "kernel32" _
    Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
   
Private Verzeichnisse()
Private Dateien()
Private Anzdateien As Long
Private Dateiendung As String

Sub Einlesen()
    Dim Ordnername
    Dim Pfad1 As String
    Dim Obergrenze As Long
    Dim Anzordner As Long
    Dim i As Long
    Dim Start As Long
    Dim CD_Bezeichnung As String
    Dim rs As DAO.Recordset

    Ordnername = Ordnerwählen("Ab welchem Verzeichnis einlesen?")
    If Ordnername = vbNullString Then Exit Sub
    ChDir Ordnername
    'Wir gehen eine Ebene nach oben, damit wir von dort in dieses erste
    'Verzeichnis wechseln können
    ChDir ".."
    If Ordnername <> "" Then
        Anzdateien = 0
        Pfad1 = Ordnername    'Arbeitspfad merken
        If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
        ReDim Verzeichnisse(0)      'Die Hauptebene wird das 0. Element
        Verzeichnisse(0) = Pfad1
        Obergrenze = UBound(Verzeichnisse)
        ReDim Dateien(0)
Rekursion:
        For i = Start To Obergrenze
            Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
            Start = Start + 1
            Obergrenze = UBound(Verzeichnisse)
            GoTo Rekursion

For i = 0 To UBound(Verzeichnisse) 'neu eingefügt
            .AddNew 'neu eingefügt
            !Pfadname = Verzeichnisse(i) 'neu eingefügt
            .Update 'neu eingefügt

        Next
        Anzordner = Obergrenze + 1 'Für Anzeige; da Array mit 0 beginnt 1 dazu
        'Lies in ein zweites Array alle Dateien aller gefundenen Verzeichnisse
        'ein. Damit das Dateien-Array auch entsprechend erweitert werden kann,
        'übergeben wirdie aktuelle Obergrenze als Startwert für neue
        'Arrayelemente
        For i = 0 To Obergrenze
            Suche_Dateien Verzeichnisse(i), UBound(Dateien)
        Next
        'War die Dateisuche erfolglos?
        If UBound(Dateien) = 0 Then
            If Len(Dateien(0)) = 0 Then
                                 'Es wurde nicht mal eine Excel-Datei gefunden
                MsgBox "In keinem der " & Anzordner & " Ordner konnte " & _
                       "eine Datei gefunden werden. " & vbCr & _
                       "Es gibt nichts zu tun!", vbInformation + vbOKOnly, _
                       "Keine Dateien"
            End If
          Else
            'Wir nehmen die letzte Ebene, die ein leeres Feld enthält,
            'wieder raus.
            Set rs = CurrentDb.OpenRecordset("T_ausgelesene_Dateien")
            ReDim Preserve Dateien(UBound(Dateien) - 1)
            With rs
                For i = 0 To UBound(Dateien)
                    .AddNew
                    !Dateiname = Dateien(i)
                    .Update
                Next
            End With
        End If
    End If
End Sub

Private Sub Verzeichnisse_suchen(ByVal Pfad As String, _
                                 ByVal Arraygrenze As Long)
'Lies die Verzeichnisse in Pfad ein. Die Prozedur wird in OK_Click "rekursiv"
'aufgerufen, so dass wir ab einem Startverzeichnis eine Struktur einlesen
'können.
    Dim Name1 As String
   
    Name1 = Dir(Pfad, vbDirectory)    ' Ersten Eintrag abrufen.
    Do While Name1 <> ""    ' Schleife beginnen.
        ' Aktuelles und übergeordnetes Verzeichnis ignorieren.
        If Name1 <> "." And Name1 <> ".." Then
            'Ist die gefundene Datei ein Verzeichnis?
            If (GetAttr(Pfad & Name1) And vbDirectory) = vbDirectory Then
                Arraygrenze = Arraygrenze + 1
                ReDim Preserve Verzeichnisse(Arraygrenze)
                Verzeichnisse(Arraygrenze) = Pfad & Name1 & "\"
            End If
        End If
        Name1 = Dir    'Nächstes Verzeichnis finden
    Loop
End Sub

Private Sub Suche_Dateien(ByVal Pfad As String, ByVal Arraygrenze As Long)
'Suche nach allen XL-Dateien im angegebenen Pfad
    Dim Name2 As String
   
    Name2 = Dir(Pfad & "*.*", vbNormal)
    Do While Name2 <> ""
        If (GetAttr(Pfad & Name2) And vbNormal) = vbNormal Then
            ReDim Preserve Dateien(Arraygrenze + 1)
            'Die Ebene, die wir hier vorsorglich schon mal erweitern,
            'wird später wieder entfernt - aber erst ganz zum Schluss,
            'wenn keine weiteren Dateien gefunden wurden.
            Dateien(Arraygrenze) = Pfad & Name2
            Arraygrenze = Arraygrenze + 1
            Anzdateien = Anzdateien + 1
        End If
        Name2 = Dir()
    Loop
End Sub

Private Function Ordnerwählen(ByVal strTitle As String) As String
'Stellt ein Windows-Dialogfeld zur Verfügung, mit dem sich ein beliebiger
'Ordner auswählen läßt.
'Entweder wird dieser oder (bei Abbruch) "" zurückgeliefert.
    Dim lngIDList As Long
    Dim strBuffer As String
    Dim UserBrowseInfo As BrowseInfo
   
    With UserBrowseInfo
        .hwndOwner = 0
        .lpszTitle = lstrcat(strTitle, "")
        .ulFlags = 3
    End With
    lngIDList = SHBrowseForFolder(UserBrowseInfo)
    If (lngIDList) Then
        strBuffer = Space(260)
        SHGetPathFromIDList lngIDList, strBuffer
        strBuffer = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
        Ordnerwählen = strBuffer
    End If
End Function


Ziel des ganzen ist es, alle Verzeichnisse einschließlich der Unterverz. ab dem ausgew. Pfad mit Dateinamen auszulesen, und dann die gefundenen Dateinamen mit der Vorgabe zu vergleichen.
Es handelt sich um eine enorm große Verz.Strukur in der bestimmte Dateien in einem bestimmten Verz. abgelegt sein müssen. Das muss ich überprüfen.

DF6GL

Hallo,

so hab ich das gemeint (unchecked):


Option Compare Database

Option Explicit

Private Type BrowseInfo
    hwndOwner As Long
    pIDLRoot As Long
    pszDisplayName As Long
    lpszTitle As Long
    ulFlags As Long
    lpfnCallback As Long
    lParam As Long
    iImage As Long
End Type

Private Declare Function SHBrowseForFolder Lib "shell32" _
    (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" _
    (ByVal pIDList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" _
    Alias "lstrcatA" (ByVal lpString1 As String, _
                      ByVal lpString2 As String) As Long
Private Declare Function GetDriveType Lib "kernel32" _
    Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
   
Private Verzeichnisse()
Private Dateien()
Private Anzdateien As Long
Private Dateiendung As String

Sub Einlesen()
    Dim Ordnername
    Dim Pfad1 As String
    Dim Obergrenze As Long
    Dim Anzordner As Long
    Dim i As Long
    Dim Start As Long
    Dim CD_Bezeichnung As String
    Dim rs As DAO.Recordset

    Ordnername = Ordnerwählen("Ab welchem Verzeichnis einlesen?")
    If Ordnername = vbNullString Then Exit Sub
    ChDir Ordnername
    'Wir gehen eine Ebene nach oben, damit wir von dort in dieses erste
    'Verzeichnis wechseln können
    ChDir ".."
    If Ordnername <> "" Then
        Anzdateien = 0
        Pfad1 = Ordnername    'Arbeitspfad merken
        If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
        ReDim Verzeichnisse(0)      'Die Hauptebene wird das 0. Element
        Verzeichnisse(0) = Pfad1
        Obergrenze = UBound(Verzeichnisse)
        ReDim Dateien(0)
Rekursion:
        For i = Start To Obergrenze
            Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
            Start = Start + 1
            Obergrenze = UBound(Verzeichnisse)
            GoTo Rekursion

        Next

        Anzordner = Obergrenze + 1 'Für Anzeige; da Array mit 0 beginnt 1 dazu
        'Lies in ein zweites Array alle Dateien aller gefundenen Verzeichnisse
        'ein. Damit das Dateien-Array auch entsprechend erweitert werden kann,
        'übergeben wirdie aktuelle Obergrenze als Startwert für neue
        'Arrayelemente
        For i = 0 To Obergrenze
            Suche_Dateien Verzeichnisse(i), UBound(Dateien)
        Next
        'War die Dateisuche erfolglos?
        If UBound(Dateien) = 0 Then
            If Len(Dateien(0)) = 0 Then
                                 'Es wurde nicht mal eine Excel-Datei gefunden
                MsgBox "In keinem der " & Anzordner & " Ordner konnte " & _
                       "eine Datei gefunden werden. " & vbCr & _
                       "Es gibt nichts zu tun!", vbInformation + vbOKOnly, _
                       "Keine Dateien"
            End If
          Else
            'Wir nehmen die letzte Ebene, die ein leeres Feld enthält,
            'wieder raus.

CurrentDb.Execute "Delete * from T_ausgelesene_Dateien", dbFailOnError


            Set rs = CurrentDb.OpenRecordset("T_ausgelesene_Dateien")
            ReDim Preserve Dateien(UBound(Dateien) - 1)
            With rs
                For i = 0 To UBound(Dateien)
                    .AddNew
                    !Dateiname = Dateien(i)
                    .Update
                Next

For i = 0 To UBound(Verzeichnisse) 'neu eingefügt
                 .AddNew 'neu eingefügt
                 !Pfadname = Verzeichnisse(i) 'neu eingefügt
                 .Update 'neu eingefügt
                Next


            End With
        End If
    End If
End Sub

Private Sub Verzeichnisse_suchen(ByVal Pfad As String, _
                                 ByVal Arraygrenze As Long)
'Lies die Verzeichnisse in Pfad ein. Die Prozedur wird in OK_Click "rekursiv"
'aufgerufen, so dass wir ab einem Startverzeichnis eine Struktur einlesen
'können.
    Dim Name1 As String
   
    Name1 = Dir(Pfad, vbDirectory)    ' Ersten Eintrag abrufen.
    Do While Name1 <> ""    ' Schleife beginnen.
        ' Aktuelles und übergeordnetes Verzeichnis ignorieren.
        If Name1 <> "." And Name1 <> ".." Then
            'Ist die gefundene Datei ein Verzeichnis?
            If (GetAttr(Pfad & Name1) And vbDirectory) = vbDirectory Then
                Arraygrenze = Arraygrenze + 1
                ReDim Preserve Verzeichnisse(Arraygrenze)
                Verzeichnisse(Arraygrenze) = Pfad & Name1 & "\"
            End If
        End If
        Name1 = Dir    'Nächstes Verzeichnis finden
    Loop
End Sub

Private Sub Suche_Dateien(ByVal Pfad As String, ByVal Arraygrenze As Long)
'Suche nach allen XL-Dateien im angegebenen Pfad
    Dim Name2 As String
   
    Name2 = Dir(Pfad & "*.*", vbNormal)
    Do While Name2 <> ""
        If (GetAttr(Pfad & Name2) And vbNormal) = vbNormal Then
            ReDim Preserve Dateien(Arraygrenze + 1)
            'Die Ebene, die wir hier vorsorglich schon mal erweitern,
            'wird später wieder entfernt - aber erst ganz zum Schluss,
            'wenn keine weiteren Dateien gefunden wurden.
            Dateien(Arraygrenze) = Pfad & Name2
            Arraygrenze = Arraygrenze + 1
            Anzdateien = Anzdateien + 1
        End If
        Name2 = Dir()
    Loop
End Sub

Private Function Ordnerwählen(ByVal strTitle As String) As String
'Stellt ein Windows-Dialogfeld zur Verfügung, mit dem sich ein beliebiger
'Ordner auswählen läßt.
'Entweder wird dieser oder (bei Abbruch) "" zurückgeliefert.
    Dim lngIDList As Long
    Dim strBuffer As String
    Dim UserBrowseInfo As BrowseInfo
   
    With UserBrowseInfo
        .hwndOwner = 0
        .lpszTitle = lstrcat(strTitle, "")
        .ulFlags = 3
    End With
    lngIDList = SHBrowseForFolder(UserBrowseInfo)
    If (lngIDList) Then
        strBuffer = Space(260)
        SHGetPathFromIDList lngIDList, strBuffer
        strBuffer = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
        Ordnerwählen = strBuffer
    End If
End Function



Das ist aber nur eine Quick&Dirty-Methode....

(Vermutlich) sinnvoller wäre eine separate Tabelle (tbl_Ordner), in die lediglich die Pfade geschrieben werden.
Anschließend könnten per Abfragen über beide Tabellen die leeren und/oder die "gefüllten" Verzeichnisse ermittelt werden.


Wenn die Tabellen wegen sukzessiver Ausführung der Funktion nicht gelöscht werden sollen, sollten die Tabellenfelder "Dateiname" in der einen Tabelle und "Pfadname" in der zweiten  mit einem  Index (ohne Duplikate)versehen werden.


HabNeFrage

Guten Morgen DF6GL,
klingt ja wie ein Rufzeichen...  ;)

Schön das Du dich gemeldet hast.
Meine VBA-Kenntnisse.... naja reden wir nicht drüber.

Dein Vorschlag das in zwei Tabellen zu bringen klingt gut. Was ist da das bindende Glied, der Pfad, oder der Dateiname?
Ich habe ca.10000 Datein zu prüfen die sich in etwa 800 Verzeichnissen verstreuen. OK, was so kurz vor´m Frühstück.

Die Dateinamen erden nach einer vorgegebenen Syntax gebildet, diese erzeuge ich über eine Abfrage und stelle die dann zum Vergleich bereit.

Wie soll das ablaufen?
1. Prüfen ob ein Verz. vorhanden ist. (auch der Verz.Name bildet sich nach synt.Vorgaben)
2. Prüfen ob sich eine Datei im Verz. befindet. (erst mal egal wie sie heißt, muss also nur noch angepasst werden)
3. Prüfen ob der Name bereits der richtige ist, dann besteht kein Handlungsbedarf mehr. (gegenüber der Vorgabe)
Bei den Dateinamen ist ein Datum enthalten, das wollte ich NIE haben, das muss ich bei der Prüfung ignorieren, denn das kann immer ein anderes sein. Ich prüfe, ZZZZ_ZZZZZZZZ_BB_BBB_12.10.2016.pdf
Dabei steht das Z für Zahl und B für Buchstabe. Ich bekomme aber als Vergleich nur "ZZZZ_ZZZZZZZZ_BB_BBB_" bei dem Dateiformat kann es pdf, doc, xls, sein. Mir reicht aber vorerst die Syntax ohne Dateiendung.

DF6GL

Hallo,

"klingt" nicht nur so, ist eines...  ;-)

zwei Tabellen: 

tbl_Dateien
FiID (PK, Autowert)
Fi_Name  (Text) enthält Dateiname + Ext.)    z. B. ZZZZ_ZZZZZZZZ_BB_BBB_12.10.2016.pdf
Fi_Pfad   (Text)  enthält Pfadname  der Datei    z. B.  c:\MeinVerzeichnis\

tbl_Pfade
PfID (PK, Autowert)
Pf_Pfadname (Text, mit Index ohne Duplikate)


1) erledigt der Code
2) erledigt der Code
3) egal während dem Datei-Scan.  Der "Handlungsbedarf" wird später abgedeckt, um was auch immer es sich dabei handelt.

-- Datum:  keine Prüfung beim Scannen, sondern Korrektur (oder was auch immer)  nach dem kompletten Einlesevorgang.

Welche Aktionen sollen überhaupt erfolgen und was ist das insgesamte Ziel der Geschichte (Konzept)?


HabNeFrage

Hallo DF6GL,
das ist ein frommer Gedanke, nur kann ich ihn nicht umsetzen.
Mir fehlt dazu das Wissen.

Ich habe in meiner Tabelle neben der vorgegebenen Pfadangabe ein JA/NEIN Feld gesetzt und würde jetzt als erstes mal dieses setzen lassen. Ist das Verzeichnis (also die Struktur) vorhanden JA, wenn nicht NEIN.

Dann möchte ich das gleiche mit den Dateien machen. Ist eine Datei vorhanden JA, sonst NEIN.

Dann möchte ich das gleiche mit den Dateien machen. Ist die Datei (ohne dem Datum, gemäß der Vorgabe) vorhanden JA, sonst NEIN.

Es gibt also in der Tabelle mit den Vorgaben drei JA/NEIN Felder die gesetzt werden.
Ich müsste aber 6 verschiedene Pfade zum einlesen angeben in denen nachgesehen wird, im Moment ist es ja nur ein Pfad.
Wenn das zu umständlich ist, würde ich via Anf-Abfr. alle 6 Einlesevorgänge auslösen und sammeln.

Ich habe einfach keine Zeit mir ein schönes dauerhaftes Tool zu bauen, kann ich später (werde ich auch) ausbauen.
Könntest Du mir dabei bitte helfen ? Ich sehe einfach kein Land hier.


DF6GL

Hallo,

sorry, ich kann nicht folgen...

Wozu brauchst Du Ja/Nein-Felder?

ZitatIst das Verzeichnis (also die Struktur) vorhanden JA, wenn nicht NEIN.

Diese Bedingung ist obsolet. Wenn es einen Tabelleneintrag in der Ordner-Tabelle gibt, ist das Verzeichnis auch vorhanden. Deshalb und dafür wird doch der Code verwendet.

ZitatIst die Datei (ohne dem Datum, gemäß der Vorgabe) vorhanden JA, sonst NEIN.

Dito bzgl. der Datei-Tabelle.   Das Datum kann ja vor dem Speichern des Dateinamens entfernt werden, sofern die Namen-Struktur überall gleich bleibt.

ZitatEs gibt also in der Tabelle mit den Vorgaben drei JA/NEIN Felder die gesetzt werden.

Wie sieht die Tabelle konkret aus? Welche Felder sind vorhanden und wie lauten die Inhalte?  (Beispiel!)


ZitatIch müsste aber 6 verschiedene Pfade zum einlesen angeben in denen nachgesehen wird

Na und?  Dann wird der Code halt so oft durchlaufen ( die Funktion so oft aufgerufen) , wie unterschiedliche (Start-) Ordner vorhanden sind.
Heißt das zudem, in der "Vorgabetabelle" stehen die Pfad- und Dateinamen, deren Existenz geprüft werden soll?


ZitatIch sehe einfach kein Land hier.

Wenn Du meine Frage nach dem "Konzept" beantworten würdest, kämen wir vielleicht schneller zum Ziel.


ZitatIch habe einfach keine Zeit

die wir Dir jetzt spendieren sollen?



HabNeFrage

#9
So, auch ist stecke bis über beide Ohren in der Arbeit.
Nur leider komme ich nicht weiter.

Also, es soll einen Übernblick geben wo Mitarbeiter noch Dateien liefern müssen um eine Dokumentation zu erstellen.

Dazu gibt es eine Exceltabelle (wie ich die liebe) in der mal der eine mal der andere wie er halt Lust hat in einem Feld
eine 1 einträgt wenn er Dateien in dem Ordner abgelegt hat. Leider haben die oft nicht die Bezeichnung
die sie eigentlich haben müssen. Die Syntax ergibt nach bestimmten Vorgaben, auch die liegt als Zusammenstellung
in einer Abfrage vor (aber ohne dem besagten Datum). Geht es da nicht ein * dafür einzutragen? z.B. 1234_12345678_AB_ABC_*.PDF
Ich habe eine Abfrage (ACC) in der ich die Syntax zusammenfahre und als Vergleich hätte.
Jetzt weiß ich aber nicht, ob wirklich alle Verz. schon erzeugt wurden, somit können die MA auch nix darin ablegen.

Deswegen will ich erst mal fix drüber schauen ob alle Verz. existieren. Wenn nicht lege ich sie an.

Leider ist es eine extrem verzweigte Struktur, so das ich hier nix mit Hand machen kann, oder eben nur wenig.
Ich kann aber nicht ganz oben in den Baum gehen, sondern muss die 6 verschiedenen Pfade angeben.
Um den MA einen Überblick zu geben soll eine Pivottabelle alle 11 Verz. auflistet, und dort wo noch was offen ist dies darstellen.
Oder besser noch einen der drei Möglichkeiten anzeigt. " erledigt" , "bearbeiten" , "ohne Daten".
Alle Equipments haben diese 11 Verzeichnisse (heißen alle gleich) die befüllt sein müssen.

Die MA können auf ihren Bereich filtern und wissen wo noch was zu tun ist.
Dafür benötige ich das ganze.

Beispiel:
A_Vorgabe
Pfad \\server1\Verz1\Verz2\...\Verz5

Dateiname 1234_12345678_AB_ABC_.pdf

T_ausgelesene_Daten
Pfad \\server1\Verz1\Verz2\...\Verz5
Dateiname 1234_12345678_AB_ABC_14.02.2016.pdf

Hier ist alles io. denn wenn ich das Datum weg lasse stimmt alles.

crystal

Hallo,

nur prinzipiell würde ich Verzeichnis-Strukturen eher mit FSO (FileSystemObject) einlesen.
Google einfach mal "subdir fso".
Mit fso kannst du fehlende Verzeichnisse auch anlegen.

lg
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

HabNeFrage

Hallo crystal,
Danke für deine Hilfe.
Ich schaue mal.
Am Ende brauche ich aber die Auswertung...

HabNeFrage

#12
Habe jetzt mal etwas versucht:
in einmem Modul folgenden Code hinterlegt

' Prüfen, ob ein Ordner existiert
Public Function FolderExists(ByVal sFolder As String) As Boolean
  ' Deklaration des FileSystemObjects
  Dim oFSO As New FileSystemObject

  FolderExists = oFSO.FolderExists(sFolder)
End Function


Dann in einer Abfrage folgendes eingetragen:
vorhanden: Wenn(FolderExist([Link]);1;0)

Dabei ist Link das Feld in dem der Vorgabelink steht. Das Feld Vorhanden sollte nur Ja oder Nein, bzw. 1 oder 0 bringen.
Das hätte ich dann in eine Aktualisierungsabfrage gebracht und mir die JA/NEIN Felder befüllt.
Hierbei bekomme ich aber immer die Meldung das FolderExists unbekannt.

Habe übrigens "Microsoft Scripting Runtime" aktiviert.

Ich kann mich entsinnen, das ich vor langer Zeit auch mal einen VBA-Code in der Form hinterlegt hatte
und dann einen Wahrheitswert bekommen hatte, weiß aber nicht mehr was das war.
Mußte da auch das betreffende Feld in die ([Klammern]) bringen.

Der Code hier soll wohl dann so ausgewertet werden:
' Prüfen, ob Ordner "c:\test" existiert
If FolderExists("c:\test") Then
  MsgBox "Ordner ist vorhanden."
End If


Ich muß aber auf eine Tabelle (ein Feld) mich beziehen und ne ganze Latte abfragen.

DF6GL

Hallo,

ob mit fso oder DIR() ist nicht Thema, höchstens ein Parallel-Plan


Wenn Du das Datum nicht brauchen kannst, dann schneid es halt weg:

Dim strFN as String, strExt as String

strExt= Mid(Dateien(i) ,InstRev(Dateien(i),".")
strFN = Left(Dateien(i),InstRev(Dateien(i),"_")
strFN=strFN & ext
!DateiName = strFN

crystal

Hallo,

nochmal zum Verständnis.
Du willst prüfen, ob Dateien in richtigen Verzeichnissen mit richtigen Namen (jeweils vorgegebene Syntax) vorhanden sind, also im Nachhinein.

Wieso gibst du den Mitarbeitern nicht eine Vorgabe, welches Verzeichnis und welche Namen sie verwenden sollen?

Ich nehme an, dass sich in ZZZZ_ZZZZZZZZ_BB_BBB ja irgendwelche Projekt- oder Vorgangs-Kennzeichen verbergen. Wenn nun ein neuer Vorgang gestartet wird, kannst du doch
1. ein entspr. Verzeichnis anlegen (oder mehrere auf verschiedenen Servern) und
2. in eine Tabelle die erwarteten Dateinamen eintragen.
3. Wenn ein MA dann eine Datei speichern möchte, schaut er in der Tabelle mit den erwarteten Namen nach und trägt dort seinen Dateinamen (inkl. Datum) ein.
4. Somit wäre auch für andere sichtbar, dass eine solche Datei bereits gespeichert wurde.

Naja - schwierig, weil ich mir die Abläufe nicht so richtig vorstellen kann. Daher beschränke ich mich hier auf die Grundidee, aktiv Hilfsmittel bereitzustellen, damit MAs im Vorhinein richtige Datei- und Verzeichnis-Namen verwenden (evtl. sogar als Papier-Tabelle), statt dies nachträglich zu prüfen.

Ich könnte mir vorstellen, dass es bei dir um die Prüfung bestimmter Vorgänge oder Gegenstände geht, bei der jeweils verschiedene MA ihre Stellungnahme/Beurteilung abgeben müssen. Ich persönlich würde es bevorzugen, den MAs dann eine entspr. Information vorab zu geben, als sie nachträglich zu kontrollieren. Mit einer solchen Vorab-Information (als Tabelle) hättest du dann auch noch andere Möglichkeiten (Vorgang gelesen, Vorgang akzeptiert, Vorgang begonnen, Vorgang beendet, Vorgang delegiert usw).

Oder du müsstest mal erklären, wie MAs vorgehen sollen, wenn sie eine Datei speichern wollen und was passiert, wenn die passende Verzeichnis-Struktur noch nicht existiert. Wo verbleiben diese Dateien?

lg
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...