lunedì 16 giugno 2014

VBA-Excel: Aggiornare le Tabelle Pivot (e relativi Grafici) da codice

A chi scrive codice VBA può capitare l'esigenza di aggiornare le Tabelle Pivot (i Grafici Pivot si appoggiano anch'essi su Tabelle Pivot) dopo aver modificato i dati contenuti nei vari fogli.
Per prima cosa è utile sapere che le Tabelle Pivot si appoggiano su cache di dati e sono quindi queste ultime a dover essere aggiornate. Un modo molto semplice di aggiornare tutte le Pivot del Workbook (file) corrente è un ciclo che passi tutte le cache e ne esegua il Refresh.
Vi riporto di seguito il codice di una semplice Sub che inserita nel codice dell'oggetto ThisWorkbook implementa un metodo richiamabile dal vostro codice per "refreshare" (brutto inglesismo) tutte le Pivot.

Public Sub RefreshPivotTables()

    Dim PT As PivotCache
    For Each PT In ThisWorkbook.PivotCaches
        PT.Refresh
    Next
                
End Sub

Quindi nel vostro codice per richiamare il nuovo metodo sarà sufficiente scrivere:

ThisWorkbook.RefreshPivotTables

Alla prossima :-)

VBA-Excel: La finestra del MsgBox appare nascosta "sotto" la finestra di Excel

Di recente mi è capitato molte volte che la finestra aperta con il comando MsgBox in VBA apparisse "sotto" la finestra di Excel, causando così una sorta di blocco perché l'utente non vedeva il messaggio e l'applicazione restava ferma in attesa di risposta. Unico indizio che c'era un messaggio in attesa era la finestra di Excel "sfarfallante". Per l'utente era sufficiente cliccare il titolo della finestra o premere Alt-Tab per vedere il messaggio e quindi poter rispondere e proseguire, ma certo non è bello.
Ho fatto un po' di ricerche e o trovato una soluzione semplice e che pare efficace. Prima della riga in cui viene eseguito il MsgBox inserite una riga con AppActivate Application.Caption

Esempio:
AppActivate Application.Caption
MsgBox "Mio messaggio"

Spero di essere stato utile :-)