請關注本號,後續會有更多相關教程。
系列文章
學Python還不會處理Excel數據?帶你用pandas玩轉各種數據處理「Python替代Excel Vba」系列(二):pandas分組統計與操作Excel「Python替代Excel Vba」系列(三):pandas處理不規範數據「Python替代Excel Vba」系列(四):課程表分析與動態可視化圖表
前言
有小夥伴向我反映到,本系列前面的章節主要還是在講 pandas ,幾乎與 xlwings 沒有啥關係。
本系列一直強調要善用各種工具,作為本系列的最後一節,那麼這次就用一例子說明如何讓Python結合Vba,直接在Excel中動態獲取各種處理條件,輸出結果。
日後也會不定期分享 pandas 的處理案例,但不一定非要與 Excel 掛鈎。比如直接結合 power bi 做處理分析。
本文主要效果如下圖:
處理數據的過程在 Python 中進行。輸入條件,輸出結果的過程在 Vba 進行。可以隨意修改匯總方式(求和、平均等)與匯總欄位。可以隨意修改匯總欄位和過濾條件。所有的修改都無需改動代碼。數據源文件與顯示文件是獨立分開的。
本文要點:
使用 xlwings 註冊 Python 方法到 Vba 模塊Vba 調用 Python 方法,輸出結果到 Excel注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
本次數據來自於微軟官方提供的財務數據。如下圖:
數據大致表示每個部門每個月的銷售情況Units Sold 列是銷售額本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
導入包
本文所需的包,安裝命令如下:
pip install pandas pip install numpy pip install xlwings
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
定義 Python 方法
首先定義一個對pandas的DataFrame進行過濾的方法。如下圖:
df.query(where_exp) , 這個是主要的方法。DataFrame 的 query 方法支持用文本表達查詢,因此這裡直接傳入外部的字符串即可。其他的語句是為了防止沒有輸入任何查詢的情況。然後再定義一個做匯總的方法。如下圖:
由於 DataFrame 幾乎所有的方法都可以傳入字符串表示,因此非常方便把這些匯總條件通過外部傳入。pd.Grouper(key='Date',freq=date_freq) ,這是 pandas 為處理時間分組提供的處理方式。只需要在 freq 參數傳入字母即可表達你希望按日期的哪個部分進行分組。比如:"M" 表示按月,"Y" 表示按年。最後,定義一個方法,讓vba調用。如下圖:
這個方法的上方套上一個 xlwings 的裝飾器 @xw.func。表示這個方法需要註冊到 Vba 模塊中。外部傳入的是字符串,比如參數 groups 可以是 "col1,col2",因此需要對 groups 和 values 參數調用 split 分裂成列表。然後就順序調用之前定義的2個方法 where_df 和 group_df。接著把 DataFrame 的 columns 與 values 合併成一個 numpy 數組,即可返回。使用 xlwings 生成項目文件
打開命令行,執行以下語句,即可安裝 xlwings 的加載項:
xlwings addin install
實際上,你在使用 pip 安裝 xlwings時,已經有一個 xlwings.xlam文件。而上述命令行只是把這個 xlam 文件放入你的 excel 加載項目錄中而已。然後,在你的任意目錄中打開命令行。執行以下語句,即會生成一個 py 文件和一個 帶宏的 excel 文件。
xlwings quickstart myproject --standalone
其中 myproject ,可以自定義任何名字,這個名字是生成的目錄名字
此刻你會發現在當前目錄會有一個myproject的文件夾,打開後會看到如下2個文件:
我們需要往其中的 py 文件寫入處理代碼。打開myproject.xlsm文件,你會看到一個叫xlwings的功能區頁。如下圖:
點一下上圖紅框部分,即可註冊你的 py 文件中的自定義方法到 vba 中。他大致原理是讀取 py 文件中的方法,然後相應在 vba 中生成名字和參數一樣的 vba 方法。因此,假如你的 py 文件的方法定義改動了,記得要在這裡點擊一下,重新導入定義。如果只是方法裡面的語句改動,則無需重導入。按 alt + f11,打開 vbe(vba的編輯器)。發現其中有3個模塊,分別是 Module1 和 xlwings。
Module1 是需要我們自己寫入所需的 vba 代碼。xlwings 模塊是 xlwings 自動生成的,我們不需要去改動。xlwings_udfs 模塊就是你在功能區點擊導入按鈕時生成的。同樣不需要去改動。到此為止,即可編寫vba代碼去調用。如下:
注意紅線部分,返回結果的 numpy 數組索引是從0開始計數。因此這裡需要在最大索引+1才是行和列的數目。其他就不細說了,會 vba 的小夥伴應該一看就懂。最後
你發現這樣做的一個好處是,無需重複啟動 Python ,因為每次啟動 Python 都需要不少時間(大概2、3秒的樣子)。而本文的做法,可以讓其 Python 進程一直存在。
總結
使用 xlwings 可以讓 Vba 調用 Python 。把複雜的匯總處理流程讓給 Python 處理。Vba 處理 Excel輸出結果等,別再讓 vba 做他不擅長的事情。
請關注本號,後續會有更多相關教程。