eir*_*ude 12 excel vba excel-vba
我如何获得一个范围内的细胞的相对位置?使用Row- 和Column- 属性查找工作表中单元格的位置是微不足道的,但我不确定如何在一个范围内执行相同操作.
我考虑使用我想要找到单元格位置的左上角单元格的位置,然后从工作表中单元格的位置中扣除它(-1),但是它有点麻烦.有更优雅的方式来解决这个问题吗?
到目前为止,我最好的尝试,包括测试,是这样的:
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
Run Code Online (Sandbox Code Playgroud)
这给出了所需的输出:
Column in sheet: 3
Row in sheet: 2
Column in range: 2
Row in range: 1
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有任何我可以使用的本机功能呢?
Vas*_*zha 10
使用由.提供的变体更新 lori_m
但我想知道是否有任何原生功能......
用这个
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
Run Code Online (Sandbox Code Playgroud)
产量
Column in sheet: 3
Row in sheet: 2
Column in range: 2
Row in range: 1
Run Code Online (Sandbox Code Playgroud)
没有本地方法可以做到这一点.我也做了你在上面的代码中提到的.但是我做了一些额外的检查.
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
Run Code Online (Sandbox Code Playgroud)
在我看来,几乎是原生的方式来检查它,但结果是一个字符串需要一些额外的操作.您需要使用的只是一个正确的结构.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]
'-----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18622 次 |
| 最近记录: |