循环遍历多个命名范围并转到类似的命名范围VBA

我想检查多个命名范围的布尔True/False值。 我需要检查1单元格validation范围( 按顺序 ),如果结果是True ,我需要。select相应的命名范围(即命名范围没有相应的"validation_"前缀,并退出子例程。代码有效,但不是干的。

这里有一个片段来获得问题的要点,但是这个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循环会更好?

一些“额外干燥”的代码

 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 

我认为这是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 

你可以循环所有的命名范围,如下所示:

 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