Vba 确定单元格是否属于命名范围的逻辑测试

Vba 确定单元格是否属于命名范围的逻辑测试,vba,excel,named-ranges,Vba,Excel,Named Ranges,因此,我搜索了web和堆栈溢出,但在这方面我没有找到任何东西,主要是因为我的问题有两部分。第一部分是:逻辑测试,看看一个单元格是否是命名范围的一部分,但我们无法将其缩小到一个命名范围,因为我的电子表格上有多个命名范围。第二部分是,一旦我知道单元格在一个命名范围内,我想知道该范围的名称 我想我会做一个由命名范围对象数组组成的for循环,但我也不知道怎么做。如有任何提示或建议,我们将不胜感激。请告知我们的命名范围如下: 此代码: Sub WhatsInAName() Dim r As Ra

因此,我搜索了web和堆栈溢出,但在这方面我没有找到任何东西,主要是因为我的问题有两部分。第一部分是:逻辑测试,看看一个单元格是否是命名范围的一部分,但我们无法将其缩小到一个命名范围,因为我的电子表格上有多个命名范围。第二部分是,一旦我知道单元格在一个命名范围内,我想知道该范围的名称


我想我会做一个由命名范围对象数组组成的for循环,但我也不知道怎么做。如有任何提示或建议,我们将不胜感激。

请告知我们的命名范围如下:

此代码:

Sub WhatsInAName()
    Dim r As Range
    Set r = Intersect(ActiveCell, Range("HomeOnTheRange"))
    If r Is Nothing Then
        MsgBox "active cell is not on HomeOnTheRange"
    Else
        MsgBox "active cell is on HomeOnTheRange"
    End If
End Sub

将告诉您是否有
ActiveCell

尽管Gary的学生答案是正确的,但它并不能满足以下需求:

…但我们无法将其缩小到一个命名范围,因为我的电子表格中有多个命名范围

为此,您需要按照您的猜测迭代Names集合

这里有一个修改过的版本,应该在每个命名范围内进行迭代

Option Explicit

Sub SO_Example()
    Dim myCell As Range: Set myCell = Range("A1") 'this is the cell you want to test
    Dim nm As Name 'this is a Name Range object

    'Iterate the names in the workbook
    For Each nm In ActiveWorkbook.Names
        'Use the RefersTo property to get a range object.
        'Refers to adds a '=' sign, which causes an issue so that's why the replace is here
        'There is a probably a cleaner way to do this :)
        Dim nameRng As Range: Set nameRng = Range(Replace(nm.RefersTo, "=", ""))

        'Check to see if the ranges intersect
        If Not Intersect(myCell, nameRng) Is Nothing Then
            Debug.Print nm.Name & " address is " & nm.RefersToLocal & " Intersects myCell at " & myCell.Address
        Else
            Debug.Print nm.Name & " address is " & nm.RefersToLocal & " Does not Intersect myCell at " & myCell.Address
        End If
    Next
End Sub
示例输出:

Another_Name address is =Sheet1!$M$5 Does not Intersect myCell at $A$1
Name1 address is =Sheet1!$A$1 Intersects myCell at $A$1
Name2 address is =Sheet1!$A$1:$A$2 Intersects myCell at $A$1

还要记住,同一单元格可能属于多个范围名称。 在范围名称之间循环时,可以使用工作簿名称或工作表名称。工作表名称在工作簿级别不可见。 以下是对上述答案的补充

Dim ws As Worksheet
Dim iCell As Range
Dim r As Range
Dim nRng as Range

Set iCell = ws.Cells(5, 8)

For Each rngName In ws.Names
    Set nRng = ws.Range(rngName)
    Set r = Intersect(iCell, nRng)
    If Not r Is Nothing Then
        MsgBox "active cell is on " & ws.Range(rngName).NAME
    End If
Next rngName

如果这是一个一次性方案,我首先只想确保您在excel中检查了名称管理器,方法是转到:

公式>定义名称>名称管理器 (也可以按Ctrl+F3键)

一旦进入名称管理器,您就可以按命名范围(如果您要的是命名范围)或按“引用”进行排序,这也可能会有所帮助

假设已经勾选了,下面尝试通过一个由指定范围候选人组成的数组详细说明Gary学生的答案:

Dim PossibleRanges
PossibleRanges = Array("2014Sales", "PossibleRange1", "BeyonceGreatestHits")
Dim i As Integer

For i = 0 To 2 <~~~~~~~ (note the first elmement in the array is indexed at 0)
    If Intersect(ActiveCell, Range(PossibleRanges(i))) Is Nothing Then
    Else MsgBox("Activecell is part of " & PossibleRanges(i))
    End If
Next i
Dim可能值
PossibleRanges=数组(“2014年销售额”、“PossibleRange1”、“BeyonSegreateStHits”)
作为整数的Dim i

对于i=0到2谢谢,我会尝试这个解决方案,我想这正是我想要的!!!我将要设置电子表格的方式是,我要通过的单元格将只属于一个命名范围。哦,我明白你的意思,我可能应该指定我只需要特定于ws的名称。非常感谢。我的荣幸。这只是一个便条,以防其他人在这里寻找解决方案。根据您的范围名称是工作簿级别还是工作表级别,您可以使用相应的循环。感谢您的输入!我完全可以看出这在某些情况下是多么有用:)