「Python替代Excel Vba」系列(終):vba中調用Python

2020-12-16 Python數據世界

請關注本號,後續會有更多相關教程。

系列文章

學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 做他不擅長的事情。

請關注本號,後續會有更多相關教程。

相關焦點

  • 「Python替代Excel Vba」系列(二):pandas分組統計與操作Excel
    帶你用pandas玩轉各種數據處理前言在本系列的上一章已經介紹了如何讀寫 excel 數據,並快速進行匯總處理。但有些小夥伴看完之後有些疑惑:那只是簡單讀寫數據而已,有時候需要設置 excel 的格式。
  • excel VBA是什麼?VBA編程入門教程
    本篇將介紹excel vba是什麼?vba編程入門教程,有興趣的朋友可以了解一下!一、excel vba是什麼?VBA的英文全稱是Visual Basic for Applications,是一門標準的宏語言。VBA語言不能單獨運行,只能被office軟體(如:Word、Excel等)所調用。
  • 巧用python win32com模塊操作excel文件
    可openPyxl也有不足,它難以實習VBA中的很多功能。如果我們平日裡對VBA語法很熟悉,則可以通過win32com.client來操縱excel文件,語法非常類似。  之所以不直接使用VBA,是因為VBA擅長跟excel打交道,不擅長跟外部應用打交道。
  • vba第十八課
    vba第十八課調用工作表函數在vba中我經常會對工作表的數據進行一些運算,雖然通過代碼進行循環或判斷也可以完成,但是通vba調用函數可以更簡單更直接進行運算提高代碼的運行效率,比如countif、sumif等需要進行判斷統計和求和的運算。
  • 「Python替代Excel Vba」系列(三):pandas處理不規範數據
    系列文章「Python替代Excel Vba」系列(二):pandas分組統計與操作Excel前言本系列前2篇已經稍微展示了 python 在數據處理方面的強大能力,這主要得益於 pandas 包的各種靈活處理方式。
  • Python 實現批量分類匯總並保存xlsx文件
    上一篇文件用VBA介紹了如何實現一鍵按列分類匯總並保存單獨文件,代碼有幾十行,而且一旦數據量多了,效果可能不盡如人意。
  • 如何在Stata16中調用Python
    一方面,Python早就可以調用Stata了,我們完全可以將Stata的命令封裝在Python命令中;另一方面,數據類型的轉化完全可以通過數據集的導入導出來實現。正如我們經常做的,用Python爬一組數據,然後保存為Excel工作表,最後用Stata讀取並建模。
  • Excel VBA從新手到高手系列課程
    五、 教學目錄:第一章 新手篇-走進excel vba的世界      1.1 什麼是VBA      1.2 EXCEL中的宏      1.3 認識VISUAL BASIC編輯器        1.4 vba程序結構      1.5 數據類型         1.6
  • 利用python操作Excel教程
    很多人都會使用excel來對數據做處理,但隨著python的日益強盛,不甘落後的我們也可以用python來完成這些工作,該教程目的是教會您用Python腳本來對excel做處理。添加替代作者的選項添加替代選項engine僅在Pandas版本0.13及更高版本中可用。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    (6套課程) 注:零基礎全能篇中,針對windows和liunx系統均有兩套課程可供選擇學習,單純學python,哪個系統都一樣,初學者只需選擇自己熟悉的系統學習相應課程即可。 11編程讓生活更美好 之 初識 excel操控 12【VBA宏工程插件與python+xlwings混合調用】 13python +VBA混合開發 之 winapi自由世界 14python+panas+excel+vba混合調用 15【hybridDev實戰】【py+excel+ppt自動匯報】 16原創獨家配套筆記之混合開發
  • VBA代碼大全030:用vba強制關閉word應用程式
    我們有時候需要從word中提取數據到excel中。 這時候一般的套路都是在excel vba中創建word應用程式實例,然後一番操作以後關閉word應用程式。 關於在vba中使用dos命令可以看往期文章用VBA執行DOS命令
  • Excel VBA 實例(22) - 一鍵篩選其他工作表或工作簿的數據
    今天說的這個vba實例還是和學校有關。
  • WPS教程:excel新手入門VBA功能使用介紹
    Excel教學:今天和大家分享一下excel中vba的使用方法入門,相信很多使用該軟體的朋友們對此都很感興趣,下面就和大家來分享一下,希望可以幫助到大家。4.輸入如圖所示的代碼:5.保存文件,按下F5執行,找到我們編輯的這個宏,【計算銷售額】,然後點擊【運行】寫在末尾——總結一下WPS用起來還是十分簡單的,後面也會出更多的EXCEL系列教程和其他知識分享。
  • VBA會被Python代替嗎?
    先說答案:不會被替代這裡引用輪子哥的話說:微軟只會開發更多的增強型插件來慢慢淡化VBA,但是不會用其他語言取代VBA。我認真翻看了下好多篇文章,是微軟在社區中做了一個調查,雖然有很多用戶投了贊成票,但是後面不了了之,沒有消息了。
  • Excel-VBA基礎語法
    一、VBA介紹1、宏和VBA的關係  vba是程式語言,宏是用vba代碼保存下來的程序。」、「工具欄」、「代碼窗口」、「立即窗口」     下面是常用的換行符 'chr(10) 可以生成換行符 'chr(13) 可以生成回車符 'vbcrlf 換行符和回車符 'vbCr 等同於chr(10) 'vblf 等同於chr(13)'例:Sub test3() MsgBox "我愛" & Chr(10) & "Excel" ' MsgBox
  • python中調用MATLAB程序
    上次寫了MATLAB和Python的互聯以及MATLAB中調用python程序,今天講解python中調用MATLAB程序。
  • vba如何快速解決excel小問題
    粉絲想問的應該是如何讓 Excel 單元格中以逗號分隔的重複數據去除重複值,相同的數據只保留一個。我給出的解決方式有兩種:一是分列+轉置+去除重複值;二是vba。我剛好有點時間所以就搜索了一下這個問題搜索
  • rPython:在R語言中調用python命令
    經常使用Python和R語言的人都知道,如果R中有某些功能Python不容易實現時,則可以安裝加載rpy2包,從而實現在python中調用R語言命令的功能
  • 簡單的Python調用C++程序
    一般來說在python調用C/C++程序主要可以分為3步:1、編寫C/C++實現程序。- 2、將C/C++程序編譯成動態庫。- 3、在Python中調用編譯生成的庫。Python在調用C/C++程序時有一些不同,需要注意。
  • 未明學院:用excel不好嗎?為什麼還要學python?
    在大數據背景的今天,面對千萬條以上動輒成百上千G的數據,單用excel難免顯得力不從心,越來越多的人將關注點轉向python。1、易踩坑!而python在數據處理的量級和性能上明顯高於excel,對python來說,只需調用drop_duplicates方法就可以輕鬆處理大批量數據,無需擔心軟體崩潰異常退出。