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
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.
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)
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.
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.
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.
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)?
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.
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?
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.
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
Hallo crystal,
Danke für deine Hilfe.
Ich schaue mal.
Am Ende brauche ich aber die Auswertung...
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.
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
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
Zitat von: crystal am November 08, 2016, 19:56:52
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.
DER WAR GUT ! ;D ich krig mich nicht mehr ein.... würde ich eig. sagen wenn es nicht so ernst wäre und ich in einer saublöden zeitlichen Lage wäre.
Deine Worte in den Ohren der MA !!! Vergiss es, ich bin der der gegen Mühlen kämpft. Der der eine vor die Nuss bekommt weil die Kumpels draußen so einen Mist verzapfen. In der waren Welt fragt keiner wer wirklich das Ding verzapft hat, der nächstliegende bekommt den Hammer.... fertig. Aber das aus zu diskutieren, habe ich längst aufgegeben.
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
Ja das ist so ähnlich.
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.
Da hast Du im Prinzip Recht, nur hält sich niemand dran. Dateien werden einfach rein kopiert und fertig. Dummer Weise hat man sich gedacht, das wird dann schon korrigiert. Die Leute sehen ja wie es sein muss, gehen ja oft genug in die bereits erledigten Fälle. Alter.... ich brauch ne Lösung, über Sinn und Unsinn hier zu diskutieren, vergiss es. Es gibt niemanden hier der mich dahingehend unterstützt. Das eine saubere Datengrundlage einfach ein schnelles arbeiten ermöglicht... komm ich muss.
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
Danke das Du dir die Zeit genommen hast.
Es handelt sich um ein Projekt das SEHR schlecht vorbereitet wurde. Keiner dabei war der Dateibezeichnungen, Pfadlängen usw. überhaupt berücksichtigt hat. Hier hast du ein Klumpen Ton, mach Gold daraus.... so komme ich mir hier vor.
Glücklicher weise gibt es so etwas die Renamer "https://www.advancedrenamer.com/" der hat mir schon irre geholfen das Verzeichniscaos aufzuräumen.
Und jetzt will ich die "saubere Struktur" mit deren Pfaden prüfen und die Dateien anpassen.
Hallo, hier gehts um ca.9000 Equipments, nix was mal so vor dem Kaffe fertig wird.
Und jetzt der Witz des Jahres (nicht des Tages) das ganze MUSS bis 19.12. diesen Jahres Clean sein. Noch Fragen?!
Hast Du einmal gezeigt das man scheinbar unmögliches hin bekommen kann, dann bist du derjenige der den Tisch voll bekommt. Ob da schon was liegt, ja mei, machste danach, los das muß fertig werden die GL zählt auf sie.... :o SCHEI?E, >:(