检查Range是否包含命名范围

时间:2017-10-19 08:51:53

标签: excel-vba vba excel

我拥有的:

  1. 命名范围“类型”,包含1行多列
  2. 命名范围“Group1”“Group2”等。
  3. 群组范围对象 “类型”范围(我想说的是这些群组范围与 Type 范围共享相同的行和列,但列数较少)
  4. 我需要什么:

    我需要在UserForm上的列表框中添加所有“Group#”本地名称
    所以我可能需要一组名字或一个真正好的循环。

    我做了什么:

    For Each NamedRange In ThisWorkbook.Names
        If InStr(1, NamedRange.NameLocal, "Group") <> 0 Then
                If Not (Application.Intersect(Range(NamedRange.NameLocal), Range("Type")) Is Nothing) Then
                    Main.List_Groups.AddItem NamedRange.NameLocal
                End If
        End If
    Next
    

    它做我需要的部分部分。它还添加更大 Type 范围的命名范围,其中我需要 中添加的名称范围范围。

    提前致谢。

2 个答案:

答案 0 :(得分:4)

您可以检查您的相交范围的地址是否是您的群组范围的地址。如果是,它完全在你的类型范围内:

所以而不是

If Not (Application.Intersect(Range(NamedRange.NameLocal), Range("Type")) Is Nothing) Then

使用

If Application.Intersect(Range(namedrange.NameLocal), Range("Type")).Address = Range(namedrange.NameLocal).Address Then

答案 1 :(得分:1)

Application.Intersect(Range(NamedRange.NameLocal),Range(&#34; Type&#34;))并非如果两个范围的任何部分重叠 - 为了证明一个包含在另一个范围内,你应该检查命名范围是否与Type上方,下方,左侧和右侧的范围重叠。 (显然,如果类型位于工作表的顶部或左侧,则可以省略一些测试。因此,添加更多if语句测试与适当范围相交 - 所以(如果测试是固定的)类似

 If  (Application.Intersect(Range(NamedRange.NameLocal), Range("A2:f2")) Is Nothing then 

如果Test是可变的,那么顶部的范围将是

 Range(cells(range("test").cells(1,1).row-1,Range("Test").cells(1,1).column), _
        cells(range("test").cells(1,1).row-1,Range("Test").cells(1,1).column + range("test").columns.count -1)))