VBA中使用INDIRECT函数动态引用Excel指定表格表头的实现方法
解决方法
你不需要在VBA的Range参数中直接嵌入INDIRECT工作表函数,只需要先读取单元格存储的表名,再拼接成结构化引用字符串即可,修改后的完整代码如下:
Sub Makro1() Dim tableName As String ' 读取SH1工作表A1单元格中存储的目标表格名称 tableName = Sheets("SH1").Range("A1").Value Sheets("Data").Select ' 拼接结构化引用字符串定位表格表头 Range(tableName & "[#Headers]").Select ' 定义名称时同步使用拼接后的引用 ActiveWorkbook.Names.Add Name:="Labelname", RefersToR1C1:="=" & tableName & "[#Headers]" ActiveWorkbook.Names("Labelname").Comment = "" ' 注意你原代码中此处名称拼写错误:Labename → Labelname,会导致运行报错 End Sub
原写法失效原因
- VBA的
Range方法仅接受合法的地址字符串作为参数,不能直接识别嵌入的工作表函数语法 - 字符串拼接逻辑错误:VBA的
&拼接符号需要写在引号外部,不能放在地址字符串内部
如果一定要用INDIRECT函数实现,也可以通过Application.Evaluate调用工作表函数,写法参考:
Range(Application.Evaluate("INDIRECT(""SH1!A1"")&""[#Headers]""")).Select
该方案可读性和运行效率都远低于第一种,不推荐使用。
内容的提问来源于stack exchange,提问作者Ken Kaneki
相关产品推荐
相关产品推荐

