Вызов макроса vba из python с неизвестным количеством аргументов - PullRequest
0 голосов
/ 01 октября 2019

Цель состоит в том, чтобы иметь повторно используемую функцию 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

Ожидаемый результат - MessageBox в VBA:

  • success аргумент str_file передан как = blablab
  • success аргументы переданы как = 1 и 2

1 Ответ

4 голосов
/ 01 октября 2019

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...