Buongiorno a tutti.
Per un progetto che sto realizzando, ho integrato in un DB access anche alcuni comandi che vanno ad agire su file excel.
Il progetto attualmente fà una serie di query, estrae 5 file di dati, i dati di questi 5 file li copia in altri 5 file composti da Base Dati, in cui finiscono i dati, ed un foglio con una Pivot e tutta una serie di formule che in base ai valori della pivot, la integrano, aggiornano la pivot e poi bloccano il foglio per non far modificare/cancellare nulla, in modo che possano solo usare il filtro senza possibilità di fare danni.
Il problema è che come "Origine dati" della Pivot, ho impostato un intervallo fisso, in modo da riuscire a leggere i dati contenuti in caso siano meno che più dell'estrazione che sto usando io oggi (Esempio: io sto lavorando un file con 250 righe, e più o meno sarà sempre di queste dimensioni, però per stare sicuro, ho impostato il valore fisso di 500). Questo però crea un problema: nella pivot esce il valore "Vuoto". So che basterebbe togliere il flag, ma preferirei non uscisse, quindi l'unica maniera è aggiornare l'origine dati ogni volta. Ma questi file devono essere distribuiti e devono essere il più automatizzati e chiari possibile.
Ho scopiazzato una sintassi che dovrebbe fare al caso mio, ma non vengo a capo della corretta sintassi in VBA. Me la segnala proprio sbagliata....
Di seguito tutto il codice relativo al primo file. Nella parte con gli ****ERRORE**** la parte che non va. Subito sotto potete vedere il semplice aggiornamento che funzionava ma mi dava il famoso "vuoto".
Dim appExcel As Excel.Application
Dim lUltRiga As Long
Dim xlBook1 As Excel.Workbook
Dim xlBook2 As Excel.Workbook
Dim xlSheet1 As Excel.Worksheet
Dim xlSheet2 As Excel.Worksheet
Dim xlSheet3 As Excel.Worksheet
Dim PT As PivotTable
Set appExcel = CreateObject("Excel.Application")
appExcel.DisplayAlerts = False
appExcel.Visible = False
'Con queste righe faccio aprire Excel per poi andare a lavorare sui singoli file
'non facendo però visualizzare nulla di quello che accade
Set xlBook1 = Workbooks.Open(percorso & "\Output\Nuovo_QC_DT-V1.2 - Fatture Scadute.xlsx")
Set xlBook2 = Workbooks.Open(percorso & "\Output\EstraiSelezioneFatture.xlsx")
Set xlSheet1 = xlBook1.Sheets("Pivot Riepilogo")
Set xlSheet2 = xlBook1.Sheets("Base Dati")
Set xlSheet3 = xlBook2.Sheets("EstraiSelezioneFatture")
Set PT = xlSheet1.PivotTables("Tabella pivot1")
xlSheet2.Activate
xlSheet2.Range("A2:Y5000").ClearContents
xlSheet3.Activate
lUltRiga = Cells(Rows.Count, 1).End(xlUp).Row
With xlSheet3
.Range("A2" & ":Y" & lUltRiga).Copy
xlSheet2.Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End With
'Con le righe sopra copio i dati generati da access nella base dati
xlSheet1.Activate
With xlSheet1
.Unprotect
.Range("E3").ClearContents
.Range("E3").Locked = False
.Range("E3").FormulaHidden = False
.Range("B10").Locked = False
.Range("B10").FormulaHidden = False
.Range("B11").Locked = False
.Range("B11").FormulaHidden = False
End With
'****ERRORE QUI****
Set NuovaCache = xlSheet1.PivotCaches.Create( _
SourceType:=xlDatabase, SourceData:=appExcel.xlBook1.Path _
& "[" & appExcel.xlBook1.Name & "]" & "Base Dati" & _
"!R1C1:R" & lUltRiga & "C19")
PT.ChangePivotCache (NuovaCache)
'Aggiorno la base dati per la Pivot
'****ERRORE QUI****
'PT.RefreshTable
xlSheet1.Protect DrawingObjects:=True, contents:=True, Scenarios:=True, AllowUsingPivotTables:=True
'Con le righe sopra sproteggo il foglio, aggiorno la pivot, cancello il campo con la data
'e poi riproteggo il foglio lasciando libere le 2 celle contenenti il filtro e la cella
'in cui inserire la data di estrazione.
xlBook1.Save
xlBook1.Close
xlBook2.Save
xlBook2.Close
Set PT = Nothing
Set xlSheet1 = Nothing
Set xlSheet2 = Nothing
Set xlSheet3 = Nothing
Set xlBook1 = Nothing
Set xlBook2 = Nothing
'Le righe sopra salvano e chiudono tutti i fogli. Pronto per il nuovo file !
Allegati: