Excel 如果选择与命名范围相交,则选择该命名范围

Excel 如果选择与命名范围相交,则选择该命名范围,excel,vba,Excel,Vba,我的第一个计划是对每个指定的范围重复这个过程,直到我意识到这将是多少 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(ActiveCell, Range("M_1")) Is Nothing Then Else Range("M_1").Select End If End Sub 首先,您需要将activecell更改为target,因为target作为调用范围是静态的。另外,只需将

我的第一个计划是对每个指定的范围重复这个过程,直到我意识到这将是多少

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Intersect(ActiveCell, Range("M_1")) Is Nothing Then
Else
    Range("M_1").Select
End If

End Sub

首先,您需要将
activecell
更改为
target
,因为
target
作为调用范围是静态的。另外,只需将
NOT
条件添加到
IF
中,就不必使用
ELSE

如果要根据命名范围列表测试
target
,查看
target
是否与至少一个命名范围相交,可以使用应用程序的
union
方法:

If Not Intersect(Target, Union(Range("M_1"), Range("M_2"), Range("M_3")) Is Nothing Then
如果需要更多控制,也可以执行循环:

 doIntersect = false
 rngCounter = 0
 For each strTestRange in Array("M_1", "M_2", "M_3")
     If Not Intersect(Target, Range(strTestRange) Is Nothing Then
         doIntersect = true
         rngCounter = rngCounter + 1
     End if
 Next strTestRange

 If doIntersect Then
      msgbox(rngCounter & " named ranges intersect your selection")
 Else
      msgbox("None of the named ranges intersected your selection")
 End if

首先,您需要将
activecell
更改为
target
,因为
target
作为调用范围是静态的。另外,只需将
NOT
条件添加到
IF
中,就不必使用
ELSE

如果要根据命名范围列表测试
target
,查看
target
是否与至少一个命名范围相交,可以使用应用程序的
union
方法:

If Not Intersect(Target, Union(Range("M_1"), Range("M_2"), Range("M_3")) Is Nothing Then
如果需要更多控制,也可以执行循环:

 doIntersect = false
 rngCounter = 0
 For each strTestRange in Array("M_1", "M_2", "M_3")
     If Not Intersect(Target, Range(strTestRange) Is Nothing Then
         doIntersect = true
         rngCounter = rngCounter + 1
     End if
 Next strTestRange

 If doIntersect Then
      msgbox(rngCounter & " named ranges intersect your selection")
 Else
      msgbox("None of the named ranges intersected your selection")
 End if

添加循环以在命名范围内迭代:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim nm As Name
Dim nmStr As String
For Each nm In ThisWorkbook.Names
    nmStr = nm.Name
    If Not Intersect(Target, Range(nmStr)) Is Nothing Then
        Application.EnableEvents = False
        Range(nmStr).Select
        Application.EnableEvents = True
    End If
Next nm

End Sub

添加循环以在命名范围内迭代:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim nm As Name
Dim nmStr As String
For Each nm In ThisWorkbook.Names
    nmStr = nm.Name
    If Not Intersect(Target, Range(nmStr)) Is Nothing Then
        Application.EnableEvents = False
        Range(nmStr).Select
        Application.EnableEvents = True
    End If
Next nm

End Sub


只需在该工作表中的命名范围上循环即可。@jnevil感谢您的编辑:)@Gary的学生对我来说没那么简单though@JNevill@Scott@Gary在scotts代码中添加了
错误恢复下一步
,效果非常好,谢谢大家!现在,我应该编辑代码还是保持原样?只需在该工作表中的命名范围上循环即可。@jnevil谢谢编辑:)@Gary的学生对我来说没那么简单though@JNevill@Scott@Gary在scotts代码中添加了
错误恢复下一步
,效果非常好,谢谢大家!现在,我应该编辑我的代码还是保持原样?我不知道我做错了什么,但我不能让它工作。我不知道我做错了什么,但我不能让它工作。我不确定我是否理解,我有1260个命名范围,从m_1到m_1260,你会怎么写见上面Scott的答案。在那里,他在工作表中的每个命名范围中循环。您可以在该循环中添加一个测试,如
如果left(nm.name,2)=“M_3;”,那么
如果您有其他命名范围。你也可以设置一个循环,按照编号:
从i=1到1260,范围(“M_389;”&i)。DoSomething
有很多方法可以剥这只猫的皮。已经有一段时间了,我被卡住了,我想我理解他的代码是如何工作的,如果我错了,请纠正我,但它会在所有命名区域上运行测试,以查看其中是否有任何区域与选定单元格相交,并选择一个与之相交的命名区域。我不认为我需要在该范围内运行任何其他测试,因为我将使用所有命名范围,所以我基本上只是复制了他的代码,这给我留下了一个运行时错误,告诉我方法“Range”在对象“_Woorksheet”中失败了。这让我学到了很多其他东西,但遗憾的是,没有学会如何正确地实现这一点。我会问scott我是否认为他会回答,可能有一个简单的解决方案,但我看不到,提前谢谢!我不确定我是否理解,我有1260个命名范围,从M_1到M_1260,你会怎么写?见上面斯科特的答案。在那里,他在工作表中的每个命名范围中循环。您可以在该循环中添加一个测试,如
如果left(nm.name,2)=“M_3;”,那么
如果您有其他命名范围。你也可以设置一个循环,按照编号:
从i=1到1260,范围(“M_389;”&i)。DoSomething
有很多方法可以剥这只猫的皮。已经有一段时间了,我被卡住了,我想我理解他的代码是如何工作的,如果我错了,请纠正我,但它会在所有命名区域上运行测试,以查看其中是否有任何区域与选定单元格相交,并选择一个与之相交的命名区域。我不认为我需要在该范围内运行任何其他测试,因为我将使用所有命名范围,所以我基本上只是复制了他的代码,这给我留下了一个运行时错误,告诉我方法“Range”在对象“_Woorksheet”中失败了。这让我学到了很多其他东西,但遗憾的是,没有学会如何正确地实现这一点。我会问scott我是否认为他会回答,可能有一个简单的解决方案,但我看不到,提前谢谢!