Python如何为同一Excel工作簿不同工作表分别运行指定宏
问题根源
macro()是xlwings提供的工作簿(Book)级方法,仅能通过Book对象调用,你最初的代码直接将wb/ws赋值为工作表(Sheet)对象,本身就不满足宏调用的对象要求,宏自然无法执行。- 重复调用
xw.Book()打开同一路径的xlsm文件,会生成两个互相独立的工作簿实例,后续的保存、关闭逻辑会出现冲突,也会干扰宏的运行环境。 - 未在VBA代码中硬编码指定操作工作表的宏,默认仅会对当前处于激活状态的工作表生效,你最初的代码没有切换工作表激活状态的逻辑,自然所有宏都会默认运行在首次打开的Sheet1上。
修正后可直接运行的代码
import xlwings as xw # 仅打开一次目标工作簿,绑定为Book对象 target_book = xw.Book(r'C:\Users\Trial.xlsm') # 所有宏都通过工作簿对象加载,不需要绑定到工作表 macro_dwell = target_book.macro("Module1.dwell") macro_hide = target_book.macro("Module2.hide") # 激活Sheet1后运行对应宏 target_book.sheets['Sheet1'].activate() macro_dwell() # 切换激活Sheet2后运行第二个宏 target_book.sheets['Sheet2'].activate() macro_hide() # 工作簿仅需保存、关闭一次即可 target_book.save(r'C:\Users\Trial.xlsm') target_book.close()
补充说明
如果你的VBA宏内部已经硬编码了固定操作的工作表(比如写死了Sheets("Sheet1").XXX这类逻辑),上述工作表激活的操作不会生效,需要修改VBA代码:要么给宏增加工作表入参,要么将宏内的固定工作表引用改为对当前活动表的引用。
内容的提问来源于stack exchange,提问作者Lote_marsk_chozey
相关产品推荐
相关产品推荐

