2014-05-09 99 views
3

我有一個python腳本,我轉換成COM服務器。現在我想從VBA(Access)調用它。從VBA調用COM對象

我已經試過這樣:

Sub test() 
    Dim PyScript 
    Dim var 

    Set PyScript = CreateObject("PythonDemos.CodeScript")  
    var = PyScript.CodeReader()  
    Debug.Print var  
End Sub 

,但我得到的創建對象錯誤(...): 自動化錯誤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腳本?我的錯誤在哪裏?

回答

0

經過大量的試驗和錯誤,我得到它的工作。 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文件是頭。