2016-12-15 2 views
2

Я пытаюсь передать переменную Nothing в VBA, используя Python's win32com. Я попытался использовать None, но он вернулся «Type dismatch».Передача переменной `Nothing` с помощью` win32com` Python

Не могли бы вы помочь?

Спасибо!

Пример:

' 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) 

РЕПЛ говорит:

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

Вы передали 'None' или' 'None''? –

+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 используется в качестве значения неинициализированного по умолчанию для только два типы: Object или Variant, который обычно ссылается на COM объекты (например, библиотека объектов Excel или библиотека объектов внешнего приложения). Невозможно присвоить примитивные целые, длинные и строковые типы VBA значение Nothing. И обычно программисты используют это в конце блока кода для освобождения объектов из памяти.

Следовательно, нет строгого перевода между Nothing (специальным значением для типов COM) V и типами значений Python, включая None, который грубо означает пустое или нет значения для любого типа.

С учетом этого ваш код не будет ошибочным, если вы передадите COM-объект, который вы уже инициализировали с помощью xl. Ниже выходы 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 
+0

Спасибо, Parfait! Я вижу там логику. Жаль, что я использую API SolidWorks (программное обеспечение 3D CAD), которое требует «Ничего» в качестве входного аргумента для определенных целей. Наверное, я могу обернуть его кодом VBA и вместо этого называть обертку всякий раз, когда требуется «Ничто» - не красиво, но выполнимо. Еще раз спасибо! –

Смежные вопросы