Dopo molte prove ho concluso che importare tabelle sulla base del loro indice rischia di essere inaffidabile, perche' sui documenti l'indice comprende anche la pagina, e non ho individuato un criterio in grado di leggere questa informazioni da vba.
Propongo quindi una ipotesi alternativa, che importa le "pagine", anzi (in questa versione) le pagine selezionate.
Il codice complessivo:
- Codice: Seleziona tutto
Sub PdfPages()
Dim myPdf As String, pArr, RndPre As String
Dim DeSh As Worksheet, ErrMess As String
'
'Scelta del file
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Scegli il File da importare"
.InitialFileName = "C:\prova\" '<<< La directory di partenza
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Pdf files", "*.pdf"
.Show
If .SelectedItems.Count = 0 Then
MsgBox ("Nessuna voce selezionata, processo abortito")
Exit Sub
End If
myPdf = .SelectedItems.Item(1)
End With
'
pArr = Array("Page001", "Page003", "Page005") '<<< Le Pagine da importare
'
RndPre = Format(Now, "MMSS_")
Debug.Print RndPre & ">>>", myPdf, "Items: " & (UBound(pArr) + 1)
'
'Kill query in conflitto:
For I = ActiveWorkbook.Queries.Count To 1 Step -1
If IsError(Application.Match(ActiveWorkbook.Queries(I).Name, pArr, False)) Then
Debug.Print "Keep: " & ActiveWorkbook.Queries(I).Name, I
Else
Debug.Print "Killed--: " & ActiveWorkbook.Queries(I).Name, I
ActiveWorkbook.Queries(I).Delete
End If
Next I
'
'Crea ed esegui le query:
For I = 0 To UBound(pArr)
ActiveWorkbook.Queries.Add Name:=pArr(I), Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Origine = Pdf.Tables(File.Contents(" & Chr(34) & myPdf & Chr(34) & "), [Implementation=""1.3""])," & Chr(13) & "" & Chr(10) & " Page1 = Origine{[Id=" & Chr(34) & pArr(I) & Chr(34) & "]}[Data]," & Chr(13) & "" & Chr(10) & " #""Modificato tipo"" = Table.TransformColumnTypes(Page1,{{""Column1"", type text}, {""Column2"", type text}, {""Column3"", type text}, {""Column4"", type text}, {""Column5"", type text" & _
"}, {""Column6"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Modificato tipo"""
ActiveWorkbook.Worksheets.Add
ActiveSheet.Name = RndPre & pArr(I)
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & pArr(I) & ";Extended Properties=""""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [" & pArr(I) & "]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
'' .ListObject.DisplayName = "Page003"
On Error Resume Next
.Refresh BackgroundQuery:=False
If Err.Number <> 0 Then
Debug.Print "ERR# " & Err.Number, "su TAB " & pArr(I)
ErrMess = ErrMess & vbCrLf & "ERR# " & Err.Number & " su TAB " & pArr(I)
Err.Clear
End If
On Error GoTo 0
End With
Next I
Set DeSh = Sheets.Add(after:=Sheets(Sheets.Count))
'Copia tutto su unico foglio
For I = 0 To UBound(pArr)
Sheets(RndPre & pArr(I)).Select
ActiveSheet.ListObjects(1).Range.Copy _
Destination:=DeSh.Cells(Rows.Count, "A").End(xlUp).Offset(2, 0)
DeSh.ListObjects(I + 1).Name = "TB_" & pArr(I)
Application.DisplayAlerts = False
Sheets(RndPre & pArr(I)).Delete
Application.DisplayAlerts = True
Next I
DeSh.UsedRange.EntireColumn.AutoFit
DeSh.Select
MsgBox ("Completato... " & ErrMess)
End Sub
Va messo in un Modulo standard del progetto vba del tuo file; due righe sono marcate <<<, e vanno personalizzate come da commento.
In particolare in pArr vanno indicate quali pagine vanno importate; puoi verificare la loro denominazione usando manualmente la procedura Menu /Dati /RecuperaDati /daFile /daPDF su uno dei tuoi file. Nelle mie prove ho visto che vengono dichiarate come Page001, Page002, etc.
Lanciando la Sub PdfPages verrà chiesto di scegliere il file da importare; poi la procedura continua secondo questo flusso:
a) viene creato un foglio temporaneo, su questo file viene importata la prima pagina dichiarata da importare
b) lo step a viene ripetuto per ogni altra pagina dichiarata
c) infine viene creato un nuovo foglio di riepilogo e il contenuto delle singole pagine viene riportato in questo nuovo foglio e i fogli temporanei vengono eliminati.
Un messaggio informa del completamento delle operazioni, comprese eventuali pagine in errore che non sono quindi state importate.
Il foglio di riepilogo rimane attivo alla fine di questo processo
Ora puoi creare formule che attingono a questi dati per creare un tuo riassunto
La prima probabile evoluzione del codice, se produce dati di tua utilità, dovrebbe essere creare il riepilogo (step c) su un foglio già esistente, previa cancellazione del contenuto precedente, in modo che non debba modificare le formule che creano il tuo riassunto per adattarle al nome foglio.
Al momento, non conoscendo il tuo processo né sapendo se quanto prodotto ha una utilità pratica, ho preferito usare il foglio nuovo, ma evolvere per usare un foglio esistente vuol dire modificare un paio di istruzioni
Se hai avuto la pazienza di aspettare prova e fai sapere...