使用未知数量的参数从python调用vba宏

时间:2019-10-01 16:07:31

标签: python excel vba

目标是拥有一个可重用的python函数,该函数使用win32.com从VBA Excel中调用一个宏,并使用**kwargs或其他可以传递未知数量参数的方法来实现此功能。

没有发现使用**kwargs和明确的win32.com的特定问题,尽管发现了一些类似的问题,即使没有完全相似的问题,也没有答案被接受。 以下是一些类似但不相似的问题:

使用python

def run_vba_macro(str_path, str_modulename, str_macroname, **kwargs):
    if os.path.exists(str_path):
        xl=win32com.client.DispatchEx("Excel.Application")
        wb=xl.Workbooks.Open(str_path, ReadOnly=0)
        xl.Visible = True
        if kwargs:
                xl.Application.Run(os.path.basename(str_path)+"!"+str_modulename+'.'+str_macroname,
                                          **kwargs)
        else:
              xl.Application.Run(os.path.basename(str_path)
                                          +"!"+str_modulename
                                          +'.'+str_macroname)
        wb.Close(SaveChanges=0)
        xl.Application.Quit()
        del xl

#example
kwargs={'str_file':r'blablab'}
run_vba_macro(r'D:\arch_v14.xlsm',
              str_modulename="Module1",
              str_macroname='macro1',
              **kwargs)
#other example
kwargs={'arg1':1,'arg2':2}
run_vba_macro(r'D:\arch_v14.xlsm',
              str_modulename="Module1",
              str_macroname='macro_other',
              **kwargs)

使用VBA

Sub macro1(ParamArray args() as Variant)
    MsgBox("success the str_file argument was passed as =" & args(0))
End Sub

Sub macro_other(ParamArray args() as Variant)
    MsgBox("success the arguments have passed as =" & str(args(0)) & " and " & str(args(1)))
End Sub

预期结果是VBA中的MessageBox:

  • 成功将str_file参数传递为= blablab
  • 成功将参数传递为= 1和2

1 个答案:

答案 0 :(得分:4)

在python中,\Bkwargs,因此它不能通过COM传递。将dict作为kwargs.values数组传递,如下所示:

*args

enter image description here