如何通过 Python 以 IRibbonControl 作为参数的 win32com 运行 vba 宏

How to run a vba macro through Python win32com that has IRibbonControl as a parameter

我想 运行 一个 vba 宏,它使用 Python win32com 将 IRibbonControl 作为参数。

例如,我的 vba 子如下所示

Public Sub test(control As IRibbonControl)

    blabla

End Sub

然后 Python 使用 win32com 调用测试子。

我们应该把什么放在测试函数的参数上?

import os
import win32com.client

from win32com.client import DispatchEx

xl = DispatchEx('Excel.Application')
xl.Workbooks.Open("myexcelfile.xlsm")

xl.Application.Run("test", some magic needs here)

您需要在 python 端有一个实现 IRibbonControl 的对象,并将其作为参数传递回 Excel。

我认为这有意义的唯一方法(但我持开放态度)是将 COM 加载项 (https://support.microsoft.com/en-us/kb/291392) 实现为 IDTExensibility2。然后将调用 OnConnection 方法(在您的 python COM 服务器中),它为您提供 Excel 应用程序对象。

从那里,您很可能会获得对功能区控件的引用。

我必须承认,尽管我尝试过,但到目前为止我还没有设法让任何 python COM Excel 加载项自己工作。

或者你不能更好地从 sub 中的 excel 应用程序获取 IRibbonControl,并将其从参数列表中删除吗?

通常该参数是为了捕获来自功能区的自定义功能区调用。 如果你正在使用 Python,那么你就没有使用 Ribbon,然后你可以绕过它,这并不适用于所有用例,尽管它适用于我的和大多数情况。

Public Sub test(Optional control As IRibbonControl)

    blabla

End Sub

简单地将参数用作可选参数可能会有所帮助。

import os
import win32com.client

from win32com.client import DispatchEx

xl = DispatchEx('Excel.Application')
xl.Workbooks.Open("myexcelfile.xlsm")

xl.Application.Run("test")