如何在python中触发excel中的vba宏

问题描述

编一个自动处理数据的py,包含宏的excel是继承的别人的,里面有按钮可以点击计算。现在想做的就是编写python可以自动的点击这个按钮或者自动的触发宏,不需要返回值,计算结果能跟手动一样返回在excel中即可。

已经试过的方法

宏名称是all_transport1(),两种方法都是网上查了资料找到的。

1,用excel appilication直接运行,代码如下:

xlApp.Run('all_transport1()')

没有报错,整个运行结束,但是宏的结果没有显示在excel中

2,用ExecuteExcel4Macro函数,代码如下:

strPara = xlBook.Name + 'all_transport1()'
status = xlApp.ExecuteExcel4Macro(strPara)

运行之后报错代码如下:

File "<COMObject Excel.Application>", line 2, in ExecuteExcel4Macro
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', "There's a problem with this formula.\n\nNot trying to type a formula?\nWhen the first character is an equal (=) or minus (-) sign, Excel thinks it's a formula:\n\n• you type:   =1+1, cell shows:   2\n\nTo get around this, type an apostrophe ( ' ) first:\n\n• you type:   '=1+1, cell shows:   =1+1", 'xlmain11.chm', 0, -2146827284), None)

报错信息没看明白。。。

有什么好的方法可以实现触发宏么???

问题已解决,解决办法:

1.参考采纳的回答:第一种方法中,参数"all_transport1()"的括号不需要,只提供宏名称就行了

import win32com.client
import os.path

xlApp = win32com.client.DispatchEx('Excel.Application')
xlsPath = os.path.expanduser(r'文件路径')
wb = xlApp.Workbooks.Open(Filename=xlsPath)
xlApp.Run('宏名称')
wb.Save()
xlApp.Quit()
print("执行成功")

2.第二种方法,宏名称前需要加一个!叹号,也就是把

strPara = xlBook.Name + 'all_transport1()'

改成

strPara = xlBook.Name + '!all_transport1()'

第一种方式,参数"all_transport1()"的括号不需要,只提供宏名称就行了

import win32com.client
import os.path

xlApp = win32com.client.DispatchEx('Excel.Application')
xlsPath = os.path.expanduser(r'文件路径')
wb = xlApp.Workbooks.Open(Filename=xlsPath)
xlApp.Run('宏名称')
wb.Save()
xlApp.Quit()
print("执行成功")

https://stackoverflow.com/questions/19616205/running-an-excel-macro-via-python

https://www.cnblogs.com/russellluo/archive/2011/10/16/2214347.html