调用一个宏到不同的工作簿中的Python代码
调用一个宏到不同的工作簿中的Python代码
我正在尝试通过使用Python和Excel来自动化一些我需要为报告做的事情,以使我的生活变得更轻松。我创建了一个专门用于宏的Excel工作簿(启用了宏),例如,当我按下ctrl+R时,它会删除我不需要的报告中的任何空格和括号。我的问题是如何打开宏工作簿,然后打开我需要使用宏的其他报告。\n这是我当前的代码:\n
import xlwings as xw wb = xw.books.open(r'macrofile.xlsb', r'reportthatneedswork.csv') macroname = wb.macro('MacroName') macroname()
\n它只打开了宏工作簿,但没有打开其他报告,也没有执行任何操作。
问题:如何在Python中调用不同工作簿的宏?
原因:根据所找到的信息,xlwings没有提供一种直接执行外部工作簿宏的方法。最接近的方法是使用win32com提取和移动vb脚本,然后使用xlwings打开并运行宏。然而,对于您的情况来说,这可能有些过于复杂。如果您只是重新编写宏,将其转换为Python代码会更加简单。
解决方法:首先,您可以使用xlwings将宏代码重写为Python代码。然后,您可以使用xlwings的App对象打开不同的工作簿并运行相应的宏。以下是一个示例代码,演示了如何使用xlwings在不同工作簿中调用宏:
import xlwings as xw def python_macro(wb_path, app): wb = app.books.open(wb_path) sheet = wb.sheets.active # 在此处将宏代码重写为Python代码 print(sheet.range('A1').value) with xw.App() as app: # 通过命令行参数传递工作簿路径 for arg in sys.argv[1:]: path = join(os.getcwd(), arg) if os.path.isdir(path): # 可选择处理更多子目录 files = [f for f in listdir(path) if isfile(join(path, f))] for file in files: python_macro(file, app) elif os.path.isfile(path): python_macro(path, app)
将以上代码保存在与报告文件相同的目录中,并通过以下方式运行它:
python macro.py reportthatneedswork.csv anotherreport.csv report-sub-dir
这样,您就可以在不同的工作簿中调用宏了。