用于检查范围是否包含在另一个

时间:2015-08-18 17:45:17

标签: excel vba excel-vba

我希望创建一个函数来检查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

1 个答案:

答案 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作为源安全始终,如上面的编辑所示。