VBA中多个打开工作簿含同名工作表时如何指定目标工作簿
VBA同名工作表引用规则及适配方案
1. 无限定引用的匹配规则
使用Tab1!R1C1这类不加工作簿限定的写法,不会默认指向代码所在工作簿,实际匹配优先级如下:
- 优先匹配当前处于激活状态的工作簿内名为Tab1的工作表
- 若激活工作簿无对应工作表,会按打开顺序遍历所有已打开工作簿,返回第一个匹配到的Tab1工作表
2. 明确指定工作簿的引用方法
要完全避免匹配歧义,直接在引用前增加工作簿限定即可,通用格式为'[工作簿完整文件名]Tab1'!目标地址,如果工作簿名包含空格、特殊字符,必须用单引号将[文件名]表名整体包裹。
- 引用代码所在工作簿的Tab1:使用内置关键字
ThisWorkbook,写法示例:"'[" & ThisWorkbook.Name & "]Tab1'!R1C1" - 引用其他已打开工作簿的Tab1(假设工作簿名为
业务数据.xlsx):写法示例:"'[业务数据.xlsx]Tab1'!R1C1"
3. ChangePivotCache场景适配示例
ChangePivotCache的SourceData参数支持传入标准R1C1格式的地址字符串,直接按照上述规则拼接即可,参考代码:
Sub 动态修改透视表数据源() Dim 目标工作簿 As Workbook Dim 目标工作表 As Worksheet Dim 透视表 As PivotTable Dim 源地址 As String ' 绑定已打开的外部工作簿 Set 目标工作簿 = Workbooks("业务数据.xlsx") Set 目标工作表 = 目标工作簿.Worksheets("Tab1") ' 绑定当前工作簿内的透视表对象 Set 透视表 = ThisWorkbook.Worksheets("统计页").PivotTables("月度统计透视表") ' 自动获取目标工作表已使用区域,拼接符合要求的SourceData字符串 源地址 = "'[" & 目标工作簿.Name & "]" & 目标工作表.Name & "'!" & 目标工作表.UsedRange.Address(ReferenceStyle:=xlR1C1) ' 刷新透视表缓存 透视表.ChangePivotCache SourceType:=xlDatabase, SourceData:=源地址 End Sub
内容的提问来源于stack exchange,提问作者michael
相关产品推荐
相关产品推荐

