我如何获得一个单元格在一个范围内的位置?

我将如何去获取一个单元格内的相对位置? 在工作表中查找单元格的位置很简单,使用RowColumn属性,但我不确定如何在一个范围内执行同样的操作。

我考虑在我想要查找单元格的位置的范围内使用左上angular的单元格的位置,并从工作表单元格的位置处将其减去(-1),但是会变得有点麻烦。 有没有更好的方法去做这件事?

到目前为止,我的最佳尝试,包括testing,是这样的:

 Option Explicit Sub test() Dim r As Range: Set r = Sheet1.Range("B2:E10") Dim c As Range: Set c = Sheet1.Range("C2") Debug.Print "Column in sheet: " & c.Column Debug.Print "Row in sheet: " & c.Row Debug.Print "Column in range: " & column_in_range(r, c) Debug.Print "Row in range: " & row_in_range(r, c) End Sub Function column_in_range(r As Range, c As Range) As Long column_in_range = c.Column - (r.Cells(1, 1).Column - 1) End Function Function row_in_range(r As Range, c As Range) As Long row_in_range = c.Row - (r.Cells(1, 1).Row - 1) End Function 

这给出了所需的输出:

 Column in sheet: 3 Row in sheet: 2 Column in range: 2 Row in range: 1 

但是,我想知道是否有任何我可以使用的本地函数呢?

使用 lori_m 提供的变体进行 lori_m

但我不知道是否有任何原生function…

用这个

 Sub test() Dim r As Range, c As Range With Sheet1 Set r = .[B2:E10] Set c = .[C2] End With If Not Intersect(r, c) Is Nothing Then Debug.Print "Column in sheet: " & c.Column Debug.Print "Row in sheet: " & c.Row Debug.Print "Column in range: " & Range(r(1), c).Columns.Count Debug.Print "Row in range: " & Range(r(1), c).Rows.Count End If End Sub 

产量

 Column in sheet: 3 Row in sheet: 2 Column in range: 2 Row in range: 1 

没有原生的方式来做到这一点。 我也做你在上面的代码中提到的。 不过,我加了一些额外的检查。

 Sub test1() Dim r As Range: Set r = Sheet1.Range("B2:E10") Dim c As Range: Set c = Sheet2.Range("C2") '<~~ Changed Sheet1 to sheet2 Dim rng As Range On Error Resume Next Set rng = Intersect(c, r) On Error GoTo 0 '~~> Check if the range is in main range If Not rng Is Nothing Then ' '~~> Rest of your code ' Else MsgBox c.Address & " in " & c.Parent.Name & _ " is not a part of " & _ r.Address & " in " & r.Parent.Name End If End Sub 

看看MSDN看到更多 。

你可以使用像这样的东西:

 MsgBox ActiveCell.Address(RowAbsolute:=True, _ ColumnAbsolute:=True, _ ReferenceStyle:=xlR1C1, _ External:=False, _ RelativeTo:=Range("B2")) 'Or shorter version : MsgBox ActiveCell.Address(, , xlR1C1, False, Range("B2")) 

但是,您将在范围内具有关于行和列的信息,但不是分开的。

所以,你仍然需要从两个函数中的答案(如: R18C20 )中提取这些值,所以几乎相同的问题…

在我看来,有几乎原生的方式来检查它,但结果是一个string需要一些额外的操作。 所有你需要使用的是.Address property (根据MSDN )的适当构造。 一些例子:

 Dim r As Range: Set r = Sheet1.Range("B2:E10") Dim c As Range: Set c = Sheet1.Range("c2") Debug.Print c.Address(False, False, xlR1C1, , r.Cells(0, 0)) '>>result: R[1]C[2] '----------------------------------------------------- Set c = Sheet1.Range("e2") Debug.Print c.Address(False, False, xlR1C1, , r.Cells(0, 0)) '>>result: R[1]C[4] '----------------------------------------------------- Set c = Sheet1.Range("e5") Debug.Print c.Address(False, False, xlR1C1, , r.Cells(0, 0)) '>>result: R[4]C[4] '----------------------------------------------------- 

我不完全确定这是否是你以后。 但在这里呢:

 Sub ts2() Dim test As Range Set test = Range("B2:E10") Dim topcorner As Range Dim testcell As Range Set topcorner = Cells(test.Row, test.Column) Set testcell = Range("D7") rel_row = testcell.Row - topcorner.Row rel_col = testcell.Column - topcorner.Column End Sub 

通过这个,你会find相对的位置。 但也许你正在寻找一些内置函数? 如果这不是你以后的事情,请编辑你的post…