如何在VBA中正确使用INDIRECT函数引用其他工作簿工作表
解决动态引用工作表名称的VBA复制问题
我来帮你修正这段VBA代码的问题——你遇到的核心问题是混淆了Excel工作表函数和VBA的语法逻辑,直接把INDIRECT函数嵌套在Sheets()参数里是行不通的。我们需要用VBA的方式动态获取单元格中存储的工作表名称,再基于这个名称完成复制操作,具体方案如下:
原代码的错误分析
你尝试用Sheets("Indirect('[ASE RTU Addressing with Automation.xlsm]' & ""'Tab Names from white book'"" & ""!A1"")).Select"这行代码,本质是把Excel的INDIRECT工作表函数当成了字符串传递给Sheets(),VBA会把整个函数文本当作工作表名称去查找,自然找不到对应的工作表,所以报错。而直接写固定工作表名称时,Sheets("2S0 P143 MAIN BUS SECTION")是正确的直接引用语法,所以能正常运行。
修正后的完整代码
我们可以通过先读取单元格中的工作表名称,再基于这个名称引用源工作簿的工作表,同时加入错误检查避免运行报错:
Sub CopyDynamicSheet() ' 1. 打开源工作簿并赋值给变量,方便后续引用 Dim sourceWB As Workbook Set sourceWB = Workbooks.Open(Filename:="D:\Projects\ASE Templates\ASE Template White Book.xlsx") ' 2. 获取当前工作簿中存储工作表名称的单元格值 ' 假设当前工作簿是"ASE RTU Addressing with Automation.xlsm",表名是"Tab Names from white book",值存在A1单元格 Dim targetSheetName As String targetSheetName = ThisWorkbook.Sheets("Tab Names from white book").Range("A1").Value ' 3. 检查目标工作表是否存在于源工作簿中(可选但推荐) On Error Resume Next Dim sourceSheet As Worksheet Set sourceSheet = sourceWB.Sheets(targetSheetName) On Error GoTo 0 ' 4. 执行复制操作(如果工作表存在) If Not sourceSheet Is Nothing Then ' 将指定工作表复制到当前工作簿的第4个工作表之后 sourceSheet.Copy After:=ThisWorkbook.Sheets(4) MsgBox "工作表 '" & targetSheetName & "' 复制成功!" Else MsgBox "错误:源工作簿中不存在名为 '" & targetSheetName & "' 的工作表!" End If ' 可选:如果不需要保留源工作簿打开,可以关闭它 ' sourceWB.Close SaveChanges:=False End Sub
关键说明
- 用
ThisWorkbook指代当前运行代码的工作簿,比用文件名引用更可靠,避免文件名变化导致出错 - 先读取单元格值到变量
targetSheetName,再用这个变量作为Sheets()的参数,实现动态引用 - 加入错误检查逻辑,避免因单元格值错误或工作表不存在导致程序崩溃
内容的提问来源于stack exchange,提问作者Richard Hannigan
相关产品推荐
相关产品推荐

