Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1704to1708
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

pdf sortieren und Ordner erstellen via VBA Teil 2

pdf sortieren und Ordner erstellen via VBA Teil 2
30.07.2019 01:53:13
Tom
Hallo zusammen,
leider kann ich nicht mehr auf meinen alten Beitrag antworten, daher erstelle ich jetzt einen neuen.
Franz (oder auch fcs), erstmal vielen Dank fuer deine Hilfe. Ich hoffe mein Dank erreicht dich auf irgendeine Weise.
Franz hat mir folgenden Code geschrieben:
--------------------------------------------------------

Sub PDF_Sortieren()
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim wksFiles As Worksheet, wkbFiles As Workbook
Dim lngZei As Long
Dim sNeu As String
Dim bolMove As Boolean
Dim varFolder As Variant
Dim sPS As String
sPS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Bitte Ordner mit den PDF-Dateien auswählen"
If .Show = -1 Then
varFolder = .SelectedItems(1)
Else
Exit Sub
End If
End With
Set objFSO = VBA.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.getFolder(varFolder)
Set wkbFiles = ActiveWorkbook
Set wksFiles = wkbFiles.Worksheets("Liste")
With wksFiles
lngZei = .Cells(.Rows.Count, 1).End(xlUp).Row
If lngZei > 3 Then
.Range(.Rows(4), .Rows(lngZei)).ClearContents
End If
End With
lngZei = 3
For Each objFile In objFolder.Files
If LCase(VBA.Right(objFile.Name, 3)) = "pdf" Then
If Len(objFile.Name) >= 14 Then
'            If IsNumeric(Left(Right(objFile.Name, 14), 10)) Then
lngZei = lngZei + 1
wksFiles.Cells(lngZei, 1) = "'" & objFile.Name
wksFiles.Cells(lngZei, 2) = objFile.Datelastmodified
wksFiles.Cells(lngZei, 3) = "'" & Left(Right(objFile.Name, 14), 10)
wksFiles.Cells(lngZei, 4) = "'" & Left(Right(objFile.Name, 14), 10) & " " _
& Format(objFile.Datelastmodified, "YYYY-MM-DD")
'            End If
End If
End If
Next
If lngZei > 3 Then
If lngZei > 4 Then
With wksFiles
.Columns.AutoFit
With .Range(.Cells(3, 1), .Cells(lngZei, 5))
.Sort key1:=.Range("D1"), order1:=xlAscending, _
key2:=.Range("A1"), Order2:=xlAscending, Header:=xlYes
End With
End With
End If
With wksFiles
For lngZei = 4 To .Cells(.Rows.Count, 1).End(xlUp).Row
If sNeu  varFolder & sPS & .Cells(lngZei, 4).Text Then
sNeu = varFolder & sPS & .Cells(lngZei, 4).Text
If Dir(sNeu, vbDirectory)  "" Then
bolMove = False
MsgBox "Verzeichnis """ & sNeu & """ ist bereits vorhanden"
Else
bolMove = True
VBA.MkDir Path:=sNeu
End If
End If
If bolMove = True Then
Set objFile = objFSO.getfile(varFolder & sPS & .Cells(lngZei, 1).Text)
objFile.Move sNeu & sPS & objFile.Name
.Cells(lngZei, 5).Value = "verschoben"
Else
.Cells(lngZei, 5).Value = "Verzeichnis vorhanden"
End If
Next
End With
Else
MsgBox "keine PDF-Dateien gefunden, die verschoben werden"
End If
wksFiles.Cells(1, 2) = varFolder
wksFiles.Activate
End Sub

------------------------------------------------
Ziel war es, pdf Dateien in einem Quellordner abzuspeichern und anhand des Namens (Name aus 14 Zeichen, wo nur die letzten 10 Zahlen genommen werden) und des Erstelldatums in neue Unterordner zu sortieren. Die sortierten Ordner werden zusaetzlich noch in einer Excelliste abgelegt.
Das Ergebnis sieht dann in etwas wie folgt aus:
1027779802 2019-07-15
1028020928 2019-07-26
1027966518 2019-07-26
1028020933 2019-07-26
1028020933 2019-07-29

Meine Idee war es zusaetzlich Dopplungen zu erkennen bzw. zu vermeiden. Dies gelingt allerdings nur wenn ich doppelte Dateien am gleichen Tag im Quellordner ablege. Lege ich schon vorhandene Dateien an spaeteren Tagen ab wird ein neuer Ordner gebildet (siehe Beispiel fettgedruckt)
Frage 1: Wie schaffe ich es meinen Code so anzupassen, dass nur die Nummer (unabhaengig vom Datum) ueberprueft wird und eine Fehlermeldung angezeigt wird?
(Beispiel fettgedruckt: Der Ordner 1028020933 existiert bereits)
Frage 2: Ich habe festgestellt dass es auch 7- bzw. 10-stellige Zahlenkombinationen geben kann. Kann ich einfach Teile des Codes kopieren und anpassen? Wenn ja welche?
Frage 3: Die erstellten Ordner werden in einer Excel gepflegt. So wie der Code jetzt funktioniert, ueberschreibt er die Daten in der Excel bei neuer Anwendung. Wie schaffe ich es, dass die Liste fortgefuehrt wird.
Ich bedanke mich schon einmal fuer die Unterstuetzung!!
Viele Gruesse aus Australien,
Tom

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: pdf sortieren und Ordner erstellen via VBA Teil 2
30.07.2019 13:10:15
fcs
Hallo Tom,
zu Frage 1 und 3 hab ich das Makro angepasst.
vorhandene Liste wird nicht mehr gelöscht und die Prüfungen beim Abarbeiten der Liste sind angepasst.
zu Frage 2 - verschiedene Längen des Ordnernamens.
Wenn die Länge des Ordnernamens im Dateinamen anders ist, dann musst du in einer Kopie des Makros den Abschnitt für das Einlesen der Dateinamen anpassen.
Für Länge 7 wird 10 zu 7 und 14 zu 11.
Zur einfacheren Anpassung könnte man hier auch mit zwei Variablen arbeitn.
Herzlich Grüße aus Bayern nach Down Under.
Franz
Sub PDF_Sortieren()
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim wksFiles As Worksheet, wkbFiles As Workbook
Dim lngZei As Long
Dim sNeu As String
Dim bolMove As Boolean
Dim varFolder As Variant
Dim sPS As String
sPS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Bitte Ordner mit den PDF-Dateien auswählen"
If .Show = -1 Then
varFolder = .SelectedItems(1)
Else
Exit Sub
End If
End With
Set objFSO = VBA.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.getFolder(varFolder)
Set wkbFiles = ActiveWorkbook
Set wksFiles = wkbFiles.Worksheets("Liste")
With wksFiles
lngZei = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
'Einlesen der PDF-Dateinamen im ausgewählten Ordner
For Each objFile In objFolder.Files
If LCase(VBA.Right(objFile.Name, 3)) = "pdf" Then
If Len(objFile.Name) >= 14 Then
'            If IsNumeric(Left(Right(objFile.Name, 14), 10)) Then
lngZei = lngZei + 1
wksFiles.Cells(lngZei, 1) = "'" & objFile.Name
wksFiles.Cells(lngZei, 2) = objFile.Datelastmodified
wksFiles.Cells(lngZei, 3) = "'" & Left(Right(objFile.Name, 14), 10)
wksFiles.Cells(lngZei, 4) = "'" & Left(Right(objFile.Name, 14), 10) & " " _
& Format(objFile.Datelastmodified, "YYYY-MM-DD")
'            End If
End If
End If
Next
If lngZei > 3 Then
With wksFiles
.Cells(1, 2).ClearContents
.Columns.AutoFit
If lngZei > 4 Then
With .Range(.Cells(3, 1), .Cells(lngZei, 5))
.Sort key1:=.Range("D1"), order1:=xlAscending, _
key2:=.Range("A1"), Order2:=xlAscending, Header:=xlYes
End With
End If
For lngZei = 4 To .Cells(.Rows.Count, 1).End(xlUp).Row
If .Cells(lngZei, 5).Text = "" Then
If sNeu  varFolder & sPS & .Cells(lngZei, 4).Text Then
sNeu = varFolder & sPS & .Cells(lngZei, 4).Text
If Dir(varFolder & sPS & .Cells(lngZei, 3).Text _
& " ?-?-?", vbDirectory)  "" Then
bolMove = False
MsgBox "Verzeichnis """ & varFolder & sPS & .Cells(lngZei, 3).Text _
& " ?-?-?" & """ ist bereits vorhanden"
Else
bolMove = True
VBA.MkDir Path:=sNeu
End If
End If
If bolMove = True Then
Set objFile = objFSO.getfile(varFolder & sPS & .Cells(lngZei, 1).Text)
objFile.Move sNeu & sPS & objFile.Name
.Cells(lngZei, 5).Value = "verschoben"
Else
.Cells(lngZei, 5).Value = "Verzeichnis vorhanden"
End If
End If
Next
End With
Else
MsgBox "keine PDF-Dateien gefunden, die verschoben werden"
End If
wksFiles.Cells(1, 2) = varFolder
wksFiles.Activate
End Sub

Anzeige

312 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige