2016-07-24 89 views
1

我想檢查布爾值True/False的多個命名範圍。我需要檢查1單元驗證範圍(,以的順序),如果結果是True,我需要.Select對應的命名範圍(即,指定的範圍沒有對應的"validation_"前綴並退出子例程。的作品,但它不是幹循環遍歷多個命名範圍並轉到類似的命名範圍VBA

這裏有一個片段,以獲得問題的要點,但這個If-ElseIf繼續爲許多其他的命名範圍:

If Range("validation_name") = True Then 
    Range("name").Select 
    Exit Sub 
ElseIf Range("validation_category") = True Then 
    Range("category").Select 
    Exit Sub 
ElseIf Range("validation_subcategory") = True Then 
    Range("subcategory").Select 
    Exit Sub 
' ... and many more... 

可能性/問題:

  • 我想我可以使用一個命名範圍數組和一個結果「去」命名範圍數組?
  • 也許我可以用collection代替?
  • 不確定一個for循環或while循環會更好嗎?
+0

如果你正在檢查一個範圍中的細胞,你想測試,如果任何** **單元格包含* TRUE *或者**全部**單元格包含* TRUE * –

+0

@ Gary'sStudent有一個單獨的命名範圍,將檢查**任何**單元格是否包含*真* *,該問題將在前期處理。然後,我需要檢查*的順序*這些驗證,以便我可以去第一個失敗的單元格;編輯的問題來澄清。考慮填寫表格,然後將用戶發送到失敗的第一個點。 – JasonAizkalns

回答

3

一些「特幹」代碼

Sub main() 
    Dim a As Variant 
    For Each a In Array("name", "category", "subcategory") 
     If Range("valid_" & a).Value = True Then 
      Range(a).Select 
      Exit Sub 
     End If 
    Next a 
End Sub 

Sub main2() 
    Dim r As Range, f As Range   
    Set r = Union(Range("validation_date"), Range("validation_name"), Range("validation_subcategory"), Range("validation_category")) 
    Set f = r.Find(what:="true", LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False) 
    If Not f Is Nothing Then Range(Replace(f.name.name, "validation_", "")).Select 
End Sub 
+0

我喜歡Range.Find方法。該聯盟可能會縮短爲'Set r = Range(「validation_date,validation_name,validation_subcategory,validation_category」)' – Slai

+0

@Slai,那將不起作用 – user3598756

+0

@ user3598756在Excel 2007中適用於我。在Excel範圍中,逗號爲union和space相交。這也工作'設置r = [IF(validation_name,name,IF(validation_category,category,A1))]'' – Slai

3

我假設這些是1細胞範圍。如果是這樣,下面應該工作:

Sub SelectRange() 
    Dim i As long, A As Variant 
    A = Array("validation_name", "validation_category", "validation_subcategory") 
    For i = 0 To UBound(A) 
     If Range(A(i)).Value = True Then 
      Range(Split(A(i),"_")(1)).Select 
      Exit Sub 
     End If 
    Next i 
End Sub 
2

你可以通過所有的命名範圍的環路的東西,如:

Dim xlName As Name 
For each xlName In ActiveWorkbook.Names 
    If xlName.Name Like "validation_*" And Range(xlName.Name) = True Then 
     Application.Goto Replace(xlName.Name, "validation_", ""), True 
     Exit Sub 
    End If 
Next 

或指定他們這樣

For each strName In Split("name category subcategory") 
    If Range("validation_" & strName) = True Then 
     Application.Goto strName, True 
     Exit Sub 
    End If 
Next 

更新

對不起,我沒有看完整個問題。好像你可以使用某種類型的鍵 - 值集合

pairs = Array(Array("validation_name", "name"), _ 
       Array("validation_category", "category"), _ 
       Array("validation_subcategory", "subcategory")) 

For each pair In pairs 
    If Range(pair(0)) = True Then 
     Application.Goto pair(1), True 
     Exit Sub 
    End If 
Next 
+0

但這樣你不確定獲得_first_命名範圍的值爲「True」 – user3598756

+0

我同意@ user3598756,第一種方法可能會產生意想不到的後果,並不保證* first *匹配。此外,還有其他「驗證_ \ *」名稱,我會*不希望匹配。儘管如此,對其他情況來說,這是一個有趣的方法。 – JasonAizkalns