考虑以下简化函数:
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 oneCell.Row, oneCell.Column 将打印相对于包含 rngMyRange 的整个工作表的绝对行号和列号。
由于 rngMyRange 从绝对单元格 (5,5) 开始,如果在 (6,6) 处找到绝对单元格地址,则找到的单元格的相对值将为 2,2。
如果将范围传递给函数,则应该有一种简单的方法来查找找到的单元格的相对地址而不是绝对地址。
问题:如何确定 oneCell relative 到 rngMyRange 的行和列位置?
由于 VBA 显然没有提供现成的函数来提供信息,因此建议的解决方案如下:
Private Function RelativeRow(rngMyRange As Range, strQuery As String) As Long
Dim oneCell As Range
Dim FirstRow As Long, FirstCol As Long
FirstRow = rngMyRange.Row: FirstCol = rngMyRange.Column
For Each oneCell In rngMyRange
If oneCell.Value = strQuery Then
Debug.Print oneCell.Row, oneCell.Column
RelativeRow = oneCell.Row - FirstRow + 1
Exit Function
End If
Next oneCell
RelativeRow = 0
End Function
我假设 oneCell 将始终位于 rngMyRange 的下方和右侧,是吗?
数学拯救世界:
JimmyRow = (oneCell.Row - rngMyRange.Row) + 1
JimmyColumn = (oneCell.Column - rngMyRange.Column) + 1
将行和列作为单独的变量,您可以根据需要使用和操作它们来实现您的目的。