Excel VBA 确定一个3X3范围相对于activeCell的位置
Excel VBA determine the location of a 3X3 range relative to activeCell
我在 Excel 中有一个 3 x 3 的范围,它被定义为一个范围。我想知道用户在双击任何蓝色单元格时点击了哪里。 - 该区域被定义为一个范围。
我试图创建一个函数来找出这个选择,但是这对我的基本技能来说有点困难。
我的想法是为矩阵中的每个单元格分配一个整数值 (1 - 9),并具有 return 该值的函数。
Edited question based on provided answer
Function relRange(rangeIn As Range, activeCell) As Integer
relRange = 0
If (rangeIn.Rows.Count = 6) And (rangeIn.Columns.Count = 6) Then ' range has double merged cells
' comparison code to determine where the activecell is relative to the 3x3 array
If rangeIn.Cells(5, 1).Address = activeCell Then relRange = 1 '1
If rangeIn.Cells(3, 1).Address = activeCell Then relRange = 2 '2
If rangeIn.Cells(5, 3).Address = activeCell Then relRange = 3 '3
If rangeIn.Cells(3, 3).Address = activeCell Then relRange = 4 '4
If rangeIn.Cells(1, 1).Address = activeCell Then relRange = 5 '5
If rangeIn.Cells(5, 5).Address = activeCell Then relRange = 6 '6
If rangeIn.Cells(1, 3).Address = activeCell Then relRange = 7 '7
If rangeIn.Cells(3, 5).Address = activeCell Then relRange = 8 '8
If rangeIn.Cells(1, 5).Address = activeCell Then relRange = 9 '9
End If
End Function
我现在可以使用此功能,很惊讶没有更简单的方法。
这应该在您的 Sheet 对象 中,而不是在标准模块中。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim Matrix(1 To 2) As Range, i As Long
Set Matrix(1) = ws.Range("A1:C3")
Set Matrix(2) = ws.Range("F1:H3")
For i = LBound(Matrix) To UBound(Matrix)
Set iSect = Application.Intersect(Target, Matrix(i))
If Not iSect Is Nothing Then
Exit For
End If
Next
If Not iSect Is Nothing Then
MsgBox "Target located in Range # " & i & " at: " & Target.Address
Else
MsgBox "Does NOT interesect in any of my ranges!"
End If
Cancel = True
End Sub
如果Cancel = True
,那么您的单元格将不会处于编辑模式。
您可以使用 Target
的范围并与之进行比较。
我在 Excel 中有一个 3 x 3 的范围,它被定义为一个范围。我想知道用户在双击任何蓝色单元格时点击了哪里。 - 该区域被定义为一个范围。
我试图创建一个函数来找出这个选择,但是这对我的基本技能来说有点困难。
我的想法是为矩阵中的每个单元格分配一个整数值 (1 - 9),并具有 return 该值的函数。
Edited question based on provided answer
Function relRange(rangeIn As Range, activeCell) As Integer
relRange = 0
If (rangeIn.Rows.Count = 6) And (rangeIn.Columns.Count = 6) Then ' range has double merged cells
' comparison code to determine where the activecell is relative to the 3x3 array
If rangeIn.Cells(5, 1).Address = activeCell Then relRange = 1 '1
If rangeIn.Cells(3, 1).Address = activeCell Then relRange = 2 '2
If rangeIn.Cells(5, 3).Address = activeCell Then relRange = 3 '3
If rangeIn.Cells(3, 3).Address = activeCell Then relRange = 4 '4
If rangeIn.Cells(1, 1).Address = activeCell Then relRange = 5 '5
If rangeIn.Cells(5, 5).Address = activeCell Then relRange = 6 '6
If rangeIn.Cells(1, 3).Address = activeCell Then relRange = 7 '7
If rangeIn.Cells(3, 5).Address = activeCell Then relRange = 8 '8
If rangeIn.Cells(1, 5).Address = activeCell Then relRange = 9 '9
End If
End Function
我现在可以使用此功能,很惊讶没有更简单的方法。
这应该在您的 Sheet 对象 中,而不是在标准模块中。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim Matrix(1 To 2) As Range, i As Long
Set Matrix(1) = ws.Range("A1:C3")
Set Matrix(2) = ws.Range("F1:H3")
For i = LBound(Matrix) To UBound(Matrix)
Set iSect = Application.Intersect(Target, Matrix(i))
If Not iSect Is Nothing Then
Exit For
End If
Next
If Not iSect Is Nothing Then
MsgBox "Target located in Range # " & i & " at: " & Target.Address
Else
MsgBox "Does NOT interesect in any of my ranges!"
End If
Cancel = True
End Sub
如果Cancel = True
,那么您的单元格将不会处于编辑模式。
您可以使用 Target
的范围并与之进行比较。