Vba 确定单元格是否属于命名范围的逻辑测试
因此,我搜索了web和堆栈溢出,但在这方面我没有找到任何东西,主要是因为我的问题有两部分。第一部分是:逻辑测试,看看一个单元格是否是命名范围的一部分,但我们无法将其缩小到一个命名范围,因为我的电子表格上有多个命名范围。第二部分是,一旦我知道单元格在一个命名范围内,我想知道该范围的名称Vba 确定单元格是否属于命名范围的逻辑测试,vba,excel,named-ranges,Vba,Excel,Named Ranges,因此,我搜索了web和堆栈溢出,但在这方面我没有找到任何东西,主要是因为我的问题有两部分。第一部分是:逻辑测试,看看一个单元格是否是命名范围的一部分,但我们无法将其缩小到一个命名范围,因为我的电子表格上有多个命名范围。第二部分是,一旦我知道单元格在一个命名范围内,我想知道该范围的名称 我想我会做一个由命名范围对象数组组成的for循环,但我也不知道怎么做。如有任何提示或建议,我们将不胜感激。请告知我们的命名范围如下: 此代码: Sub WhatsInAName() Dim r As Ra
我想我会做一个由命名范围对象数组组成的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的名称。非常感谢。我的荣幸。这只是一个便条,以防其他人在这里寻找解决方案。根据您的范围名称是工作簿级别还是工作表级别,您可以使用相应的循环。感谢您的输入!我完全可以看出这在某些情况下是多么有用:)