我希望创建一个函数来检查Range2中是否包含一个单元格(Range1)。功能是:
Function IsWithin(Range1 as Range, Range2 as Range) as Boolean
这意味着进入Before_DoubleClick
事件以检查单击的单元格属于某个范围。
预期输入/输出的示例(直接使用地址只是为了更容易想象):
IsWithin("A2", "A1:B3") = True
IsWithin("B1","B1:B2") = True
IsWithin("A3", "A4:C10") = False
IsWithin("A3", "A3") = True
我可以想到一个简单的方法:
Function IsWithin(Range1 as Range, Range2 as Range) as Boolean
Dim cell2 as range
For each cell2 in Range2
If cell2.address = Range1.Address then
IsWithin = True
Exit Function
End if
Next
End function
现在更难的部分和问题。如果我选择在Range2中突出的Merged单元格,我希望它被视为该范围的一部分(即使某些合并的单元格突出)。为了完成这项工作,我需要写些什么?
考虑A1:B3
的示例是一个合并的单元格(仍然发送地址而不是范围对象,以便更容易地表示它):
IsWithin("A1:B3", "A2:D7") = True
答案 0 :(得分:3)
您是否有理由不使用Intersect()
?
Dim r As Range
Set r = Intersect(Range("A2"), Range("A1:B3"))
If r Is Nothing Then
Debug.Print "Not in range"
ElseIf r.Address = Range("A2").Address Then
Debug.Print "Completely within range"
Else
Debug.Print "Partially within range"
End If
修改强>:
正如@Bacon在评论中提到的,这对合并的单元格不起作用。但是您可以使用MergeArea
属性来测试它。假设A1:B1
是合并范围,这应该有效:
Set r = Intersect(Range("A1").MergeArea, Range("B1:B3"))
If r Is Nothing Then
Debug.Print "Not in range"
Else
Debug.Print "Ranges intersect"
End If
MergeArea
返回合并范围,如果它是合并区域的一部分。如果没有,它只返回单个单元格。因此,在测试交叉点时,您应该使用MergeArea
作为源安全始终,如上面的编辑所示。