尝试 运行 宏时 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/ .