gpt4 book ai didi

python - 从 VBA 调用自定义 Python COM 对象

转载 作者:行者123 更新时间:2023-11-28 19:21:41 26 4
gpt4 key购买 nike

我有一个 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 脚本?我的错误在哪里?

最佳答案

经过大量的尝试和错误,我让它工作了。 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 文件它是。

关于python - 从 VBA 调用自定义 Python COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23567064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com