在python代码中调用vba宏的四种方法
在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宏的四种方法相关推荐
- python可以实现哪些功能_Python中实现机器学习功能的四种方法介绍
本篇文章给大家带来的内容是关于Python中实现机器学习功能的四种方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在本文中,我们将介绍从数据集中选择要素的不同方法; 并使用S ...
- JavaScript 循环中调用异步函数的三种方法,及为什么 forEach 无法工作的分析
JavaScript 循环中调用异步函数的三种方法,及为什么 forEach 无法工作的分析 业务分析 初版的问题 解决方案 传统的 for 循环 不使用 for 循环的解决方案 分析 forEach ...
- python怎么清屏_python实现清屏的方法 Python Shell中清屏一般有两种方法。
Python Shell 怎样清屏? Python Shell中清屏一般有两种方法. 奈何一个人随着年龄增长,梦想便不复轻盈:他开始用双手掂量生活,更看重果实而非花朵.--叶芝<凯尔特的搏暮&g ...
- java 中lock,java中lock获取锁的四种方法
在java接口中会存放着许多方法,方便线程使用时的直接调用.对于lock接口大家都不陌生,我们已经初步对概念进行了理解.那么在获取锁的方法上想必还不是很清楚.下面我们就lock获取锁的四种方法分别进行 ...
- 在Action类中获得HttpServletResponse对象的四种方法
Struts2:在Action类中获得HttpServletResponse对象的四种方法 在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和req ...
- java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())
Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...
- Java中字符串中子串的查找共有四种方法(indexof())
2019独角兽企业重金招聘Python工程师标准>>> public class FirstDemo { /** *API中String的常用方法 */ // 查找指定字符串是否存在 ...
- 如何连接远程数据oracle数据库代码,Oracle连接远程数据库的四种方法
Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍 第一种方法: 若oracle服务器装在本机上,那就不多说了,连 ...
- 【转】Java中字符串中子串的查找共有四种方法(indexof())
原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下: 1.int ...
最新文章
- 我为什么暂时放弃了React Native
- ASP.NET中 分析器错误:发现不明确的匹配
- python中datetime模块_python中的datetime模块
- 也许90%的人都没有真正搞懂性能优化
- 干货 | 27 个问题,告诉你 Python 为什么如此设计?
- gridview添加header
- linux 释放进程res_linux下查询进程占用的内存方法总结
- client心跳 websocket_理解websocket的原理
- 【T+】取消记账提示入库失败,请至少选择两个字
- 百度网盘断点续传下载工具IDM
- c语言中sub指令,sub指令(汇编语言sub用法)
- PHP生成唯一订单号 阿星小栈
- 貂蝉待你玩转Java王者荣耀
- 安卓统一推送联盟成立!不卡顿的安卓系统终于来了!
- 硬盘提示设备未就绪要如何办啊
- 正则表达式--教程二(语法)
- java菜鸟2:java指令
- 四川高考成绩排名查询2021,2020年四川高考成绩排名查询系统 四川高考位次排名表...
- Skeletal Animation(骨骼动画)
- 自己写 Netfilter 匹配器
热门文章
- 腾讯2021年第六届「共 见」运维技术沙龙
- ModelX一款开源的机器学习模型管理仓库
- 有关RO2模拟器与开私服的一点联想
- 基于JavaSwing和BeautyEye美化包实现的小型资源管理器
- [DAY3]用VBA实现复制EXCEL第一行数据到最后一行
- 黑客讲故事:攻下隔壁女生路由器后,我都做了些什么【转】
- 趁火打劫!“疫情做饵”的网络攻击来了
- ubuntu16.04使用wine安装Wechat、QQ、Tim等windows软件
- 【腾讯T6技术专家时间管理法】工作中别做这七件浪费时间的事了!
- dspic33E单片机IOPUWR复位原因之一 程序监控定时器