我有一个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
成功了。我只是有点困惑,因为皮查姆告诉我这不是一个有效的命令。只是忽略了这一点,像这样展开了标题
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文件却是这样。