如何在VBA二维数组的For Each循环中获取元素索引?
在VBA For Each循环中获取二维数组元素的索引
嘿,我来帮你搞定这个问题~ 首先得明确:VBA里的For Each遍历数组时,是直接迭代元素值的,不会自动返回元素的索引位置。不过有两种靠谱的方法可以实现你想要的效果,我给你详细说说:
方法1:改用索引式For循环(最推荐)
如果可以的话,放弃For Each,改用基于数组索引的循环,这样就能直接拿到元素的行/列索引,既直观又高效。比如调整你的代码:
' 遍历Table1的所有元素(假设Table1是二维数组,VBA默认数组索引从1开始) For i = LBound(Table1, 1) To UBound(Table1, 1) For j = LBound(Table1, 2) To UBound(Table1, 2) vElement = Table1(i, j) ' 这里i就是vElement的行索引,j是列索引,直接用就行 ' 接着遍历Table2的元素 For k = LBound(Table2, 1) To UBound(Table2, 1) For l = LBound(Table2, 2) To UBound(Table2, 2) vElement2 = Table2(k, l) If ws_1.Cells(1, c) = vElement Then For Row = 3 To lastRow amountValue = amountValue + ws_1.Cells(Row, c).Value ws_2.Cells(row2, colIlosc) = amountValue ' 这里直接写入vElement的索引,比如行索引i ws_2.Cells(row2, [你的索引列位置]) = i ws_2.Cells(row2, columncodeprod) = vElement2 row2 = row2 + 1 amountValue = 0 Next Row End If Next l Next k Next j Next i
这种方法没有额外的查找开销,数组越大优势越明显,而且完全不会有歧义。
方法2:保留For Each,通过匹配元素找索引
如果一定要保留For Each循环的写法,那可以在拿到元素值后,遍历数组的索引去匹配,找到对应的位置。代码示例:
For Each vElement In Table1 ' 查找vElement在Table1中的索引 Dim elemRowIdx As Long, elemColIdx As Long Dim isFound As Boolean isFound = False For i = LBound(Table1, 1) To UBound(Table1, 1) For j = LBound(Table1, 2) To UBound(Table1, 2) If Table1(i, j) = vElement Then elemRowIdx = i elemColIdx = j isFound = True Exit For ' 找到第一个匹配项就退出内层循环 End If Next j If isFound Then Exit For ' 退出外层循环 Next i ' 同理查找vElement2的索引 For Each vElement2 In Table2 Dim elem2RowIdx As Long, elem2ColIdx As Long isFound = False For k = LBound(Table2, 1) To UBound(Table2, 1) For l = LBound(Table2, 2) To UBound(Table2, 2) If Table2(k, l) = vElement2 Then elem2RowIdx = k elem2ColIdx = l isFound = True Exit For End If Next l If isFound Then Exit For Next k If ws_1.Cells(1, c) = vElement Then For Row = 3 To lastRow amountValue = amountValue + ws_1.Cells(Row, c).Value ws_2.Cells(row2, colIlosc) = amountValue ' 这里使用找到的vElement索引,比如行索引elemRowIdx ws_2.Cells(row2, [你的索引列]) = elemRowIdx ws_2.Cells(row2, columncodeprod) = vElement2 row2 = row2 + 1 amountValue = 0 Next Row End If Next vElement2 Next vElement
⚠️ 注意:如果数组里有重复的元素,这种方法只会返回第一个匹配元素的索引。如果你的业务需要处理重复值,得根据实际情况调整逻辑。
小提示
- 用
LBound(数组名, 维度)和UBound(数组名, 维度)可以准确获取数组的起始和结束索引,避免硬编码出错(比如有些数组可能是从0开始的)。 - 优先用方法1,不仅性能更好,代码逻辑也更清晰;方法2只适合必须保留
For Each的场景。
内容的提问来源于stack exchange,提问作者Yanger
相关产品推荐
相关产品推荐

