【问题标题】:Looping through multiple named ranges and going to similar named range VBA遍历多个命名范围并转到类似的命名范围 VBA
【发布时间】:2016-07-24 14:19:06
【问题描述】:

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

这里有一个 sn-p 来了解问题的要点,但这个 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 循环更好?

【问题讨论】:

  • 如果您正在检查某个范围内的单元格,您确实想测试 any 单元格是否包含 TRUEall 单元格包含 TRUE ???
  • @Gary'sStudent 有一个单独的命名范围将检查 any 单元格是否包含 True - 该问题已预先处理。然后,我需要按顺序检查这些验证,以便我可以转到第一个失败的单元格;编辑问题以澄清。考虑填写表格,然后将用户发送到失败的第一个点

标签: vba excel


【解决方案1】:

一些“特别干”的代码

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

【讨论】:

  • 我喜欢 Range.Find 方法。联盟大概可以缩写为Set r = Range("validation_date,validation_name,validation_subcategory,validation_category")
  • @ user3598756 在 Excel 2007 中为我工作。在 Excel 范围内,逗号是联合,空格是相交。这也有效Set r = [IF(validation_name,name,IF(validation_category,category,A1))]
【解决方案2】:

我假设这些是 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

【讨论】:

    【解决方案3】:

    您可以通过以下方式遍历所有命名范围:

    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
    

    【讨论】:

    • 但这样你就不能确定得到 first 命名范围,其值为“True”
    • 我同意@user3598756,第一种方法可能会产生意想不到的后果,并且不能保证 first 匹配。此外,还有其他我不想想要匹配的“validation_*”名称。不过,对于其他情况,这是一种值得考虑的有趣方法。
    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多