Excel自定義任意圖表的通用模式
Excel作圖通常使用自帶圖表或第三方插件圖表。自帶圖表種類比較少,僅僅包含柱形圖、條形圖、折線圖等基礎(chǔ)圖形,且功能有限。優(yōu)秀的第三方插件圖表是很好的擴(kuò)充。

但是,這兩種作圖方式都無(wú)法解決一個(gè)問(wèn)題-任性,即結(jié)合業(yè)務(wù)實(shí)際需求隨心所欲的制圖。?本文嘗試給這種“任性”的需求一個(gè)解決方案,并且該方案是輕量級(jí)的,僅僅使用Excel本身的功能即可實(shí)現(xiàn)花式制圖,無(wú)需額外任何安裝。
例如,可以制作填充任何圖形的條形圖:

可以定制一個(gè)帶有條件格式的迷你環(huán)形圖,并且安裝數(shù)據(jù)變化實(shí)時(shí)更新:

可以定制一個(gè)四象限方塊圖,按照指標(biāo)達(dá)成狀況將所有店鋪分為四個(gè)區(qū)域:

熟悉我的讀者可能覺(jué)得以上圖表似曾相識(shí)。沒(méi)錯(cuò),這些樣例都是我之前在Power BI中使用DAX+SVG自定義的?,F(xiàn)在,在Excel中也可以輕易的實(shí)現(xiàn)這種自定義,不過(guò)需要的是VBA+SVG(一點(diǎn)VBA都不懂的讀者先不要嚇跑,都是套路操作,僅僅需要少量代碼)。
使用SVG的方式在Power BI和Excel自定義圖表底層原理一致,都是利用了SVG圖片的矢量性。圖表是位置、大小、形狀、顏色、亮度、方向和文本的組合,SVG的原理正好滿足圖表的所有屬性需求。
但是二者又有明顯的區(qū)別。Power BI有個(gè)優(yōu)點(diǎn),度量值可以標(biāo)記為圖像URL。這意味著,一個(gè)圖片的網(wǎng)址可以在Power BI中直接顯示為圖片。也就是說(shuō),SVG+DAX生成的度量值也可以直接顯示為圖片,并且圖片隨著模型數(shù)據(jù)的變化而變化。

但是,Excel沒(méi)有這樣的功能(期待未來(lái)可以有)。因此,需要采取一種迂回的方式:
將Excel中需要制圖的數(shù)據(jù)嵌入SVG,將該SVG圖片導(dǎo)出Excel,接著再導(dǎo)回Excel的指定位置。數(shù)據(jù)更新后,自動(dòng)刪除當(dāng)前SVG圖片,再次生成新的SVG導(dǎo)入。以上動(dòng)畫(huà)中或者以下視頻中,讀者看到數(shù)據(jù)變化圖表自動(dòng)更新其實(shí)是一種錯(cuò)覺(jué),因?yàn)殡娔X運(yùn)行速度太快,本質(zhì)上是將數(shù)據(jù)變化前的圖片自動(dòng)刪除并用新的圖片覆蓋。以下分步驟解說(shuō)。
1. 數(shù)據(jù)嵌入SVG
數(shù)據(jù)的提取有兩種模式,一種是指定位置數(shù)據(jù),比方上圖中環(huán)形圖的A2單元格,四象限方塊圖中的四個(gè)單元格。

還有一種是數(shù)據(jù)多少不固定,不選中數(shù)據(jù)時(shí)可以使用For to語(yǔ)句從頭到尾遍歷,選中指定數(shù)據(jù)制圖時(shí)可以使用For each語(yǔ)句。

數(shù)據(jù)嵌入SVG的方式與Power BI雷同,比如針對(duì)四象限方塊圖,定義SVG的環(huán)節(jié)如下:

這與Power BI中的代碼幾乎是一樣的:

無(wú)論是提取數(shù)據(jù),還是重復(fù)生成圖表,F(xiàn)or循環(huán)都是最佳選擇。圓點(diǎn)條形圖的例子中,內(nèi)層的For語(yǔ)句,按照數(shù)據(jù)大小生成相應(yīng)數(shù)量的圓;外側(cè)的For對(duì)選中的每一行數(shù)據(jù)執(zhí)行內(nèi)層的For。
2. 導(dǎo)出導(dǎo)入SVG圖片
VBA的前半段生成SVG圖片后,通過(guò)以下簡(jiǎn)單語(yǔ)句導(dǎo)出為一個(gè)叫wu的SVG文件:
接著,將該文件導(dǎo)回Excel,如果是放在單元格的迷你圖,本公眾號(hào)前期分享過(guò)導(dǎo)入Excel圖片的代碼,讀者可自行搜索;如果是放在工作表指定位置的大圖,以下一句代碼即可:
3.?自動(dòng)刷新
刷新圖表有兩種方式,一種是指定一個(gè)按鈕,點(diǎn)擊刷新:

另外可以自動(dòng)刷新,新建一個(gè)新的宏,如下所示,借助Worksheet_Change事件,當(dāng)工作表數(shù)據(jù)有變更自動(dòng)促發(fā)VBA的運(yùn)行。該代碼有兩個(gè)模塊,首先刪除當(dāng)前工作表中的所有圖片(代碼前期分享過(guò),可公眾號(hào)搜索),接著調(diào)用四象限方塊圖這個(gè)宏。
以上即是完整的Excel自定義圖表流程。你需要的最少知識(shí)是:VBA中For循環(huán)的使用方法及SVG基礎(chǔ)圖形的編碼規(guī)則。這些知識(shí)可以在網(wǎng)上很容易搜索到。
VBA+SVG在Excel制圖的優(yōu)勢(shì)比DAX+SVG在Power BI中非常明顯:首先,VBA中的For 語(yǔ)句可以很方便的循環(huán),DAX需要新建虛擬索引;其次,Excel單元格具有靈活性,在Power BI中建的SVG迷你圖必須是正方形,且大小不能超過(guò)150*150像素,Excel完全沒(méi)有這個(gè)限制。
常規(guī)狀態(tài)下還是建議使用內(nèi)置或者第三方插件圖表。如果你喜歡折騰,或者有業(yè)務(wù)需求,但市面上實(shí)在沒(méi)有圖表可以滿足,不妨試試本文的方案。需要說(shuō)明的是,無(wú)論在Power BI還是Excel中,并不是所有SVG標(biāo)簽都可以得到支持,希望微軟后續(xù)在這方面做些努力。