Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1844to1848
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-Seitenanzahl zählen

PDF-Seitenanzahl zählen
06.09.2021 09:20:51
Markus
Dieser Programmcode funktioniert für ein Einzel ausgewähltes Verzeichnis!
Sub Test()
Dim I As Long
Dim xRg As Range
Dim xStr As String
Dim xFd As FileDialog
Dim xFdItem As Variant
Dim xFileName As String
Dim xFileNum As Long
Dim RegExp As Object
Set xFd = Application.FileDialog(msoFileDialogFolderPicker)
If xFd.Show = -1 Then
xFdItem = xFd.SelectedItems(1) & Application.PathSeparator
xFileName = Dir(xFdItem & "*.pdf", vbDirectory)
Set xRg = Range("A1")
Range("A:B").ClearContents
Range("A1:B1").Font.Bold = True
xRg = "File Name"
xRg.Offset(0, 1) = "Pages"
I = 2
xStr = ""
Do While xFileName ""
Cells(I, 1) = xFileName
Set RegExp = CreateObject("VBscript.RegExp")
RegExp.Global = True
RegExp.Pattern = "/Type\s*/Page[^s]"
xFileNum = FreeFile
Open (xFdItem & xFileName) For Binary As #xFileNum
xStr = Space(LOF(xFileNum))
Get #xFileNum, , xStr
Close #xFileNum
Cells(I, 2) = RegExp.Execute(xStr).Count
I = I + 1
xFileName = Dir
Loop
Columns("A:B").AutoFit
End If
End Sub Ich habe diesen Programmcode in den unten folgenden Code integriert.
Mit diesem Programm kann ich ein übergeordnetes Verzeichnis auswählen und VBA schreibt für jede Datei in alle untergeordneten Verzeichnisse eine Excel-Zeile (Spalte A mit Pfad, Spalte B mit Dateinamen)!
Dadurch kann ich die jeweiligen Pfadlängen berechnen, um zu lange Dateinamen zu vermeiden.
Zusätzlich möchte ich für jede PDF-Datei in Spalte C die Anzahl der Seiten eines PDF-Dokumentes auflisten lassen.
Das funktioniert leider nicht. In Spalte C wird immer nur der Wert 0 eingetragen. Das heißt, die Werte werden in die richtige Spalte C geschrieben, aber in meinem Code nicht richtig ermittelt. Die Variablen ab dem Open-Befehl werden nicht richtig ausgelesen.
Hat jemand eine Idee, was ich falsch mache, bzw. wie ich dieses Problem noch lösen kann.
Ich habe leider nur Grundkenntnisse in VBA.
Vielen Dank für Eure Bemühungen.

Private Sub MWReadSubFolder(ByVal sPath As String)
Dim oFSO As Object
Dim oFolder As Object
Dim oSubFolder As Object
Dim oFile As Object
'Dim von PDF-Seiten Programm
Dim I As Long
Dim xRg As Range
Dim xStr As String
Dim xFd As FileDialog
Dim xFdItem As Variant
Dim xFileName As String
Dim xFileNum As Long
Dim RegExp As Object
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(sPath)
With oSheet
For Each oSubFolder In oFolder.subfolders
'Alle Dateien auflisten
For Each oFile In oSubFolder.Files
.Cells(lRowCounter, 1) = oSubFolder.Path
.Cells(lRowCounter, 2) = oFile.Name
'von PDF-Seiten Programm
Set RegExp = CreateObject("VBscript.RegExp")
RegExp.Global = True
RegExp.Pattern = "/Type\s*/Page[^s]"
xFileNum = FreeFile
Open (oSubFolder.Path & oFile.Name) For Binary As #xFileNum	Ab hier werden keine Werte mehr in die
xStr = Space(LOF(xFileNum))					Variablen geschrieben!
Get #xFileNum, , xStr
Close #xFileNum
.Cells(lRowCounter, 3) = RegExp.Execute(xStr).Count
lRowCounter = lRowCounter + 1
.Cells(1, 3) = lRowCounter - 3
Next oFile
'Alle Unterverzeichnisse verarbeiten (rekursiv)
Call MWReadSubFolder(oSubFolder.Path)
Next oSubFolder
End With
Set oFSO = Nothing
Set oFile = Nothing
Set oFolder = Nothing
Set oSubFolder = Nothing
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: PDF-Seitenanzahl zählen
06.09.2021 14:42:28
Nepumuk
Hallo Markus,
teste mal:

Option Explicit
Public Sub PDF_Info()
Dim strFileName As String, strFolder As String
Dim lngRow As Long
Dim astrFolders() As String
Dim ialngFolders As Long
Dim objFileDialog As FileDialog
Set objFileDialog = Application.FileDialog(fileDialogType:=msoFileDialogFolderPicker)
With objFileDialog
If .Show Then strFolder = .SelectedItems(1) & "\"
End With
Set objFileDialog = Nothing
If strFolder  vbNullString Then
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
.DisplayStatusBar = True
End With
astrFolders = GetFolders(strFolder)
lngRow = 1
With Tabelle1
With .Cells(lngRow, 1).Resize(1, 2)
Call .EntireColumn.Clear
.Value = Array("Dokument", "Seiten")
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With
For ialngFolders = LBound(astrFolders) To UBound(astrFolders)
strFileName = Dir$(astrFolders(ialngFolders) & "*.pdf")
Do Until strFileName = vbNullString
Application.StatusBar = strFileName
lngRow = lngRow + 1
.Cells(lngRow, 1).Resize(1, 2).Value = Array(strFileName, _
GetPageCount(astrFolders(ialngFolders) & strFileName))
strFileName = Dir$
Loop
Next
Call .Columns(1).AutoFit
End With
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.StatusBar = False
End With
End If
End Sub
Private Function GetPageCount(ByVal pvstrFileName As String) As Long
Dim strText As String
Dim strLinearized As String, astrCount() As String
Dim ialngIndex As Long
Dim objFileSystemObject As Object, objTextFile As Object
Dim objRegEx As Object, objMatch As Object, objItem As Object
Dim blnFound As Boolean
GetPageCount = -1
Set objFileSystemObject = CreateObject(Class:="Scripting.FileSystemObject")
Set objTextFile = objFileSystemObject.OpenTextFile(pvstrFileName, 1, False, 0)
Do Until objTextFile.AtEndOfStream
strText = objTextFile.ReadLine
strText = Replace(strText, vbLf, vbNullString)
If InStr(1, strText, "/Linearized") > 0 Then
If Len(strText) > 20 Then
strLinearized = strText
blnFound = True
Exit Do
End If
End If
If InStr(1, strText, "/Count ") > 0 Then
ReDim Preserve astrCount(ialngIndex)
astrCount(ialngIndex) = strText
ialngIndex = ialngIndex + 1
blnFound = True
End If
Loop
Call objTextFile.Close
Set objTextFile = Nothing
Set objFileSystemObject = Nothing
If blnFound Then
Set objRegEx = CreateObject(Class:="VBScript.RegExp")
With objRegEx
.MultiLine = True
.Global = True
.IgnoreCase = False
If strLinearized  vbNullString Then
.Pattern = "\/N.?(\d+).?"
Set objMatch = .Execute(strLinearized)
If objMatch.Count > 0 Then _
GetPageCount = CLng(objMatch(0).SubMatches(0))
Else
If ialngIndex = 1 Then
.Pattern = "\/Count.?(\d+)"
Set objMatch = .Execute(astrCount(0))
If objMatch.Count = 1 Then
GetPageCount = CLng(objMatch(0).SubMatches(0))
Else
For Each objItem In objMatch
GetPageCount = WorksheetFunction.Max( _
GetPageCount, CLng(objItem.SubMatches(0)))
Next
End If
Else
.Pattern = "\/Count.?(-?\d+)"
For ialngIndex = 0 To UBound(astrCount)
Set objMatch = .Execute(astrCount(ialngIndex))
If objMatch.Count = 1 Then GetPageCount = WorksheetFunction.Max( _
GetPageCount, CLng(objMatch(0).SubMatches(0)))
Next
End If
End If
End With
Set objMatch = Nothing
Set objRegEx = Nothing
End If
End Function
Ich habe aber PDF's die sich nicht auslesen lassen.
Gruß
Nepumuk
Anzeige
AW: PDF-Seitenanzahl zählen
09.09.2021 13:29:26
Markus
Hallo Nepumuk,
erstmal vielen Dank für Deine Mühe.
Ich habe die Antwort leider erst heute gesehen, da sie in den Spamordner verschoben wurde.
Ich schaue mir Deine Lösung mal in Ruhe an und melde mich dann wieder.
Hoffe, das ich am Wochenende dazu komme.
Gruß Markus
AW: PDF-Seitenanzahl zählen
13.09.2021 08:42:51
Markus
Hallo Nepumuk,
ich habe mich am Wochenende mal mit dem Programmcode beschäftigen können.
Leider bin ich nicht weit gekommen.
Beim Ausführen des Codes bekomme ich folgende Fehelrmeldung:
Fehler beim Kompilieren:
Sub oder Function nicht definiert
Die Meldung bezieht sich auf die Programmzeile
astrFolders = GetFolders(strFolder)
Muss ich hier noch irgendetwas beachten?
Ich komme da leider nicht weiter, da meine Kenntnisse dafür nicht ausreichen.
Gruß Markus
ruß Markus
Anzeige
AW: PDF-Seitenanzahl zählen
13.09.2021 09:24:11
Nepumuk
Hallo Markus,
Ooops, habe ich versehentlich nicht mit kopiert. Hier die Funktion:

Private Function GetFolders(ByVal pvstrPath As String) As String()
Dim astrFolders() As String
Dim strFolder As String, strPath As String
Dim ialngIndex1 As Long, ialngIndex2 As Long
ReDim Preserve astrFolders(ialngIndex1)
astrFolders(ialngIndex1) = pvstrPath
ialngIndex1 = 1
ialngIndex2 = 1
strPath = pvstrPath
Do
strFolder = Dir$(PathName:=strPath & "*", Attributes:=vbDirectory)
Do Until strFolder = vbNullString
If strFolder  "." And strFolder  ".." Then
If GetAttr(PathName:=strPath & strFolder) And vbDirectory Then
ReDim Preserve astrFolders(0 To ialngIndex1)
astrFolders(ialngIndex1) = strPath & strFolder & "\"
ialngIndex1 = ialngIndex1 + 1
End If
End If
strFolder = Dir$
Loop
If ialngIndex1 = ialngIndex2 Then Exit Do
strPath = astrFolders(ialngIndex2)
ialngIndex2 = ialngIndex2 + 1
Loop
GetFolders = astrFolders
End Function
Gruß
Nepumuk
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige