VBA - Cambiare origine dati di una Pivot

di il
2 risposte

VBA - Cambiare origine dati di una Pivot

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:
Errore di sintassi
Errore di sintassi

2 Risposte

  • Re: VBA - Cambiare origine dati di una Pivot

    Buongiorno a tutti di nuovo.
    Tirando varie testate alla tastiera, sono riuscito a risolvere "parzialmente" il problema per cui avevo aperto il thread. Mettendo il codice di seguito, la pivot viene aggiornata ed i filtri "puliti", nel senso che dà già tutto selezionato di default (così come volevo che facesse)
    
    	Set NuovaCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
            SourceData:=percorso & "\Output\[Nuovo_QC_DT-V1.2 - Fatture Scadute.xlsx]Base Dati!R1C1:R" & lUltRiga & "C19")
       
        	With PT
           		.ChangePivotCache (NuovaCache)
            	.PivotCache.Refresh
           		.PivotFields("Dir. Territoriale").ClearAllFilters
           		.PivotFields("P.to oper.").ClearAllFilters
            	.PivotFields("Desc. P.to op.").ClearAllFilters
        	End With
        	Set NuovaCache = Nothing
        	'Aggiorno la base dati per la Pivot e pulisco tutti i filtri
    
    Nonostante sia tutto quasi perfetto, riscontro un problema
    Come dicevo, una volta aperto il file excel, la pivot e tutti i calcoli ad essa connessi, sono già aggiornati, ma se vado a cercare di lavorare sui filtri che pulisco con il codice, mi dà l'errore che vi allego.
    Contate che sbloccando il foglio e facendo aggiorna, al di là che non aggiorna nulla perchè già aggiornato, poi i filtri funzionano

    Qualcuno mi sa dire dove sbaglio ?
    Allegati:
    29220_e5f98aa9e16a3d8c10a1b27f6f60011e.jpg
    29220_e5f98aa9e16a3d8c10a1b27f6f60011e.jpg
  • Re: VBA - Cambiare origine dati di una Pivot

    Buongiorno a tutti.

    In qualche maniera avevo risolto anche l'errore che mi dava sopra. Tutto è funzionato per un paio di settimane, ed ora, magicamente, non va più

    Vi allego il codice della parte interessata e l'errore che mi da e dove....
    Vi giuro che andava fino a settimana scorsa....

    Help !
    
    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.3 - 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
        
        Set NuovaCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
            SourceData:=percorso & "\Output\[Nuovo_QC_DT-V1.3 - Fatture Scadute.xlsx]Base Dati!R1C1:R" & lUltRiga & "C19")
        
        
        With PT
            .ChangePivotCache (NuovaCache)
            .PivotCache.Refresh
            .PivotFields("Dir. Territoriale").ClearAllFilters
            .PivotFields("Dir. Territoriale").CurrentPage = "(All)"
            .PivotFields("P.to oper.").ClearAllFilters
            .PivotFields("P.to oper.").CurrentPage = "(All)"
            .PivotFields("Desc. P.to op.").ClearAllFilters
            .PivotCache.Refresh
            .Update
            .RefreshTable
            .SaveData = True
        End With
        Set NuovaCache = Nothing
        'Aggiorno la base dati per la Pivot e pulisco tutti i filtri
        
        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:
    Errore riscontrato
    Errore riscontrato
Devi accedere o registrarti per scrivere nel forum
2 risposte