2015-08-18 72 views
3

我正在创建一个函数,用于检查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内部出现的合并单元格,我希望它可以算作范围的一部分(即使合并单元格的某些部分伸出了)。我需要写什么才能完成这项工作?

例考虑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作为源测试交叉点时,如上图所示在编辑中。

+0

噢,真好!非常简单的方法! –

+1

这似乎不适用于合并单元测试 - 如果合并A1:B2并且测试A1是否与B2:C3相交,则显示“不在范围内”。但是,从A1开始的合并单元格一直到B2,这意味着合并的单元格部分在范围内。为了解决这个问题,我认为你需要做一个循环,通过在测试区域中找到的所有合并的单元来看看会发生什么。 –

+1

@ Grade'Eh'Bacon - 你说得对。我添加了一个显示如何使用'MergeArea'属性测试合并单元格的编辑。 – Bond

相关问题