在python代码中调用vba宏

工作以python为主体,但是遇到了一些word操作的需求(详见上一篇),这个需求用word自带的功能会很容易实现,于是就想着能不能用python调用宏来处理。

网上找了一圈,发现了一大堆方法(因为一个个都在我那诡异的工作环境下全失败了所以真的找了很多),给各位罗列一下。

本文使用win32com库。

①在文档中存入宏,直接调用。

import win32com
from win32com.client import Dispatchdef updateContent(url):docApp = win32com.client.DispatchEx('Word.Application')try:doc = docApp.Documents.Open(url)doc.Run('...宏名称,不用带括号...')doc.Save()print("宏运行成功")except Exception as e:print(e)#保证即使出错也能关掉窗口,否则后台会出现大量word进程且可能占用文件docApp.Quit()if __name__ == "__main__":updateContent("D:/testdocx.docm")x = input()

遇到的问题:很显然,这需要文档中本来就有宏,而且必须得保存为docm格式。而且对于一个新文件,设置不当的话还得打开一下确定启用宏(即使开了低安全度视软件版本也有这个可能)。

②变体1:保存为docx格式

前略,try:doc = docApp.Documents.Open('原始url.docm')doc.Run('宏名称,不用带括号')docApp.DisplayAlerts = Falsedoc.SaveAs('另一个url.docx')print("宏运行成功")except Exception as e:                               后略。

如上所述。excel似乎需要更多类似DisplayAlerts = False的操作,但word只需要改变这一项即可不保存宏。

③变体2:从别的文件中调用宏

前略,try:doc = docApp.Documents.Open('原始url.docx')doc.Run('带宏文件url.docm!里面的一个宏名')doc.Save()print("宏运行成功")except Exception as e:                               后略。

“!”符号使你能指定将另一个文件中的宏在本文件中运行。

两个变体的问题:
两个变体都涉及到了对复数文件的操作。这在我的电脑上是没有问题的,但是在实际工作用的电脑上一直报错pywintypes.com_error:(-2147352567,‘发生意外。’,(0,None,None,None,0,-2147024891),None)。

网上对这个问题的说明是文件占用(打开着),但是我很确信没有。排查测试的结果是只要只涉及一个文件必不报错,涉及多个文件必报错。

不知道是那台电脑上只有wps的原因还是纯内网+云电脑的环境有什么奇怪的设置。(我甚至报过’RPC服务器不可用’,完全不能理解为什么,明明好好地开着)

④为什么我之前没有搜到直接写代码的?

这是我使用的宏代码:(作用是更新目录且只更新页码,见上一篇文章)

Sub UpdateContent()Dim aStory As RangeDim aField As FieldFor Each aStory In ActiveDocument.StoryRangesFor Each aField In aStory.Fieldsif aField.Type == 37:aField.UpdateNext aFieldNext aStory
End Sub

这是我最后实际使用的python代码:

import win32com
from win32com.client import Dispatchdef updateContent(url):docApp = win32com.client.DispatchEx('Word.Application')try:doc = docApp.Documents.Open(url)for aRange in doc.StoryRanges:for aField in aRange.Fields:if aField.Type == 37:aField.Update()doc.Save()print("目录更新成功")except Exception as e:print(e)#保证即使出错也能关掉窗口,否则后台会出现大量word进程且可能占用文件docApp.Quit()if __name__ == "__main__":updateContent("D:/testdocx.docx")x = input()

是的,这就是巨硬的兼容力。直接用就完事了。没有文件问题,没有docxdocm的格式问题,甚至不需要“启用宏”。我浪费的一整天的时间究竟是……

根据MSDN的文档,VB整体都.net化了。所以基本都是可以直接用的。

!!!注意:!!!
python并不在.net文档列明的支持语言中,所以并不一定可以使用所有vb代码。但至少本文所涉的没有问题。建议各位具体使用时尝试一下,不行的话就用方法123,毕竟正常的电脑上是不该出现我遇到的问题的。

在python代码中调用vba宏的四种方法相关推荐

  1. python可以实现哪些功能_Python中实现机器学习功能的四种方法介绍

    本篇文章给大家带来的内容是关于Python中实现机器学习功能的四种方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在本文中,我们将介绍从数据集中选择要素的不同方法; 并使用S ...

  2. JavaScript 循环中调用异步函数的三种方法,及为什么 forEach 无法工作的分析

    JavaScript 循环中调用异步函数的三种方法,及为什么 forEach 无法工作的分析 业务分析 初版的问题 解决方案 传统的 for 循环 不使用 for 循环的解决方案 分析 forEach ...

  3. python怎么清屏_python实现清屏的方法 Python Shell中清屏一般有两种方法。

    Python Shell 怎样清屏? Python Shell中清屏一般有两种方法. 奈何一个人随着年龄增长,梦想便不复轻盈:他开始用双手掂量生活,更看重果实而非花朵.--叶芝<凯尔特的搏暮&g ...

  4. java 中lock,java中lock获取锁的四种方法

    在java接口中会存放着许多方法,方便线程使用时的直接调用.对于lock接口大家都不陌生,我们已经初步对概念进行了理解.那么在获取锁的方法上想必还不是很清楚.下面我们就lock获取锁的四种方法分别进行 ...

  5. 在Action类中获得HttpServletResponse对象的四种方法

    Struts2:在Action类中获得HttpServletResponse对象的四种方法 在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和req ...

  6. java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...

  7. Java中字符串中子串的查找共有四种方法(indexof())

    2019独角兽企业重金招聘Python工程师标准>>> public class FirstDemo { /** *API中String的常用方法 */ // 查找指定字符串是否存在 ...

  8. 如何连接远程数据oracle数据库代码,Oracle连接远程数据库的四种方法

    Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍 第一种方法: 若oracle服务器装在本机上,那就不多说了,连 ...

  9. 【转】Java中字符串中子串的查找共有四种方法(indexof())

    原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下: 1.int ...

最新文章

  1. 我为什么暂时放弃了React Native
  2. ASP.NET中 分析器错误:发现不明确的匹配
  3. python中datetime模块_python中的datetime模块
  4. 也许90%的人都没有真正搞懂性能优化
  5. 干货 | 27 个问题,告诉你 Python 为什么如此设计?
  6. gridview添加header
  7. linux 释放进程res_linux下查询进程占用的内存方法总结
  8. client心跳 websocket_理解websocket的原理
  9. 【T+】取消记账提示入库失败,请至少选择两个字
  10. 百度网盘断点续传下载工具IDM
  11. c语言中sub指令,sub指令(汇编语言sub用法)
  12. PHP生成唯一订单号 阿星小栈
  13. 貂蝉待你玩转Java王者荣耀
  14. 安卓统一推送联盟成立!不卡顿的安卓系统终于来了!
  15. 硬盘提示设备未就绪要如何办啊
  16. 正则表达式--教程二(语法)
  17. java菜鸟2:java指令
  18. 四川高考成绩排名查询2021,2020年四川高考成绩排名查询系统 四川高考位次排名表...
  19. Skeletal Animation(骨骼动画)
  20. 自己写 Netfilter 匹配器

热门文章

  1. 腾讯2021年第六届「共 见」运维技术沙龙
  2. ModelX一款开源的机器学习模型管理仓库
  3. 有关RO2模拟器与开私服的一点联想
  4. 基于JavaSwing和BeautyEye美化包实现的小型资源管理器
  5. [DAY3]用VBA实现复制EXCEL第一行数据到最后一行
  6. 黑客讲故事:攻下隔壁女生路由器后,我都做了些什么【转】
  7. 趁火打劫!“疫情做饵”的网络攻击来了
  8. ubuntu16.04使用wine安装Wechat、QQ、Tim等windows软件
  9. 【腾讯T6技术专家时间管理法】工作中别做这七件浪费时间的事了!
  10. dspic33E单片机IOPUWR复位原因之一 程序监控定时器