Excel VBA:如何确定单元格相对于指定Range区域的行、列位置?
如何获取单元格在指定区域内的相对行、列位置?
先看这段简化的VBA函数:
Private Function FindJimmy(rngMyRange As Range) As Long Dim oneCell As Range rngMyRange.Cells(2,2) = "Jimmy" For Each oneCell In rngMyRange If oneCell.Value = "Jimmy" Then Debug.Print oneCell.Row, oneCell.Column FindJimmy = oneCell.Row Exit Function End If Next oneCell FindJimmy = 0 End Function
当前代码里的Debug.Print输出的是单元格在整个工作表里的绝对行号和列号。比如假设rngMyRange起始于绝对位置Cells(5,5),找到的目标单元格绝对位置是(6,6),它相对于rngMyRange的位置应该是(2,2)。
获取相对位置的两种实用方法:
方法一:直接计算差值(最直观高效)
用目标单元格的绝对行列号,减去区域起始单元格的绝对行列号,再加1就能得到相对位置:
- 相对行号:
oneCell.Row - rngMyRange.Row + 1 - 相对列号:
oneCell.Column - rngMyRange.Column + 1
把原代码里的Debug.Print语句替换成下面的代码,就能输出相对位置:
Debug.Print oneCell.Row - rngMyRange.Row + 1, oneCell.Column - rngMyRange.Column + 1
用题目里的例子验证:6 - 5 + 1 = 2,6 - 5 + 1 = 2,正好得到预期的相对位置(2,2)。
方法二:利用Offset属性反向推导
如果需要通过偏移量逻辑计算,也可以用Offset反向调整后取行号列号(Offset从0开始计数,所以最后要加1):
- 相对行号:
oneCell.Offset(-rngMyRange.Row + 1, 0).Row - 相对列号:
oneCell.Offset(0, -rngMyRange.Column + 1).Column
不过这种方法不如直接计算简洁,一般优先用第一种。
修改后的完整函数示例
Private Function FindJimmy(rngMyRange As Range) As Long Dim oneCell As Range Dim relativeRow As Long, relativeCol As Long rngMyRange.Cells(2,2) = "Jimmy" For Each oneCell In rngMyRange If oneCell.Value = "Jimmy" Then ' 计算相对位置 relativeRow = oneCell.Row - rngMyRange.Row + 1 relativeCol = oneCell.Column - rngMyRange.Column + 1 ' 输出相对位置 Debug.Print relativeRow, relativeCol FindJimmy = relativeRow ' 按需返回相对行号,可自行调整 Exit Function End If Next oneCell FindJimmy = 0 End Function
内容的提问来源于stack exchange,提问作者Fred Cailloux
相关产品推荐
相关产品推荐

