2016-12-15 46 views
2

我想通過使用Python的win32com在VBA中傳遞變量Nothing。我試圖使用None,但它返回'類型不匹配'。使用Python的`win32com`傳遞變量`Nothing`

任何人都可以請幫忙嗎?

謝謝!

一個例子:

' Book1.xlsm!Module1 
Function test(arg As Object) As String 
    If arg Is Nothing Then 
     test = "Success" 
     Exit Function 
    Else 
     test = "Failure" 
     Exit Function 
    End If 

End Function 

而且在Python:

import win32com.client 
import os 
import pythoncom 


xl = win32com.client.Dispatch('Excel.Application') 
xl.Visible = True 
xl.Workbooks.Open(Filename=os.path.abspath('Book1.xlsm')) 
test_str = xl.Application.Run('Book1.xlsm!Module1.test', pythoncom.Empty) 

的REPL表示:

runfile('C:/Users/shwang/Downloads/untitled0.py', wdir='C:/Users/shwang/Downloads') 
Traceback (most recent call last): 

    File "<ipython-input-22-301693920f2c>", line 1, in <module> 
    runfile('C:/Users/shwang/Downloads/untitled0.py', wdir='C:/Users/shwang/Downloads') 

    File "C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile 
    execfile(filename, namespace) 

    File "C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile 
    exec(compile(f.read(), filename, 'exec'), namespace) 

    File "C:/Users/shwang/Downloads/untitled0.py", line 16, in <module> 
    test_str = xl.Application.Run('Book1.xlsm!Module1.test', pythoncom.Empty) 

    File "<COMObject <unknown>>", line 14, in Run 

    File "C:\Anaconda3\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_ 
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) 

com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147352561), None) 
+0

您是否通過了「無」或「無」? –

+0

您可能可以使用'pythoncom.Empty'。請參閱[此消息](https://mail.python.org/pipermail/python-win32/2009-February/008826.html) –

+0

也http://www.programcreek.com/python/example/36145/pythoncom。缺失 –

回答

1

在VBA,Nothing用作未初始化默認值只有兩個類型:ObjectVariant通常引用COM對象(即Excel對象庫或外部應用程序的對象庫)。 VBA的原始整型,長整型和字符串類型不能分配Nothing值。通常,程序員在代碼塊的末尾使用它來釋放內存中的對象。

因此,存在VBA的Nothing Python的值類型,包括None這粗略地用於任何類型空的或者沒有值(一個專用COM類型值)之間並沒有嚴格的翻譯。

就是說,如果你傳遞一個COM對象,你已經用xl進行了初始化,你的代碼就不會出錯。以下產出FAILURE。如果不知何故,你可以聲明一個未初始化的COM對象,然後將攜帶Nothing然後你可以將它傳遞給你的函數。但要撥打Dispatch需要一個命名對象。第二十二條軍規!

import win32com.client 
import os 

try: 
    xl = win32com.client.Dispatch('Excel.Application') 
    xl.Visible = True 

    wb = xl.Workbooks.Open(Filename=os.path.abspath('Book1.xlsm')) 
    test_str = xl.Application.Run('test', xl) 
    print(test_str) 
    # FAILURE 

    wb.Close(False) 
    xl.Quit 

except Exception as e: 
    print(e) 

finally: 
    wb = None 
    xl = None 
+0

謝謝你Parfait!我看到那裏的邏輯。太糟糕了,我使用SolidWorks API(一種3D CAD軟件),它需要'Nothing'作爲輸入參數用於某些目的。我想我可以用VBA代碼包裝它,並且每當需要'Nothing'時調用包裝器 - 不是很漂亮但是可行。再次感謝! –