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

时间:2016-07-24 14:19:06

标签: excel vba excel-vba

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

这是一个获取问题要点的片段,但是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...

可能性/问题:

  • 我想我可以使用一个命名范围数组和一个产生“go-to”命名范围的数组?
  • 也许我可以使用collection代替?
  • 不确定for循环或while循环是否更好?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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