从VBA调用自定义Python COM对象 [英] Calling custom Python COM object from VBA

查看:215
本文介绍了从VBA调用自定义Python COM对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆