Excel VBA如何从其他宏调用Workbook对象内的宏
跨工作簿宏调用实现方法
Application.Run不会自动解析字符串字面量内的变量名,直接把对象变量名写在引号里的写法,会让VBA把AssociateTemplateFile识别为工作簿的实际名称去匹配,必然会调用失败。
正确写法
拼接Workbook对象的.Name属性构造合法的宏路径字符串即可,示例代码如下:
' 适配场景:AddDataValidation宏存放于目标工作簿的标准模块中 Application.Run "'" & AssociateTemplateFile.Name & "'!AddDataValidation"
关键注意点
- 工作簿名称两侧的单引号不可省略,即使文件名不含空格也建议保留,可规避特殊字符、长文件名导致的宏匹配失败问题
- 工作簿名和宏名之间的
!前后不要加多余空格,此前测试代码中!前的多余空格也会触发调用错误 - 如果目标宏存放在工作表模块、ThisWorkbook模块等类模块中,需要补充模块限定名,例如宏写在目标工作簿的Sheet1模块内时,调用代码需调整为:
Application.Run "'" & AssociateTemplateFile.Name & "'!Sheet1.AddDataValidation"
- 如果被调用的宏需要传入参数,直接在宏路径字符串后按顺序追加参数即可,例如给
AddDataValidation传入1个范围参数的写法为:
Application.Run "'" & AssociateTemplateFile.Name & "'!AddDataValidation", Sheets("Sheet1").Range("A1:A10")
备选实现方式
如果目标工作簿存储路径固定不变,可在VBA编辑器的「工具-引用」菜单中选中该工作簿完成前期绑定,后续可直接像调用本工作簿内的过程一样调用目标宏,无需使用Application.Run。但该方式灵活性差,一旦工作簿路径变更就会触发引用错误,动态打开工作簿的场景不推荐使用。
内容的提问来源于stack exchange,提问作者Chis.Wisselo
相关产品推荐
相关产品推荐

