2017-01-03 73 views
0

我的第一个计划是对每个命名范围重复此操作,直到我意识到这将是多少。如果选择与命名范围相交,则选择命名范围

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 
+0

只是循环遍历指定范围**在这片** –

+0

@JNevill感谢编辑:) – mrkrister

+0

@ Gary的学生对我来说不是那么简单,虽然 – mrkrister

回答

2

首先,您要更改activecelltarget因为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 
+0

不确定我是否理解,我有1260个命名范围,从M_1到M_1260,你会如何写这个 – mrkrister

+0

请参阅上面Scott的回答。在那里他循环遍历表中的每个命名范围。你可以在这个循环中添加一个测试,如果你有其他命名的范围,那么就留下(nm.name,2)=“M_”Then'。你也可以设置一个循环来处理数字:'For i = 1 to 1260','Range(“M_”&i).DoSomething'有很多方法可以为这只猫蒙皮。 – JNevill

+0

它已经有一段时间了,我被卡住了,我想我明白他的代码是如何工作的,纠正我,如果我错了,但它会对所有命名范围进行测试,看看它们中的任何一个是否与选定单元格交叉,选择一个名称范围。我不相信我需要在其中运行任何额外的测试,因为我将使用所有命名范围,所以我基本上只是复制他的代码,并给我留下一个运行时错误,告诉我方法'范围'失败对象'_Woorksheet'这使我学到了很多其他的东西,但可惜不是如何得到这个权利 – mrkrister

1

添加一个循环,可以使用应用程序的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 
+0

不知道我在做什么错,但我无法得到这个工作 – mrkrister