【问题标题】:Calling custom Python COM object from VBA从 VBA 调用自定义 Python COM 对象
【发布时间】: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 脚本?我的错在哪里?

【问题讨论】:

    标签: python vba com


    【解决方案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 文件却是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-05
      • 2021-09-14
      • 1970-01-01
      • 2020-05-24
      • 2014-02-05
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多