【问题标题】:Data Validation (Limit on Length & Characters Must Be Uppercase)数据验证(长度限制,字符必须为大写)
【发布时间】:2020-12-07 02:54:15
【问题描述】:

我有一个数据验证列,目前将用户可以输入的最大字符数限制为 20 个。但是,我还想包括另一个限制,即如果输入的字符是字母,则输入的字符必须为大写。我假设我必须使用“自定义”数据验证?如果是这样,任何人都可以帮助我使用适用于整个列中数据的公式,而不仅仅是选定的单元格吗?

最后,我正在尝试更改当用户不满足定义的条件时显示的错误消息,但我不断收到弹出的默认 Microsoft Excel 错误消息。如何更改错误消息框以显示我选择的自定义消息?

Dim shTemp As Worksheet: Set shTemp = ThisWorkbook.Sheets("Template")

With shTemp.Range("G2:G" & shTemp.Range("G" & Rows.Count).End(xlUp).Row).Validation
        .Add Type:=xlValidateTextLength, AlertStyle:=xlValidAlertStop, Operator:=xlLessEqual, Formula1:="20"
        .IgnoreBlank = True
        .InputTitle = "Check #"
        .ErrorTitle = "Check #"
        .InputMessage = "Enter 20 characters or less"
        .ErrorMessage = "You can only enter a maximum of 20 characters (uppercase) or less in this column!"
End With

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    是的,您是正确的,您需要使用自定义验证。如果你给它区域中第一个单元格的相对引用,Excel 将调整其余单元格的引用。

    公式为=AND(LEN(<cell>)<=20,EXACT(<cell>,UPPER(<cell>)))

    要使消息正常工作,请添加 .Show* = TRUE 属性

    Sub Demo()
        Dim shTemp As Worksheet
        Dim Rng As Range
        Dim Addr As String
        Set shTemp = ThisWorkbook.Sheets("Template")
        Set Rng = shTemp.Range("G2:G" & shTemp.Range("G" & shTemp.Rows.Count).End(xlUp).Row)
        Addr = Rng.Cells(1, 1).Address
        With Rng.Validation
            .Delete
            .Add Type:=xlValidateCustom, _
              AlertStyle:=xlValidAlertStop, _
              Operator:=xlBetween, _
              Formula1:="=AND(LEN(" & Addr & ")<=20,EXACT(" & Addr & ",UPPER(" & Addr & ")))"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = "Check #"
            .ErrorTitle = "Check #"
            .InputMessage = "Enter 20 characters or less"
            .ErrorMessage = "You can only enter a maximum of 20 characters (uppercase) or less in this column!"
            .ShowInput = True
            .ShowError = True
        End With
    End Sub
    

    请注意,... .End(xlUp).Row 将仅将验证应用于 G 列中的单元格,直到最后一个包含数据的单元格。如果您还没有填写某些单元格,则需要另一种方法来定义范围,例如Set Rng = shTemp.Columns(7)

    【讨论】:

    • 感谢克里斯!但是,在测试此代码时,我确实注意到了一个小错误。如果我从另一个带有小写字母的单元格/工作表/工作簿复制数据和/或总长度超过 20 个字符并将其粘贴到 G 列中的任何一个单元格中,系统会让我!它不会像应有的那样提示错误消息。如何放入一个限制复制数据的控件?
    • Re在测试这段代码时,我确实注意到了一个小错误。这不是发布的代码中的错误,这是验证的已知限制。
    • 我尝试按照您发送给我的这篇文章中的说明进行操作,但现在我在运行宏时遇到此错误消息“运行时错误'1004':对象'_Application'的方法'撤消' ' 失败。调试器直接将我带到代码行“Application.Undo”。你知道我该如何解决这个错误吗?
    【解决方案2】:

    @chris neilsen 为您提供了用于数据验证规则的公式。那太好了。

    但是,正如您所注意到的,粘贴到单元格时不会进行验证,除非您粘贴为值,否则验证规则会被删除。

    因此,我建议您添加 VBA 代码来简单地防止粘贴到任何包含数据验证的单元格中。您可以使用 SelectionChange 事件来执行此操作。

    首先,为包含数据验证的范围定义一个名称,假设您将其命名为DataValidationRange。然后,将以下代码放入工作表的代码模块中(右键单击工作表选项卡,然后选择查看代码)...

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        
        If Not Intersect(Target, Range("DataValidationRange")) Is Nothing Then
            Application.CutCopyMode = False
        End If
            
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 2017-08-11
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2018-01-02
      相关资源
      最近更新 更多