
Dati
Ho preso i dati di esempio dal sito web di Excel-Facile. Questo è un bel sito Web contenente tutorial adatti ai principianti sulle funzionalità di base di Excel e VBA. Il set di dati contiene i record delle vendite di frutta e verdura in paesi specifici nel 2016 e nel 2017. Il set di dati contiene sei campi: ID ordine, Prodotto, Categoria, Importo, Data e Paese. Ho diviso questo set di dati in 2 file CSV chiamati results1.csv
E results2.csv
per creare tabelle pivot.
Ho estratto questo set di dati nel file RawData
foglio di lavoro. Ho creato una gamma dinamica chiamata raw_data_source
con la seguente formula:
=OFFSET(RawData!$A$1, 0, 0, COUNTA(RawData!$A:$A), COUNTA(RawData!$1:$1))
Il motivo per cui ho creato un intervallo dinamico era che la dimensione (numero di righe) del set di dati era diversa nei diversi file CSV e volevo utilizzare l'intero set di dati come origine della tabella pivot.
Tabelle e grafici pivot
Il set di dati in raw_data_source
gamma nel RawData
Il foglio è stato utilizzato come origine dati per creare due semplici tabelle e grafici pivot.
Il primo rappresentava le vendite totali di frutta e verdura per singoli prodotti filtrabili per paese con le impostazioni del campo come mostrato.
Il secondo rappresentava le vendite totali di frutta e verdura per paesi.
1. Automatizzazione dell'aggiornamento delle tabelle pivot in base a un nuovo set di dati
In questo passaggio, volevo automatizzare l'aggiornamento dei set di dati dal file che ho specificato. Ho creato un segnaposto nel file Admin
foglio per posizionare il percorso dei dati CSV di cui volevo estrarre e aggiornare le tabelle pivot. Ho dato un nome alla cella A2
COME filepath
come mostrato di seguito:
Il codice per questo passaggio è riportato di seguito nel file UpdateRawData
sottoprogramma. Ho dichiarato le variabili wb
, ws_admin
, ws_rawdata
E filepath
rispettivamente per i nomi della cartella di lavoro, del foglio Amministrazione, del foglio RawData e del percorso del file contenente il set di dati. Per prima cosa ho cancellato il contenuto del foglio RawData. Quindi sono andato alla cartella di lavoro di origine in base al nome del file, ho selezionato il foglio corrispondente, ne ho copiato il contenuto, sono tornato al file ws_rawdata
foglio e incollato il contenuto come valori. Infine, ho aggiornato la cartella di lavoro utilizzando il codice wb.RefreshAll
che ha aggiornato l'intera cartella di lavoro inclusi rispettivamente i fogli con la tabella pivot e il grafico.
Sub UpdateRawData()Dim wb As Workbook
Dim ws_admin As Worksheet
Dim ws_rawdata As Worksheet
Dim filepath As String
Set wb = ThisWorkbook
Set ws_admin = wb.Worksheets(“Admin”)
Set ws_rawdata = wb.Worksheets(“RawData”)
'Clear Rawdata sheet
ws_rawdata.Activate
Cells.Clear
'get file path
filepath = ws_admin.Range(“filepath”)
Application.DisplayAlerts = False
'Open source file and select all contents
Dim src_wb As Workbook
Dim src_ws As Worksheet
Set src_wb = Workbooks.Open(filepath)
Set src_ws = src_wb.Sheets(1)
src_ws.UsedRange.Select
'Copy all
Selection.Copy
'Paste all
ws_rawdata.Range(“A1”).PasteSpecial xlPasteValues
'Close source file
src_wb.Close SaveChanges:=False
wb.RefreshAll
Application.DisplayAlerts = True
End Sub
Ho collegato questa subroutine al file Aggiorna file e grafici pulsante. Dopo aver specificato il nome file nel segnaposto e aver fatto clic sul pulsante, il set di dati e le tabelle pivot sono stati aggiornati automaticamente.
2. Creazione di una tabella di colori utilizzando VBA
Ho creato una tabella nel file Admin
foglio contenente l'elenco dei prodotti ortofrutticoli specifici disponibili nel dataset. Nella colonna F ho specificato i codici colore esadecimali provvisori per il colore di ciascun frutto o verdura. Volevo utilizzare questi colori per aggiornare i colori nei grafici pivot. Per prima cosa volevo dipingere la colonna F con il colore che ho specificato in ogni cella.
Codice colore esadecimale
Il codice esadecimale per ciascun colore è un numero esadecimale di 6 cifre (da 0 a 9 o da A a F) in base 16. In un codice colore esadecimale RRGGBB
ogni coppia di due lettere rappresenta le varie sfumature di colore rosso, verde e blu. In un sistema Rosso Verde Blu (RGB), il valore di ciascuna tonalità varia da 0 a 255.
Ad esempio, per un codice colore esadecimale ffab23
Ho calcolato il codice RGB corrispondente con il seguente calcolo. ffab23
nel sistema esadecimale si traduce in (255, 171, 35) nel sistema RGB riferendosi rispettivamente alle componenti di colore Rosso, Verde e Blu.
Questo può anche essere visualizzato andando all'opzione Colori personalizzati in Excel come mostrato di seguito:
In Excel VBA, utilizzando &H
in combinazione con un valore implica che si tratti di un numero esadecimale e il Val()
la funzione restituisce il numero decimale corrispondente. Nella finestra immediata sottostante, r
, g
E b
rappresentano rispettivamente i valori decimali corrispondenti per ciascuna tonalità di rosso, verde e blu.
Nel codice seguente, ho creato un intervallo denominato color_code_range
per la tabella contenente il codice colore esadecimale di ogni frutto o verdura. Ho eseguito il looping di ciascuna cella della selezione, derivato i componenti rosso, verde e blu in numeri decimali e dipinto l'interno della cella con lo stesso codice colore RGB.
Sub refresh_color_table()Dim wb As Workbook
Dim ws_admin As Worksheet
Set wb = ThisWorkbook
Set ws_admin = wb.Sheets(“Admin”)
ws_admin.Range("color_code_range").Select
Dim c As Range
Dim r, g, b As Long
Dim Hex As String
For Each c In Selection
Hex = c.Value
r = Val("&H" & Mid(Hex, 1, 2))
g = Val("&H" & Mid(Hex, 3, 2))
b = Val("&H" & Mid(Hex, 5, 2))
c.Interior.Color = RGB(r, g, b)
Next c
End Sub
Quando ho eseguito la subroutine precedente, la colonna F viene dipinta con lo stesso colore del codice colore come mostrato:
Se il codice colore viene modificato e il codice viene eseguito nuovamente, genererà nuovi colori nella tabella. Non è bello?
3. Lavorare con un dizionario in VBA
Nel passaggio successivo, volevo assegnare i colori nei grafici pivot in base ai colori personalizzati che ho scelto sopra. A questo scopo ho creato un dizionario contenente il nome del prodotto come chiavi e i corrispondenti codici colore esadecimali come valori.
Il prerequisito per la creazione di un oggetto dizionario in VBA è l'attivazione anticipata di Microsoft Scripting Runtime. Per farlo, puoi andare su Strumenti -> Riferimenti -> Seleziona la casella accanto a Microsoft Scripting Runtime e fai clic su OK.
Nel codice seguente, ho creato un oggetto dizionario chiamato colorMap
. Ho eseguito il looping dell'intervallo E2: F10 nel file Admin
foglio. Ho aggiunto il contenuto nella colonna E come chiavi e il contenuto nella colonna F come valori corrispondenti.
Sub create_dict()Dim wb As Workbook
Dim ws_admin As Worksheet
Set wb = ThisWorkbook
Set ws_admin = wb.Sheets(“Admin”)
Dim colorMap As Dictionary
Set colorMap = New Dictionary
Dim i As Integer
For i = 2 To 10
If Not colorMap.Exists(Range("E" & i).Value) Then
colorMap.Add Range("E" & i).Value, Range("F" & i).Value
End If
Next i
For Each Key In colorMap.Keys()
Debug.Print Key & ": " & colorMap(Key)
Next Key
End Sub
Nel secondo ciclo for sopra, ho eseguito il loop di ciascuna chiave del dizionario colorMap e ho stampato le chiavi e i valori nella finestra immediata come mostrato di seguito:
4. Gestione degli elementi del grafico pivot utilizzando VBA
Sulla base di quanto appreso dai passaggi precedenti, volevo fare un ulteriore passo avanti e aggiornare gli elementi del grafico pivot utilizzando VBA. In questo caso, volevo impostare automaticamente il titolo del grafico in base al valore di una cella e applicare i colori di frutta e verdura specifici definiti nel Admin
foglio ai grafici pivot.
In questo passaggio ho assegnato Plot1
E Plot2
fogli come un array chiamato sheetNames
. ho dichiarato chartObj
come oggetto grafico. All'interno di ciascun foglio, ho eseguito il looping di ciascun ChartObject tra tutti i ChartObject.
Nota: Oggetto grafico funge da contenitore per a Grafico oggetto in VBA che controlla la dimensione e l'aspetto del grafico incorporato in un foglio di lavoro. È un membro del Oggetti grafici collezione. È importante comprendere le differenze nei metodi e nelle proprietà di ciascuno di questi oggetti in VBA.
Dopo aver esaminato ciascun chartObj, imposto il titolo per ciascun grafico in base al valore nella cella E1. Successivamente, ho eseguito il ciclo di ciascuna serie nella raccolta di serie complessiva dell'oggetto Grafico. Ho assegnato il nome della serie (cioè il nome della frutta o della verdura) a una variabile chiamata itemName
e ho ottenuto il codice colore corrispondente da colorMap
dizionario. Analogamente al passaggio 2, ho ottenuto i componenti rosso, verde e blu del codice colore in numeri decimali e ho riempito la barra della serie con i colori RGB.
Sub refresh_plots()Dim wb As Workbook
Dim ws_admin As Worksheet
Dim ws As Worksheet
Set wb = ThisWorkbook
Set ws_admin = wb.Sheets("Admin")
Dim colorMap
Set colorMap = CreateObject("Scripting.Dictionary")
Dim i As Integer
For i = 2 To 10
If Not colorMap.Exists(Range("E" & i).Value) Then
colorMap.Add Range("E" & i).Value, Range("F" & i).Value
End If
Next i
Dim sheetNames As Variant
Dim sheetName As Variant
sheetNames = Array("Plot1", "Plot2")
Dim hex_color_code As String
Dim r, g, b As Integer
Dim chartObj As ChartObject
For Each sheetName In sheetNames
Set ws = wb.Sheets(sheetName)
For Each chartObj In ws.ChartObjects
chartObj.Chart.HasTitle = True
chartObj.Chart.ChartTitle.Text = ws.Range("E1").Value
For Each Series In chartObj.Chart.SeriesCollection
itemName = Series.Name
hex_color_code = colorMap(itemName)
r = Val("&H" & Mid(hex_color_code, 1, 2))
g = Val("&H" & Mid(hex_color_code, 3, 2))
b = Val("&H" & Mid(hex_color_code, 5, 2))
Series.Format.Fill.ForeColor.RGB = RGB(r, g, b)
Next Series
Next chartObj
Next sheetName
End Sub
Di seguito è riportata un'illustrazione dell'uso di questo codice.
Conclusione
In questo post ho illustrato come personalizzare e automatizzare il lavoro con tabelle pivot e grafici utilizzando VBA. Ho dimostrato l'automazione di quattro attività chiave: aggiornamento di tabelle pivot e grafici con nuovi set di dati; creazione di tabelle colore basate su codice colore esadecimale; come lavorare con i dizionari in VBA; e gestione e aggiornamento degli elementi del grafico pivot utilizzando VBA. Nella seconda fase ho elaborato la conversione dei codici colore esadecimali nei corrispondenti codici colore RGB utilizzando sia Excel che VBA, e ho utilizzato questa tecnica nei passaggi successivi.
Il codice e il file Excel per questo post sono presenti in questo GitHub deposito. Grazie per aver letto!
Fonte: towardsdatascience.com