2016-12-15 43 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'时调用包装器 - 不是很漂亮但是可行。再次感谢! –