VBA循环遍历命名区域:INDIRECT函数变体类型调用问题
解决VBA循环遍历命名区域指向单元格的问题
问题原因
你原来的代码报错,是因为[](等价于Evaluate函数)里的内容会被当作Excel工作表公式解析,而非VBA代码。当你写[indirect("item"&i)]时,公式里的i会被Excel当作单元格引用(比如查找名为i的单元格),而不是VBA中定义的变量i,自然无法识别出正确的命名区域。
解决方案
方法1:拼接完整Excel公式后执行
把包含变量i的命名区域名称先拼成完整的INDIRECT公式字符串,再传给Evaluate执行,让Excel正确解析命名区域:
Sub LoopThroughItems() Dim i As Integer Dim targetCell As Range For i = 1 To 100 ' 拼接成"INDIRECT(item1)"、"INDIRECT(item2)"这类完整公式 Set targetCell = Evaluate("INDIRECT(item" & i & ")") ' 示例操作:修改目标单元格的值 targetCell.Value = "更新值_" & i Next i End Sub
方法2:直接通过VBA Names集合操作
跳过Excel公式,直接用VBA的Names对象获取命名区域对应的单元格,再读取其中存储的目标单元格地址:
Sub LoopThroughItems_Alternative() Dim i As Integer Dim itemName As String Dim itemCell As Range ' 存储item1、item2等命名区域本身的单元格(存着目标地址) Dim targetCell As Range ' 最终要操作的目标单元格 For i = 1 To 100 itemName = "item" & i ' 获取命名区域对应的单元格 Set itemCell = ThisWorkbook.Names(itemName).RefersToRange ' 从itemCell的内容中提取目标单元格地址,转为Range对象 Set targetCell = Range(itemCell.Value) ' 示例操作:给目标单元格赋值 targetCell.Value = 200 + i Next i End Sub
注意事项
- 确保所有
item1到item100的命名区域都已正确定义,且每个区域都是单个单元格,里面存储的是合法的单元格引用(如AM100)。 - 如果你的命名区域是工作表级别的,需要把
ThisWorkbook换成对应的工作表对象(比如Sheet1)。
内容的提问来源于stack exchange,提问作者Adrian Muntean
相关产品推荐
相关产品推荐

