如何使用命名范围作为验证参考

Posted

技术标签:

【中文标题】如何使用命名范围作为验证参考【英文标题】:How to use named ranged as reference for validation 【发布时间】:2021-12-21 20:48:58 【问题描述】:

希望我能在这里得到帮助,我目前在我的 VBA 代码中使用 Dim Long,但由于我指的是多个列,所以代码变得很长。现在,我想尝试命名范围引用,但我无法使其工作。 这是我当前的代码:

Dim i As Long
For i = 8 To 500

    'if details is incomplete
    If Range("AA" & i).Value > 0 Then
        If Range("AB" & i).Value = "Error" Or Range("AC" & i).Value = "Error" Or Range("AD" & i).Value = "Error" _
        Or Range("AE" & i).Value = "Error" Or Range("AF" & i).Value = "Error" Or Range("AG" & i).Value = "Error" _
        Or Range("AH" & i).Value = "Error" Or Range("AI" & i).Value = "Error" Or Range("AJ" & i).Value = "Error" _
        Or Range("AK" & i).Value = "Error" Or Range("AL" & i).Value = "Error" Or Range("AM" & i).Value = "Error" _
        Or Range("AN" & i).Value = "Error" Or Range("AO" & i).Value = "Error" Or Range("AP" & i).Value = "Error" _
        Or Range("AQ" & i).Value = "Error" Or Range("AR" & i).Value = "Error" Or Range("AS" & i).Value = "Error" _
        Or Range("AT" & i).Value = "Error" Or Range("AU" & i).Value = "Error" Or Range("AV" & i).Value = "Error" _
        Or Range("AW" & i).Value = "Error" Or Range("AX" & i).Value = "Error" Or Range("AY" & i).Value = "Error" Then
            MsgBox "One of the mandatory field is not provided, please check all cells highlighted in yellow & make sure details is provided."
     End If
Endif

我命名范围 AA = "Validation" & range AB:AY = "Details" 我如何声明它并使用命名范围而不是一一写入每一列?

【问题讨论】:

我会在工作表中添加一个帮助列 - 使用 COUNTIF 来计算“错误”,然后使用这个值 - 用于 AA 或 one 的条件格式消息框。如果有很多错误,使用您的代码用户可能会得到很多 msgbox。 谢谢你,你是对的,比定义每一列更好。我采纳了你的建议。 【参考方案1】:

正如@Ike 建议的那样 - 使用 COUNTIF 公式。可用于工作表或 VBA 中。如果您想返回每个错误的地址,那么Find 可能是更好的途径。

Sub Test()
    Dim Result As Long
    Result = Errors(Sheet1.Range("AB8:AY500"))
    If Result > 0 Then
        MsgBox "There are " & Result & " errors in the range."
    End If
End Sub

Public Function Errors(Target As Range) As Long
    Errors = WorksheetFunction.CountIf(Target, "Error")
End Function

【讨论】:

错误检查必须在行级别 - 如果 AA[row] > 0【参考方案2】:

条件格式可以处理这个问题。我已经证明了较小的范围。随意将其应用于您所需的范围。

非 VBA

使用的公式:=AND($AA8>0,AB8="Error")

VBA

您也可以在 VBA 中使用条件格式。

我已经对代码进行了注释。

Option Explicit

Sub Sample()
    Dim i As Long
    Dim ws As Worksheet
    Dim CondTrue As Boolean
    
    '~~> Change this to the relevant sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    With ws
        '~~> Check if there is even one cell which satisfies our condition
        For i = 8 To 500
            If .Evaluate("=AND(AA" & i & ">0,COUNTIF(AB" & i & ":AY" & i & ",""Error"")>0)") = True Then
                CondTrue = True
                Exit For
            End If
        Next i
        
        '~~> If found then apply conditional formatting
        If CondTrue Then
            With .Range("AB8:AY500")
                .FormatConditions.Delete
                
                .FormatConditions.Add Type:=xlExpression, _
                                      Formula1:="=AND($AA8>0,AB8=""Error"")"
                
                .FormatConditions(.FormatConditions.Count).SetFirstPriority
                
                With .FormatConditions(1).Interior
                    .PatternColorIndex = xlAutomatic
                    .Color = 65535
                    .TintAndShade = 0
                End With
                .FormatConditions(1).StopIfTrue = False
            End With
            
            '~~> Show message box
            MsgBox "One of the mandatory field is not provided, please check all cells highlighted in yellow & make sure details is provided."
        Else
            MsgBox "All Good!"
        End If
    End With
End Sub

在行动(VBA)

【讨论】:

以上是关于如何使用命名范围作为验证参考的主要内容,如果未能解决你的问题,请参考以下文章

如何复制活动文件并使用命名范围中的值命名它 - Google 脚本

如何将条件格式应用于命名范围?

如何在类模板中使用文件范围的命名空间声明?

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

如何验证XML架构中的命名约定

Javascript命名空间 - 如何根据命名导出函数范围内定义的函数和变量?