【问题标题】:Calling vba macro from python with unknown number of arguments使用未知数量的参数从 python 调用 vba 宏
【发布时间】:2019-10-01 16:07:31
【问题描述】:

目标是拥有一个可重用的 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

【问题讨论】:

    标签: python excel vba


    【解决方案1】:

    在 python 中,kwargs 是一个dict,所以它不是可以通过 COM 传递的东西。将kwargs.values 作为*args 数组传递,如下所示:

    params_for_excel = list(kwargs.values())
    
    xl.Application.Run(os.path.basename(str_path)+"!"+str_modulename+'.'+str_macroname,
                                          *params_for_excel)
    

    【讨论】:

    • 很好,我认为这个答案很好。记得修正加星标的表情:应该是*params_for_excel,欢呼
    • @FranciscoCosta 在我运行它时似乎没有必要,但如果您想详细说明为什么您认为这是必需的,请这样做,我会考虑编辑:)
    • 嗯,很有趣,所以 ParamArray 可以与 python 位置参数 *args 一起使用。发送元组(即*params_for_excel, 也可以)你认为使用一个或另一个有什么区别吗?即传递一个元组或将位置参数传递给 ParamArray VBA 参数。
    • 我不认为有任何区别——*args 一个元组。添加逗号不会改变这一点。 *params_for_excel 是一个元组,是否有尾随逗号。
    • 你能给个链接吗?因为 *args 没有相应地返回元组 因为a=*[1,2], 返回元组,而如果你不使用尾随逗号,你就不能这样做。直觉上*args不是一个元组,它就像一个参数的“抽象序列”,虽然不是Python序列,但*用于指定参数是位置的,这在函数中用于指定位置参数时有意义.不像*[1,2],是一个元组,这里*是用来解包列表并转换成元组的。
    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 2020-12-06
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多