2017-01-03 122 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