Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1848to1852
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 Import Seitenzahl variabel

PDF Import Seitenzahl variabel
27.09.2021 16:26:47
Jürgen
Servus Zusammen,
ich muss immer wieder PDF-Seiten importieren und entsprechend anpassen. Nun habe ich den Import schon soweit automatisiert, dass ich die Tabellen aus dem PDF weiterverarbeiten kann. Leider laufe ich mit unter auf das Problem, dass die PDF´s unterschiedliche Seitenzahlen haben. Ich möchte jetzt den Import so anpassen, dass dieser pro gefundener Seite einmal durchläuft und mir die entsprechende Seite importiert.
Dies ist mein aktueller Code, zum testen. Hier habe ich aber Fehler beim setzen der Variablen drin und weiß nicht wo und wie ich die Seitenzahl übergeben kann:

Sub PDF_Import_Mehrere_Seite()
Dim strDatei As String
Dim strDateiUndPfad As String
Dim objQR As Object
Dim rngZelle As Range
Dim intSpalteArtikelNrPDF As Integer
Dim strArtikelNrPDF As String
Dim intZeileMaxBasisTabelle As Integer
Dim intZeilePOS As Integer
Dim intZählerPOS As Integer
Dim strSeitenZähler As String
Dim intSeitenZähler As Integer
strDateiUndPfad = Application.GetOpenFilename("PDF Dateien (*.pdf), *.pdf", Title:="Bitte wählen Sie die Import-Datei aus.")
If strDateiUndPfad Like "*pdf*" Then
strDatei = strDateiUndPfad
strPfad = Left(strDateiUndPfad, InStrRev(strDateiUndPfad, "\"))
Else
MsgBox "Es wurde keine gültige PDF Datei ausgewählt!"
End
End If
Workbooks.Add
Set wbkNeueStückliste = ActiveWorkbook
Set wshStücklisteBasis = ActiveSheet
wshListeBasis.Name = "Basis_Import"
For intSeitenZähler = 1 To 4 'nur zum Testen fest. Ansonsten über ausgelesene Seitenzahl
strSeitenZähler = Format(intSeitenZähler, "000")
'Merker:
'Im Moment bezieht sich alles auf die erste Seite
'Hier muss die Page angepasst werden
ActiveWorkbook.Queries.Add Name:="Page" & strSeitenZähler, Formula:= _
"let" & Chr(13) & "" & Chr(10) & "    Quelle = Pdf.Tables(File.Contents(""" & strDateiUndPfad & """), [Implementation=""1.3""])," & Chr(13) & "" & Chr(10) & "    Page1 = Quelle{[Id=""Page""" & strSeitenZähler & """]}[Data]," & Chr(13) & "" & Chr(10) & "    Oberste4ZeilenEntfernen = Table.Skip(Page1,4)," & Chr(13) & "" & Chr(10) & "    ÜberschriftErsteZeile = Table.PromoteHeaders(Oberste4ZeilenEntfernen, [PromoteAllScalars" & _
"=true])" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    ÜberschriftErsteZeile" & ""
ActiveWorkbook.Worksheets.Add
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Page001 ;Extended Properties=""""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Page" & strSeitenZähler & "]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Page" & strSeitenZähler
.Refresh BackgroundQuery:=False
End With
Next intSeitenZähler
End Sub
Ich hoffe Ihr könnt mir helfen. Die Seitenzahl wird über ein weiteres Makro ausgelesen. Der Import soll nun Seite für Seite importieren. Danach komme ich selbst weiter.
Vorab schon besten Dank und viele Grüße Jürgen

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: PDF Import Seitenzahl variabel
27.09.2021 18:47:00
Oberschlumpf
Hi Jürgen,
"Bitte wählen Sie die Import-Datei aus."
Welche Bsp-Import-Datei können wir denn auswählen?
Ciao
Thorsten
AW: PDF Import Seitenzahl variabel
28.09.2021 04:08:56
Jürgen
Hallo Torsten,
hierbei handelt es sich um PDF Dateien im Tabellenformat. Enthalten sind unterschiedliche Artikel eines Kunden mit den entsprechenden Spezifikationen.
Ich habe den Code vollständig gepostet um den Ablauf zu verdeutlichen.
Im Wesentlichen geht es um die Abfrage. Ich kann die Abfrage für eine Seite, für zwei Seiten, für drei Seiten usw. Aber eben nur "hart codiert". Ich möchte das ganze aber variabel haben.
Hier ein Beispiel für eine Seite:

ActiveWorkbook.Queries.Add Name:="Page001", Formula:= _
"let" & Chr(13) & "" & Chr(10) & "    Quelle = Pdf.Tables(File.Contents(""" & strDateiUndPfad & """), [Implementation=""1.3""])," & Chr(13) & "" & Chr(10) & "    Page1 = Quelle{[Id=""Page001""]}[Data]," & Chr(13) & "" & Chr(10) & "    Oberste4ZeilenEntfernen = Table.Skip(Page1,4)," & Chr(13) & "" & Chr(10) & "    ÜberschriftErsteZeile = Table.PromoteHeaders(Oberste4ZeilenEntfernen, [PromoteAllScalars" & _
"=true])" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    ÜberschriftErsteZeile" & ""
ActiveWorkbook.Worksheets.Add
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Page001;Extended Properties=""""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Page001]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Page001"
.Refresh BackgroundQuery:=False
End With
Wenn ich den Makro Recorder anschmeiße und einen Import für zwei, drei oder vier Seiten mache, dann ändern sich folgende Code Zeilen:

ActiveWorkbook.Queries.Add Name:="Page001", Formula:= _
ActiveWorkbook.Queries.Add Name:="Page002", Formula:= _

Page1 = Quelle{[Id=""Page001""]}[Data],
Page1 = Quelle{[Id=""Page002""]}[Data],
sowie:

"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Page001;Extended Properties=""""" _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Page002;Extended Properties=""""" _
und

.CommandText = Array("SELECT * FROM [Page001]")
.CommandText = Array("SELECT * FROM [Page002]")
Wobei brauche ich nun Hilfe?
Ich muss diese Page001, Page002-Angaben variabel gestalten.
Ich weiß jedoch nicht wie? Wie kann ich der Abfrage die Nummer als Variable übergeben oder die Seite als String.
Wie du siehst habe ich einen Teil schon probiert, bekomme aber immer wieder Fehlermeldungen.
Deshalb habe ich auf Hilfe gehofft und für ein besseres Verständnis den kompletten Code hier gepostet.
Viele Grüße
Jürgen
Anzeige
AW: PDF Import Seitenzahl variabel
28.09.2021 07:06:20
ralf_b
dann ersetze den Text Page:irgendwas doch durch eine Variable. Das das alles Textketten sind, kannst du diese auch selbst zusammensetzen. Berücksichtige das die doppelten Anführungsstriche eine kleine Hürde darstellen könnten weil Sonderzeichen in Textketten.
AW: PDF Import Seitenzahl variabel
29.09.2021 07:13:33
Jürgen
Vielen Dank für Eure Antworten, genau das ersetzen mit den Anführungszeichen bereitet mir ja Probleme.
Hier hat das schon geklappt:

ActiveWorkbook.Queries.Add Name:=strSeitenzahl, Formula:= _
Und hier auch:

.CommandText = Array(strSelectundSeite)
Aber hier bekomme ich immer wieder Fehlermeldungen:

Page1 = Quelle{[Id=""Page001""]}[Data],
Page1 = Quelle{[Id=""Page002""]}[Data],

"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Page001;Extended Properties=""""" _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Page002;Extended Properties=""""" _
Vielleicht kann mir doch noch jemand helfen der sich mit dem PowerQuerry in VBA auskennt.
Viele Grüße
Jürgen
Anzeige
AW: PDF Import Seitenzahl variabel
29.09.2021 19:32:39
Yal
Moin Jürgen,
kurz mal nachgefragt: dass der Kunde die Anforderung über eine PDF ermittelt, kann wegen der nicht Änderbarkeit nachvollziehbar sein, aber könnte nicht der Kunde zusätzlich die Quelle in Excel-Form ermitteln? Er hat irgendwo ein Interesse, dass die Behandlung seiner Bestellung günstig bleibt...
Ansonsten, Power Query in VBA: keine Hexenwerk, es werden nur Text übermittelt. PQ macht dann was daraus.
Also überall, wo Page001 auftaucht, einen

Replace ( ..., "Page001", "Page" & strSeitenzahl)
einsetzen.
VG
Yal
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige