VBA如何获取Range对象范围内指定索引位置的单元格
非连续Range对象的Item属性是相对于该Range左上角单元格的工作表相对偏移,而非Range遍历顺序的索引,所以当你用非连续的Range调用Item时,只会基于左上角的$M$125做偏移,Item(0)就是向上偏移1行的$M$124,Item(2)就是向下偏移1行的$M$126,不会跨区域取到后面的$M$148、$M$161。
以下是两种常用的实现方案:
方案1:预存到自定义数组(最通用,支持任意Range结构)
你可以先把Range内的所有单元格按For Each的遍历顺序存入数组,之后就可以像数组一样按索引访问,还可以自定义用0基还是1基索引:
' 定义0基数组,和你想要的索引逻辑一致,索引2对应第三个单元格 Dim cellArr() As Range, i As Long ReDim cellArr(0 To searchResult.Count - 1) i = 0 Dim cell As Range For Each cell In searchResult Set cellArr(i) = cell i = i + 1 Next ' 直接按索引取,索引2即可返回$M$161 Debug.Print cellArr(2).Address
方案2:用Areas属性(仅适合Range由多个单单元格区域拼接的场景)
你当前示例中的searchResult是3个独立的单单元格组成的非连续范围,每个单元格对应Range的Areas集合中的一个元素,Areas为1基索引,你可以直接访问:
Debug.Print searchResult.Areas(3).Address ' 输出$M$161 ' 如果要适配0基逻辑,直接索引值+1即可 Debug.Print searchResult.Areas(2 + 1).Address
注意如果你的Range后续会出现类似$M$125:$M$127这种连续多单元格区域,Areas会把整个连续区域算成一个元素,这时候请用方案1。
内容的提问来源于stack exchange,提问作者smirnoff103
相关产品推荐
相关产品推荐

