《超简单:用 Python 让 Excel 飞起来》读书笔记:9.2.1 通过命令创建文件并调用 Python 自定义函数
个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化《超简单用 Python 让 Excel 飞起来》读书笔记9.2.1 通过命令创建文件并调用 Python 自定义函数1. 问题背景与写作目标2. 适用场景与限制条件3. 核心原理xlsm、py、xlwings 三件套4. 手动创建工程目录与文件4.1 使用 PowerShell 创建目录4.2 手动创建 xlsm 工作簿5. 编写 Python 自定义函数6. 在 VBA 中调用 Python 自定义函数6.1 打开 VBA 编辑器6.2 推荐写法sys.path.append 指定脚本目录6.3 更适合交付的写法从 Config 工作表读取路径7. 运行宏并验证结果7.1 成功后应该看到什么8. 常见问题与踩坑记录8.1 提示找不到 demo 模块8.2 提示没有 xlwings 模块8.3 宏被禁用8.4 32 位与 64 位兼容问题9. 效果验证不要只看“有没有报错”10. 我的总结提升11. 发布版补充我建议这样使用这篇笔记1. 问题背景与写作目标在 Excel 自动化里很多人一开始喜欢用 xlwings quickstart 快速生成工程因为它确实方便命令一敲工作簿、Python 文件、基础结构都帮你准备好了。但在真实办公环境里事情往往没有这么顺。比如企业电脑权限受限、宏策略严格、工程目录必须放在指定路径、Excel 文件已经存在或者你不想让工具自动生成一堆自己不清楚用途的文件。这时继续依赖 quickstart反而会让工程变得不可控。所以本篇的核心目标就是手动搭建一套 Excel Python 调用闭环自己创建 xlsm 工作簿自己创建 py 脚本再通过 VBA 的 RunPython 调用 Python 自定义函数最后把处理结果写回 Excel。这张图展示了本文要实现的整体效果Excel 作为入口Python 作为处理引擎xlwings 作为桥梁把“点击按钮执行自动化”的流程串起来。从这张图中我们可以看出这套方案的关键不是“代码有多复杂”而是工程结构要清楚Excel 负责触发Python 负责计算结果再回到 Excel 展示。这比单独写一个 Python 脚本更适合交付给非技术同事使用。2. 适用场景与限制条件这套手动模式适合以下几类场景已经有现成 Excel 模板不方便用 quickstart 重新生成公司环境限制命令行生成文件Python 脚本需要放在固定工程目录、Git 目录或共享盘目录想把 Excel 做成一个“操作界面”让用户点按钮即可执行 Python想明确控制 VBA、Python、配置路径、输出结果之间的关系。推荐使用手动模式的核心原因是可控。你知道每个文件是自己创建的也知道 VBA 为什么能找到 Python 脚本后期排障不会陷入“工具自动生成了什么我也不清楚”的尴尬。但要注意这套方案依赖 Excel 宏、xlwings、Python 环境。如果企业电脑禁用宏或者当前 Excel 调用的 Python 环境没有安装 xlwings就会执行失败。因此本文不是“零环境依赖”的方案而是“工程结构更可控”的方案。3. 核心原理xlsm、py、xlwings 三件套先不要急着写代码先把结构搞清楚。手动模式的最小闭环只需要三个关键对象Excel 宏工作簿demo.xlsmPython 脚本文件demo.pyxlwings 桥接能力VBA 中通过RunPython调用 Python本质上Excel 并不是直接执行 Python而是通过 xlwings 提供的 VBA 接口把执行请求交给 Python 解释器。Python 执行完成后再通过 xw.Book.caller() 找回当前工作簿把结果写回指定 Sheet。这张图展示了手动模式的核心结构xlsm py xlwings 三件套共同构成 Excel 调用 Python 的基础链路。从这张图中可以看出Excel 和 Python 不是谁替代谁而是分工协作Excel 更适合做人机交互和结果展示Python 更适合做数据处理和自动化逻辑。这也是办公自动化最常见、最容易落地的架构。可以用下面这张流程图理解调用过程用户打开 demo.xlsm点击按钮或执行宏VBA 调用 RunPythonsys.path 指向 Python 脚本目录import demo 并执行 demo.mainPython 读取 Excel 数据Python 处理数据结果写回 Report 工作表用户在 Excel 中查看结果4. 手动创建工程目录与文件我建议先把目录结构固定下来不要把 Excel 和 Python 文件随便丢在桌面。目录一乱后面 import 找不到模块、路径写错、同事迁移失败都会变成低级但很烦的故障。推荐目录结构如下D:\ExcelPythonDemo\ ├─ demo.xlsm └─ py\ └─ demo.py这张图展示了手动创建工程文件的过程先创建宏工作簿再创建 Python 脚本并把两者放在同一个清晰的工程目录中。这一步的核心要点是不要只关注文件能不能运行还要关注后续是否容易维护。目录结构越清晰后面写 VBA 路径、迁移给同事、排查模块导入问题就越简单。4.1 使用 PowerShell 创建目录可以用 PowerShell 创建基础目录New-Item-ItemType Directory-PathD:\ExcelPythonDemo\py-Force如果你想顺手创建一个空的 Python 文件也可以继续执行New-Item-ItemType File-PathD:\ExcelPythonDemo\py\demo.py-Force4.2 手动创建 xlsm 工作簿Excel 宏工作簿建议手动创建打开 Excel新建空白工作簿点击“文件” → “另存为”文件类型选择Excel 启用宏的工作簿*.xlsm保存为D:\ExcelPythonDemo\demo.xlsm注意如果保存成 .xlsx后续 VBA 宏代码无法正常保存。要调用 Python必须使用支持宏的 .xlsm 文件。5. 编写 Python 自定义函数接下来在 D:\ExcelPythonDemo\py\demo.py 中写入 Python 代码。这里我用一个最容易理解的例子读取 Sheet1 中 A1:A20 的数值然后统计数量、总和、平均值、最大值、最小值最后写入 Report 工作表。先安装依赖pipinstallxlwingsPython 示例代码如下importxlwingsasxwdefsummarize(values): 将 Excel 读取到的数据转换成数值列表并计算基础统计结果。 nums[]ifisinstance(values,list):forrowinvalues:ifisinstance(row,list):forvinrow:ifvisNoneorv:continuetry:nums.append(float(v))exceptException:passelse:ifrowisNoneorrow:continuetry:nums.append(float(row))exceptException:passelse:try:nums.append(float(values))exceptException:passifnotnums:returnNonereturn{count:len(nums),sum:sum(nums),avg:sum(nums)/len(nums),max:max(nums),min:min(nums),}defmain(): Excel VBA 通过 RunPython 调用的入口函数。 wbxw.Book.caller()src_sheetSheet1src_rangeA1:A20out_sheetReport# 如果 Report 工作表不存在就自动创建sheet_names[s.nameforsinwb.sheets]ifout_sheetnotinsheet_names:wb.sheets.add(out_sheet)shtwb.sheets[src_sheet]valuessht.range(src_range).value resultsummarize(values)outwb.sheets[out_sheet]ifresultisNone:out.range(A1).value没有可用数值数据returnout.range(A1).value[[指标,值],[数量 count,result[count]],[总和 sum,result[sum]],[平均 avg,result[avg]],[最大 max,result[max]],[最小 min,result[min]],]这里最关键的是 xw.Book.caller()。它表示Python 不是随便打开一个 Excel 文件而是获取“当前调用它的那个工作簿”。这样 VBA 从 demo.xlsm 调用 Python 时Python 就能把结果写回当前文件。推荐把业务逻辑封装成函数。比如上面的 summarize() 只负责统计main() 只负责和 Excel 交互。这样以后你要替换业务逻辑不需要重写 Excel 调用部分。6. 在 VBA 中调用 Python 自定义函数Python 写完之后还差最关键的一步让 Excel 能找到并执行这个 Python 文件。这里要用 VBA 的 RunPython。这张图展示了 VBA 调用 Python 的核心链路Excel 中的宏先通过 sys.path.append 指向脚本目录再 import demo最后执行 demo.main()。从这张图中我们可以看出RunPython 本身不是难点真正容易出错的是路径。只要 Python 脚本目录没有被加入 sys.pathVBA 就很可能找不到 demo.py。6.1 打开 VBA 编辑器操作步骤打开demo.xlsm按Alt F11打开 VBA 编辑器插入一个标准模块写入下面的宏代码。6.2 推荐写法sys.path.append 指定脚本目录Option Explicit Sub RunPython_Manual() Python 脚本所在目录 Dim pyDir As String pyDir D:\ExcelPythonDemo\py RunPython import sys; _ sys.path.append(r pyDir ); _ import demo; _ demo.main() End Sub我更推荐这种写法。因为它不依赖系统环境变量也不要求你修改 PYTHONPATH。脚本在哪VBA 就明确指向哪排障时也更容易定位。注意import demo 对应的是 demo.py 文件名。如果你的文件叫 report_tool.py这里就要写 import report_tool不能乱改。6.3 更适合交付的写法从 Config 工作表读取路径如果你准备把这个文件交给同事使用不建议让他们改 VBA。更好的方式是在 Excel 中建一个 Config 工作表把 Python 脚本目录写在 B2 单元格中。Option Explicit Sub RunPython_ByConfig() Dim pyDir As String pyDir ThisWorkbook.Worksheets(Config).Range(B2).Value RunPython import sys; _ sys.path.append(r pyDir ); _ import demo; _ demo.main() End Sub这样同事迁移目录时只需要改 Excel 单元格不需要打开 VBA 编辑器。这就是从“自己能跑”走向“别人也能用”的关键一步。7. 运行宏并验证结果当 VBA 和 Python 都准备好后可以在 Sheet1 的 A1:A20 中随便输入一些数字例如10 20 30 40 50然后执行宏 RunPython_Manual。如果配置正确Python 会读取这些数据并在 Report 工作表中写入统计结果。这张图展示了最终的一键运行效果用户在 Excel 中点击运行宏Python 完成数据处理结果再写回 Excel 报表区域。从这张图中可以看出最终交付给用户的不是一段 Python 代码而是一个 Excel 操作入口。这才是办公自动化真正有价值的地方让复杂处理隐藏在按钮背后让使用者只关心结果。7.1 成功后应该看到什么成功运行后Report 工作表中应该出现类似结果指标 值 数量 count 5 总和 sum 150 平均 avg 30 最大 max 50 最小 min 10只要 Report 工作表能自动生成并且统计结果正确写入就说明 Excel → VBA → Python → Excel 的调用闭环已经跑通。8. 常见问题与踩坑记录8.1 提示找不到 demo 模块常见报错类似ModuleNotFoundError: No module named demo这个问题通常不是 Python 代码错了而是 VBA 没有正确指定脚本目录。重点检查sys.path.append(rD:\ExcelPythonDemo\py)路径必须指向 demo.py 所在的文件夹而不是 demo.py 文件本身。8.2 提示没有 xlwings 模块如果报错No module named xlwings说明当前 Excel 调用的 Python 环境没有安装 xlwings。处理方法是确认 Excel 使用的是哪个 Python 环境然后在对应环境中执行pipinstallxlwings很多人电脑里装了多个 Python命令行能跑不代表 Excel 调用的那个环境也能跑。这是最容易误判的地方。8.3 宏被禁用如果点击按钮没有反应或者 Excel 提示宏被禁用需要检查文件是否为.xlsm是否点击了“启用内容”信任中心是否允许宏文件是否位于受信任位置企业安全策略是否禁止 VBA 宏。企业环境中宏策略可能由管理员统一控制普通用户不一定有权限自行放开。这种情况下不要反复改代码应先确认策略边界。8.4 32 位与 64 位兼容问题如果环境比较老可能遇到 Office 位数、Python 位数不一致引发的问题。一般建议保持64 位 Office 64 位 Python32 位 Office 32 位 Python。新环境优先使用 64 位 Office 与 64 位 Python。除非公司旧系统有特殊兼容要求否则不要主动选择 32 位环境。9. 效果验证不要只看“有没有报错”很多新手验证脚本时只看有没有弹报错。这个标准太低了。真正的验证至少要看三层宏是否成功触发 PythonPython 是否读取到了正确的 Excel 区域结果是否按预期写回了目标 Sheet。建议你每次测试时都按下面这个最小验证清单执行验证项正确表现执行宏不出现 VBA 或 Python 报错Report 工作表自动创建或自动更新统计结果count、sum、avg、max、min 与源数据一致修改源数据后再次运行Report 结果同步变化移动工程目录后Config 路径修改后仍可运行只有源数据变化后结果也能重新计算并写回才说明这个自动化流程真正可复用。10. 我的总结提升这一节最值得记住的不是某一行 VBA 或 Python 代码而是这套工程化思路Excel 做入口Python 做处理xlwings 做桥梁最终把结果写回 Excel。相比 quickstart 自动生成工程手动模式的价值在于你能清楚知道每个文件的作用、每条路径为什么这么写、每一步失败时该查哪里。真正能交付的自动化不是“我电脑上能跑”而是“换一台电脑、换一个目录、换一个用户也能通过清晰配置跑起来”。如果只会复制 RunPython 代码但不能解释 sys.path、demo.py、main()、Book.caller() 分别解决什么问题后面一定会卡在环境迁移和排障上。所以我建议把本文这套结构沉淀成自己的 Excel Python 工程模板。以后无论是做数据清洗、批量生成报表、自动统计工单还是给同事做一个可点击的 Excel 工具都可以从这个模板继续扩展。11. 发布版补充我建议这样使用这篇笔记这一节在学习路径中的价值是从“Python 能处理 Excel”进一步走向“Excel 能调用 Python”。这一步很关键因为真实办公场景里不是每个同事都会打开命令行也不是每个用户都愿意运行 .py 文件。当你把 Python 能力封装到 Excel 按钮后使用门槛会明显降低。对使用者来说他只是在 Excel 里点了一下按钮但对开发者来说背后已经完成了路径配置、Python 调用、数据读取、业务处理和结果回写。我建议后续继续补两类内容一类是“如何把 Python 结果写成格式化报表”另一类是“如何把按钮、配置页、日志页做成完整的 Excel 工具界面”。这样这套读书笔记就不只是学习记录而是能沉淀成真正可复用的办公自动化工具库。返回顶部 返回顶部点击回到顶部