我的第一个计划是对每个命名范围重复此操作,直到我意识到这将是多少。如果选择与命名范围相交,则选择命名范围
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
我的第一个计划是对每个命名范围重复此操作,直到我意识到这将是多少。如果选择与命名范围相交,则选择命名范围
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
相交的命名范围中的至少一个,你如果你需要更多的控制
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
不确定我是否理解,我有1260个命名范围,从M_1到M_1260,你会如何写这个 – mrkrister
请参阅上面Scott的回答。在那里他循环遍历表中的每个命名范围。你可以在这个循环中添加一个测试,如果你有其他命名的范围,那么就留下(nm.name,2)=“M_”Then'。你也可以设置一个循环来处理数字:'For i = 1 to 1260','Range(“M_”&i).DoSomething'有很多方法可以为这只猫蒙皮。 – JNevill
它已经有一段时间了,我被卡住了,我想我明白他的代码是如何工作的,纠正我,如果我错了,但它会对所有命名范围进行测试,看看它们中的任何一个是否与选定单元格交叉,选择一个名称范围。我不相信我需要在其中运行任何额外的测试,因为我将使用所有命名范围,所以我基本上只是复制他的代码,并给我留下一个运行时错误,告诉我方法'范围'失败对象'_Woorksheet'这使我学到了很多其他的东西,但可惜不是如何得到这个权利 – mrkrister
添加一个循环,可以使用应用程序的union
方法通过命名范围迭代:
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
不知道我在做什么错,但我无法得到这个工作 – mrkrister
只是循环遍历指定范围**在这片** –
@JNevill感谢编辑:) – mrkrister
@ Gary的学生对我来说不是那么简单,虽然 – mrkrister