循环遍历多个命名范围并转到类似的命名范围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