从VBA调用自定义Python COM对象 [英] Calling custom Python COM object from VBA
问题描述
我有一个python脚本,已将其转换为COM服务器。现在我想从VBA(访问)中调用它。
我已经尝试过:
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):
#在这里做一些事情并返回值
如果__name__ =='__main__':
win32com.server.register.UseCommandLine(Main)
它可以很好地运行,并且未经专业人士注册
我的问题是:如何从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代码阅读器
_reg_progid_ = PythonDemos.CodeScript
_public_methods_ = ['CodeReader,'test' ]
_readonly_attrs_ = []
_public_attrs_ = []
def测试(自己):
返回 Test Erfolgreich
def CodeReader(自身):
#计算并返回内容...
如果__name__ =='__main__':
如果hasattr (sys,进口商):
,如果在sys.argv [1:]中使用'--register'或在sys.argv [1:]中使用'--unregister':
win32com.server.register .UseCommandLine(Main)
其他:来自win32com.server的
import localserver
localserver.serve('{F223CC90-AB60-442C-BE81-C79701C47059}')
其他:
win32com.server.r egister.UseCommandLine(Main)
我还不能说底部的代码是否像它应该用于.exe文件,但是对于.py文件。
I have a python script which i converted into a COM server. Now i want to call it from VBA (Access).
I have tried this:
Sub test()
Dim PyScript
Dim var
Set PyScript = CreateObject("PythonDemos.CodeScript")
var = PyScript.CodeReader()
Debug.Print var
End Sub
But i get an error at CreateObject(...): Automation error 2147024770
From what i read this means that the module "PythonDemos" can not be found.
Here is the python code:
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)
It runs well on its own and was registered without problems as COM server.
My Question is: How to call this python script correctly from vba? Where is my mistake?
After a lot of trial and error I got it to work. The syntax in VBA was correct, but i updated the Python script. I am not sure, but i think the
pythoncom.CLSCTX_LOCAL_SERVER
did the trick. I was just a little confused because PyCharm told me that it is not a valid command. Just ignored that and expanded the header like this
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)
I can't yet say if the code at the bottom is working like it is supposed to for an .exe file but for the .py file it is.
这篇关于从VBA调用自定义Python COM对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!