【问题标题】:Excel Data Validation (Text Length) [closed]Excel 数据验证(文本长度)[关闭]
【发布时间】:2016-07-09 00:18:23
【问题描述】:

这可能必须在 VBA 中完成,这很好。

一些背景信息:我想在 Excel 的数据验证中使用文本长度选项。我需要限制为 60 个字符或更少。不过,这很容易。

我的问题是,如果用户超过了这个 60 个字符的阈值,我不希望我的错误警报保持静态并给出一个通用响应说“你必须保持低于 60 个字符......”我希望它实际上count 用户尝试在单元格中放置的字符数,然后在错误警报弹出窗口中我希望它更具体,例如:You have exceeded the 60-character limit by ## characters. Please shorten the input and try again. 有人知道解决方案吗? p>

【问题讨论】:

  • Worksheet_Change(或Workbook_SheetChange)事件宏可以替代数据验证并添加更多功能。
  • 请不要在所有大写字母中输入您的问题标题。大喊大叫是不礼貌的,它不会让你更快地得到答案。它还使您的标题更难阅读,而且相当粗鲁和烦人。适当大小写的文本更容易阅读。您在主页上看不到任何其他全部大写的问题标题,是吗?
  • 我评价你实际上使用 VB.NET 在 Visual Studio 中编写了一个 .VSTO 插件,纯粹是因为在我看来它更容易一点,而且你可以做更多,例如,你可以在控件上使用事件处理程序,因此您可以访问文本框的 TextChanged 事件以显示错误消息或其他内容,但仅显示一秒钟左右,然后继续或不显示。在我看来,在 VBA 中,它有点受限,例如,没有事件处理程序(据我所知),就像......没有 textbox.contains 方法......但是 VB.NET 却有。试试看 :) 这不是太难......会试一试。
  • 没问题。你能记住以后的帖子吗? :-)

标签: excel vba validation error-handling


【解决方案1】:

我在另一个答案中写了类似于K Davis 提供的代码。除了编码风格之外,还有主要的功能差异。

•  处理多个目标列
•  在消息中添加地址
•  在收到通知后选择恶意单元
•  向后循环,以便在出现多个恶意输入的情况下,用户最终会出现在第一个
• 变量的声明和赋值保留在实际需要时使用
•  紧急停止消息框

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Union(Columns("B"), Columns("D"))) Is Nothing Then
        On Error GoTo bm_Safe_Exit
        Application.EnableEvents = False
        Dim mssg As String, iLimit As Long, a As Long, t As Long, trgt As Range
        iLimit = 60
        Set trgt = Intersect(Target, Union(Columns("B"), Columns("D")))
        'loop backwards through multiples so we end up at the first rogue entry
        For a = trgt.Areas.Count To 1 Step -1
            For t = trgt.Areas(a).Cells.Count To 1 Step -1
                If Len(trgt.Areas(a).Cells(t).Value2) > iLimit Then
                    mssg = "You have exceeded the  " & iLimit & "-character limit by " & _
                            Len(trgt.Areas(a).Cells(t).Value2) - iLimit & " characters in " & _
                            trgt.Areas(a).Cells(t).Address(0, 0) & ". Please shorten the input and try again."
                    MsgBox mssg, vbCritical + vbOKOnly, "Bad Input"
                    trgt.Areas(a).Cells(t).ClearContents: trgt.Areas(a).Cells(t).Select
                End If
            Next t
        Next a
        Set trgt = Nothing
    End If

bm_Safe_Exit:
    Application.EnableEvents = True

End Sub

您可能想用一两个vbLF 分割句子。在我看来,它使警报消息更有效;添加单元格地址时尤其如此。

我曾考虑将所有恶意输入单元格地址放入一条消息中,但这会排除特定的透支字符数。


示例文字由Lorem Ipsum Generator提供

【讨论】:

  • 程序完成后,有关要重新输入的单元格的指示以及每个单元格超出的字符数消失了。建议 1) 可以使用 Cell cmets 标记需要重新输入的单元格,并指出超出的字符。 2)最后一个框消息的组合,指示某些单元格需要重新输入,而单元格中的 cmets 标记单元格并指示超出的字符。
  • Cont... 建议 1 可以通过替换这些行来实现:MsgBox mssg, vbCritical + vbOKOnly, "Bad Input"trgt.Areas(a).Cells(t).ClearContents: trgt.Areas(a).Cells(t).Select 用这些 With trgt.Areas(a).Cells(t) .AddComment .Comment.Text Text:=mssg .Comment.Visible = True .Comment.Visible = True .ClearContents .Select @ 987654336@Elsetrgt.Areas(a).Cells(t).ClearCommentsEnd If
  • 删除Range.ClearContents method 应该可以解决这个问题。
【解决方案2】:

感谢 Jeepeed 的建议,我进行了一次互联网搜索并偶然发现了this site。我已经稍微修改了这个人的代码以完成我在原始问题中需要的内容,并希望在其他人遇到我同样的问题时分享它。

代码如下:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Dim rCell As Range
    Dim iChars As Integer
    On Error GoTo ErrHandler

    'Change these as desired
    iChars = 60
    Set rng = Me.Range("B:B")

    If Not Intersect(Target, rng) Is Nothing Then
        Application.EnableEvents = False
        For Each rCell In Intersect(Target, rng)
            If Len(rCell.value) > iChars Then
                MsgBox "You have exceeded the 60-character" & _
                " limit by " & Len(rCell.value) - iChars & _
                " characters." & vbCrLf & "Please shorten" & _
                " your input and try again.", vbRetryCancel
            End If
        Next
    End If

ExitHandler:
    Application.EnableEvents = True
    Set rCell = Nothing
    Set rng = Nothing
    Exit Sub

ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub

【讨论】:

  • 您对这方面的补充感兴趣吗?
【解决方案3】:

我认为在单元格旁边使用 Excel 公式会更好:

= IF( LEN( B2 ) > 60, "You have exceeded the 60-character limit by " 
  & ( LEN( B2 ) - 60 ) & " characters. Please shorten your input and try again.", "" )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多