尝试 运行 宏时 Python 中不断 pywintypes.com_error
Incessant pywintypes.com_error in Python when trying to run a macro
我只想打开一个 .xlsm 文件,运行一个宏,保存工作簿,然后退出。理想情况下,我可以将宏作为变量传递,因为不同的情况会 运行 位于同一工作簿中的不同宏。这是到目前为止的代码。
import os, sys
import win32com.client
location = input("AOC or LOC")
macroBook = 'C:/path/to/workbook/solar.xlsm'
macro = 'solar.xlsm!Module1.Tag' + location
try:
if os.path.exists(macroBook):
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename=macroBook)
xl.Application.Run(macro) #Getting the error at this line
xl.Application.Save()
xl.Application.Quit()
del xl
except:
print("Unexpected error:" sys.exc_info()[0])
我终于得到了 运行 的宏,但是当宏完成后我仍然得到同样的错误。这对我来说是一个很大的进步,因为在我根本无法将宏设置为 运行 之前,但是这个程序对我来说是无用的,如果它只是在宏完成后出错。
所以我什至不知道要解决什么问题。宏 运行s 但我被困在宏没有 运行 时的同一行。我曾经有 64 位版本,这就是导致问题的原因,但我已经切换到 32 位 python。
会不会因为宏需要 2-4 分钟才能 运行 而出错?也许它不是在等待它完成?我不知所措。如果需要,也愿意 post 我的宏。
编辑:我删除了 Application.Save 行。代码现在如下所示。
import os, sys
import win32com.client
location = input("AOC or LOC")
taggedData = 'C:/path/to/new/file.csv'
macroBook = 'C:/path/to/workbook/solar.xlsm'
macro = 'solar.xlsm!Module1.Tag' + location
try:
if os.path.exists(macroBook):
conn = win32com.client.Dispatch('ADODB.Connection')
conn.CommandTimeout = 3600
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename=macroBook)
xl.Application.Run(macro) #Getting the error at this line
for sheet in xl1.Worksheets:
if sheet.Name == "Sheet1":
nwb = xl.WorkbookAdd()
sheet.Copy(Before=nwb.Sheet(1))
nwb.SaveAs(taggedData)
nwb.Close(True)
xl.Application.Quit()
del xl
except:
print("Unexpected error:" sys.exc_info()[0])
现在我在 conn.Open()
收到名称错误。不确定应该如何实施。
我很确定您的 COM 接口超时了。我在从 py / excel 操作数据库时遇到过类似的错误...尝试像这样添加 命令超时 :
conn = win32com.client.Dispatch('ADODB.Connection')
conn.CommandTimeout = 3600
否则,如果您专门使用Excel/Python,如果您使用xlwings 库。我给你举个例子,建议导入 xlwings.
假设您设置了这样的宏:
Sub my_macro()
RunPython ("import my_module; my_module.my_macro()")
End Sub
在 Python 中烹饪:
import os
from xlwings import Workbook, Range
def my_macro():
wb = Workbook.caller()
Range('A1').value = 1
# Now basically add whatever you want right here
if __name__ == '__main__':
# Expects the Excel file next to this source file, adjust accordingly.
path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'myfile.xlsm'))
Workbook.set_mock_caller(path)
my_macro()
使用上面的源代码结构,将您想要的任何内容放入 my_macro():
否则,文档在这里,很简单:http://xlwings.org/ .
我只想打开一个 .xlsm 文件,运行一个宏,保存工作簿,然后退出。理想情况下,我可以将宏作为变量传递,因为不同的情况会 运行 位于同一工作簿中的不同宏。这是到目前为止的代码。
import os, sys
import win32com.client
location = input("AOC or LOC")
macroBook = 'C:/path/to/workbook/solar.xlsm'
macro = 'solar.xlsm!Module1.Tag' + location
try:
if os.path.exists(macroBook):
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename=macroBook)
xl.Application.Run(macro) #Getting the error at this line
xl.Application.Save()
xl.Application.Quit()
del xl
except:
print("Unexpected error:" sys.exc_info()[0])
我终于得到了 运行 的宏,但是当宏完成后我仍然得到同样的错误。这对我来说是一个很大的进步,因为在我根本无法将宏设置为 运行 之前,但是这个程序对我来说是无用的,如果它只是在宏完成后出错。
所以我什至不知道要解决什么问题。宏 运行s 但我被困在宏没有 运行 时的同一行。我曾经有 64 位版本,这就是导致问题的原因,但我已经切换到 32 位 python。
会不会因为宏需要 2-4 分钟才能 运行 而出错?也许它不是在等待它完成?我不知所措。如果需要,也愿意 post 我的宏。
编辑:我删除了 Application.Save 行。代码现在如下所示。
import os, sys
import win32com.client
location = input("AOC or LOC")
taggedData = 'C:/path/to/new/file.csv'
macroBook = 'C:/path/to/workbook/solar.xlsm'
macro = 'solar.xlsm!Module1.Tag' + location
try:
if os.path.exists(macroBook):
conn = win32com.client.Dispatch('ADODB.Connection')
conn.CommandTimeout = 3600
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename=macroBook)
xl.Application.Run(macro) #Getting the error at this line
for sheet in xl1.Worksheets:
if sheet.Name == "Sheet1":
nwb = xl.WorkbookAdd()
sheet.Copy(Before=nwb.Sheet(1))
nwb.SaveAs(taggedData)
nwb.Close(True)
xl.Application.Quit()
del xl
except:
print("Unexpected error:" sys.exc_info()[0])
现在我在 conn.Open()
收到名称错误。不确定应该如何实施。
我很确定您的 COM 接口超时了。我在从 py / excel 操作数据库时遇到过类似的错误...尝试像这样添加 命令超时 :
conn = win32com.client.Dispatch('ADODB.Connection')
conn.CommandTimeout = 3600
否则,如果您专门使用Excel/Python,如果您使用xlwings 库。我给你举个例子,建议导入 xlwings.
假设您设置了这样的宏:
Sub my_macro()
RunPython ("import my_module; my_module.my_macro()")
End Sub
在 Python 中烹饪:
import os
from xlwings import Workbook, Range
def my_macro():
wb = Workbook.caller()
Range('A1').value = 1
# Now basically add whatever you want right here
if __name__ == '__main__':
# Expects the Excel file next to this source file, adjust accordingly.
path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'myfile.xlsm'))
Workbook.set_mock_caller(path)
my_macro()
使用上面的源代码结构,将您想要的任何内容放入 my_macro():
否则,文档在这里,很简单:http://xlwings.org/ .