如何从模板工作表运行宏?模板更新后宏执行问题求助
问题解决:从Excel模板新建工作簿后执行宏的方案
问题背景
从模板打开工作簿,用户修改每周工作日数量后,需要覆盖原模板保存,再基于更新后的模板创建新工作簿,并运行模板中的TRANSFERDATES宏。但原代码中通过硬编码未保存工作簿的名称调用宏会失败,且Application.Run不支持template参数。
解决方案
核心是捕获新建工作簿的对象引用,直接通过对象调用宏,而非依赖不确定的文件名。同时可简化流程,去掉中间工作簿以减少复杂操作。
方案1:简化流程,移除中间工作簿
修改原模板中的代码,直接完成保存模板、关闭自身、从模板新建工作簿并执行宏的全流程:
Sub UpdateTemplateAndNewWorkbook() ' 定义模板路径 Dim templatePath As String templatePath = "Y:\RUN ORDER\TEMPLATES\POSITION TEMPLATE.XLSM" ' 保存当前工作簿为模板,覆盖原文件 ActiveWorkbook.SaveAs Filename:=templatePath, FileFormat:=52 ' 关闭当前工作簿(已保存,无需再次保存) Application.DisplayAlerts = False ActiveWorkbook.Close SaveChanges:=False Application.DisplayAlerts = True ' 从更新后的模板新建工作簿,并捕获工作簿对象 Dim newWB As Workbook Set newWB = Workbooks.Add(Template:=templatePath) ' 直接通过工作簿对象调用内部宏 Application.Run "'" & newWB.Name & "'!TRANSFERDATES" End Sub
方案2:保留中间工作簿的修改版本
若必须保留中间工作簿逻辑,修改MIDDLEMAN代码,通过对象引用调用宏:
Sub MIDDLEMAN() Dim templatePath As String templatePath = "Y:\RUN ORDER\TEMPLATES\POSITION TEMPLATE.xlsm" ' 关闭原模板工作簿 Application.DisplayAlerts = False Workbooks("POSITION TEMPLATE.XLSM").Close SaveChanges:=True Application.DisplayAlerts = True ' 从模板新建工作簿并捕获对象 Dim newWB As Workbook Set newWB = Workbooks.Add(Template:=templatePath) ' 通过动态获取的工作簿名称调用宏 Application.Run "'" & newWB.Name & "'!TRANSFERDATES" End Sub
关键说明
- 用
Workbook对象捕获新建文件,避免依赖未保存工作簿的默认名称(如POSITION TEMPLATE1) Application.Run的正确调用格式为Application.Run "'工作簿名称'!宏名称",通过newWB.Name可动态获取当前新建工作簿的名称- 简化流程后可减少跨工作簿操作的复杂度,降低出错概率
内容的提问来源于stack exchange,提问作者Seb358
相关产品推荐
相关产品推荐

