从 VBA 调用自定义 Python COM 对象
Posted
技术标签:
【中文标题】从 VBA 调用自定义 Python COM 对象【英文标题】:Calling custom Python COM object from VBA 【发布时间】:2014-05-09 14:24:59 【问题描述】:我有一个 python 脚本,我将其转换为 COM 服务器。现在我想从 VBA (Access) 调用它。
我试过这个:
Sub test()
Dim PyScript
Dim var
Set PyScript = CreateObject("PythonDemos.CodeScript")
var = PyScript.CodeReader()
Debug.Print var
End Sub
但我在 CreateObject(...) 处收到错误: 自动化错误 2147024770
根据我的阅读,这意味着找不到模块“PythonDemos”。
这是python代码:
class Main:
_public_methods_ = ['CodeReader']
_reg_progid_ = "PythonDemos.CodeScript"
_reg_clsid_ = "B74B241B-0699-4332-8145-145512D332D1"
def CodeReader(self, item=None):
#do stuff here and return values
if __name__ == '__main__':
win32com.server.register.UseCommandLine(Main)
它自己运行良好,注册为 COM 服务器没有问题。
我的问题是:如何从 vba 中正确调用这个 python 脚本?我的错在哪里?
【问题讨论】:
【参考方案1】:经过大量的试验和错误后,我得到了它的工作。 VBA 中的语法是正确的,但我更新了 Python 脚本。我不确定,但我认为
pythoncom.CLSCTX_LOCAL_SERVER
成功了。我只是有点困惑,因为 PyCharm 告诉我它不是一个有效的命令。只是忽略了这一点并像这样扩展标题
class Main:
_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
_reg_clsid_ = "F223CC90-AB60-442C-BE81-C79701C47059"
_reg_desc_ = "Python Code Reader"
_reg_progid_ = "PythonDemos.CodeScript"
_public_methods_ = ['CodeReader', 'test']
_readonly_attrs_ = []
_public_attrs_ = []
def test(self):
return "Test Erfolgreich"
def CodeReader(self):
#calculate and return stuff...
if __name__ == '__main__':
if hasattr(sys, 'importers'):
if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]:
win32com.server.register.UseCommandLine(Main)
else:
from win32com.server import localserver
localserver.serve('F223CC90-AB60-442C-BE81-C79701C47059')
else:
win32com.server.register.UseCommandLine(Main)
我还不能说底部的代码是否像 .exe 文件那样工作,但对于 .py 文件却是这样。
【讨论】:
以上是关于从 VBA 调用自定义 Python COM 对象的主要内容,如果未能解决你的问题,请参考以下文章
尝试调用外部 VBA 函数时,只能强制在公共对象模块中定义的用户定义类型