使用Python的win32com传递变量“Nothing”

2024-07-05 14:47:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python的win32com在VBA中传递变量Nothing。我试图使用None,但它返回了'typedismatch'

谁能帮忙吗?在

谢谢你!在

例如:

' 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中:

^{pr2}$

回复说:

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)

Tags: inpytestnonelibdownloadslinesite
1条回答
网友
1楼 · 发布于 2024-07-05 14:47:12

在VBA中,Nothing仅用作两种类型的未初始化默认值:Object或{},它们通常引用COM对象(即Excel对象库或外部应用程序的对象库)。不能为vbeem>long类型赋值。通常程序员在代码块的末尾使用它来释放内存中的对象。在

因此,VBA的Nothing(COM类型的一个特殊值)和Python的值类型(包括None)之间没有严格的转换,这粗略地表示任何类型的为空或没有值。在

也就是说,如果传递一个已经用xl初始化的COM对象,那么代码就不会出错。下面的输出FAILURE。如果您可以声明一个未初始化的COM对象,该对象将不携带任何内容,那么您可以将其传递到函数中。但是调用Dispatch需要一个命名对象。22号线!在

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

相关问题 更多 >