请关注本号,后续会有更多相关教程。

系列文章

学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 pandaspip install numpypip 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代码_“Python替代Excel Vba”系列(终):vba中调用Python相关推荐

  1. python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...

    3. (2019高一下·浙江期末) 数制转换.将一个K进制(k<=10)数x转换成十进制数可采用如下方法:主要方法是从右向左,依次取数x的各位数字,分别计算出该数从右边数起的第i位数字与k(i- ...

  2. python画简单花的代码_写程序不是枯燥的“用几行Python代码绘制彩色花朵”

    [你需要知道的]在工作上,能力不敌态度;在成功上,才华不敌韧度;在知识上,广博不敌深度;在思想上,敏锐不敌高度;在做人上,精明不敌气度;在做事上,速度不敌精度;在看人上,外貌不敌风度;在写作上,文采不 ...

  3. python三角形判断白盒测试的代码_进化的测试 软件测试,自动化测试,白盒测试,Python...

    用Selenium实现自动化测试的过程中,如果选择页面上的元素并且对之进行各种操作,是一个常见的任务.Selenium提供了多种定位方法: id:最有效.最方便的方法 name:跟id类似的 clas ...

  4. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  5. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  6. 在Java中调用Python,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 写在 ...

  7. python中execute函数_在excel中调用python函数

    效果: 通过excel引用在py文件中写好的load_settle()函数,可以快捷的获取对应的历史结算价. 使用方法: 1.首先安装office,我用的是2016版本. 2.安装python,推荐使 ...

  8. 【Python】如何在Excel中调用Python脚本,实现数据自动化处理

    这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5 ...

  9. 如何在Excel中调用Python脚本,实现数据自动化处理!

    大家好, 这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球 ...

  10. 如何在Excel中调用Python脚本,实现数据自动化处理

    这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5 ...

最新文章

  1. linux终端中运行网银盾,Linux下使用Virtualbox安装 Windows 7 操作网银攻略
  2. 买个云服务器有啥用_如何用阿里云轻量应用服务器配置一个WordPress网站?
  3. linux 有线网卡,linux下有线网卡出现ADDRCONF(NETDEV_UP): eth0: link is not ready的解决方法...
  4. Leetcode 162. 寻找峰值 解题思路及C++实现
  5. 神策数据加入中国大数据产业生态联盟,神策营销云及融媒解决方案获联盟认证...
  6. js中浮点型运算 加减乘除
  7. ddl hibernate_Hibernate:DDL模式生成
  8. CocosCreator1.x实现水流动的效果
  9. 云开发新能力,支持 HTTP 调用 API
  10. SpringBoot RequestBody ajax提交对象
  11. 计算机网络提供服务靠,计算机网络体系结构及协议之通信子网的操作方式和网络层提供的服务...
  12. iOS开发日记9-终端命令
  13. maven插件安装与使用
  14. 外汇汇率接口 java_免费的货币汇率API
  15. vue 自动打开浏览器
  16. 实名域名是什么意思?域名必须要进行实名认证吗?
  17. 解决Tomcat修改server.xml和content.xml后自动还原问题
  18. 云南小学、初中、高中标准教学实验室设备配置清单整体解决方案
  19. ACM-音频编解码器管理器
  20. 买车容易行路难-撞车

热门文章

  1. android 11.0 12.0设置app为默认浏览器
  2. 【解读大佑 】〔文/马世芳 吴清圣〕
  3. 微信小程序weui的使用
  4. java 废弃方法_在Java中使用Deprecated方法或类是错误的吗?
  5. RNA-Seq质控工具RseQC安装使用
  6. 安装SqlServer 2008 R2时出现程序兼容性问题
  7. Django 2.1.7 项目技巧 - 创建apps应用目录归纳所有应用
  8. Linux上安装VIM
  9. php array assoc,PHP array_udiff_assoc 函数
  10. 阿里、京东、百度“激战”互联网医疗