Excel VBA:如何在For Each循环中获取当前元素的行列位置
Excel VBA: For Each循环中提取单元格地址与行列索引
直接使用rng时,VBA会默认引用其Value属性,所以你的MsgBox显示的是单元格值而非地址。要获取地址、行列索引或把符合条件的地址存入数组,可参考以下方法:
1. 获取单元格地址
- 完整绝对地址(如
$A$1):调用rng.Address - 相对地址格式(如
A1):调用rng.Address(False, False),参数用于取消行和列的绝对引用标记
2. 获取行列索引
- 行号:
rng.Row(返回数字,例如A1的行号为1) - 列号:
rng.Column(返回数字,例如A列的列号为1) - 列标(如"A"):可以用
Split(rng.Address, "$")(1)提取,或者对列号转换:Chr(rng.Column + 64)(仅适用于A-Z列,列数超过26时需用更复杂的转换逻辑)
修改后的测试代码
Sub test() Dim rng As Range For Each rng In Range("A1:A10") rng.Value = rng.Value + 10 ' 显示单元格相对地址 VBA.Interaction.MsgBox prompt:=rng.Address(False, False) ' 可选:显示行号和列号 ' VBA.Interaction.MsgBox prompt:="行:" & rng.Row & ",列:" & rng.Column Next rng End Sub
3. 将符合条件的单元格地址存入数组
以下示例筛选值大于20的单元格,把它们的地址存入动态数组:
Sub SaveQualifiedAddresses() Dim rng As Range Dim addrArr() As String Dim arrIndex As Integer arrIndex = 0 ReDim addrArr(0) ' 初始化动态数组 For Each rng In Range("A1:A10") ' 自定义条件:单元格值大于20 If rng.Value > 20 Then addrArr(arrIndex) = rng.Address(False, False) arrIndex = arrIndex + 1 ReDim Preserve addrArr(arrIndex) ' 扩展数组容量 End If Next rng ' 移除数组末尾的空元素(如果有符合条件的单元格) If arrIndex > 0 Then ReDim Preserve addrArr(arrIndex - 1) End If ' 测试输出数组内容(在立即窗口显示) Dim i As Integer For i = LBound(addrArr) To UBound(addrArr) Debug.Print addrArr(i) Next i End Sub
内容的提问来源于stack exchange,提问作者Imach
相关产品推荐
相关产品推荐

