Excel VBA脚本-使用预定义的模式匹配单元格值

时间:2018-07-12 05:08:58

标签: excel vba excel-vba

我正在尝试为Excel创建一个VBA脚本。我想在一定范围的单元格中限制用户的输入,以仅允许一个确切的数字,然后是一个破折号和另一个数字或仅一个数字。验证应仅允许以下两种类型的输入:

12-500 要么 12

我知道这可以通过excel的内置数据验证来完成,但是我试图通过vba脚本寻找另一种选择。

我想到的唯一想法就是使用类似这样的东西:

如果不是cell.Value,例如“ [A-Z]”,则

我刚刚开始使用VBA,所以我似乎无法理解如何在代码中实现它。

3 个答案:

答案 0 :(得分:0)

这里是验证输入是否在0到9之间的代码。

With Selection.Validation
    .Delete
    .Add Type:=xlValidateDecimal, AlertStyle:=xlValidAlertStop, Operator _
    :=xlBetween, Formula1:="0", Formula2:="9"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With

您可以根据需要更改此功能。

提示:您将需要使用 Type:= xlValidateCustom ,并且仅需要在Formula1中描述逻辑即可。您不需要Formula2

提示2:使用

选择单元格范围
Range("D3:M30").Select
    With Selection.Validation

答案 1 :(得分:0)

另一种方式是,工作表更改事件将允许您验证单元格值并应用逻辑。

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Whoa

    Application.EnableEvents = False

    'When Value in "A1 changes"

    If Target.Address = "$A$1" And Target.CountLarge = 1 Then
          Target.NumberFormat = "@"

        'put logic to restrict

        If checkStr(Target.Value) = False Then
            Target.Value = ""
        End If
    End If

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub


Function checkStr(ByVal str As String) As String

    Dim objRegEx As Object, allMatches As Object
    Set objRegEx = CreateObject("VBScript.RegExp")

    With objRegEx
        .MultiLine = False
        .IgnoreCase = False
        .Global = True
        .Pattern = "[0-9-]"
    End With


    Set allMatches = objRegEx.Execute(str)
    checkStr = (allMatches.Count > 0)

End Function

答案 2 :(得分:0)

这是一种不依赖于内置验证或正则表达式的简单方法:

Function validateInput(i As String) As Boolean
Dim a() As String
If Not i = "" Then a = Split(i, "-") else Exit Function
If Not UBound(a) = 1 Then Exit Function
If Not IsNumeric(a(0)) Then Exit Function
If Not IsNumeric(a(1)) Then Exit Function
validateInput = True
End Function

仅创建一个临时数组,尝试对“-”进行分割,如果没有“-”则无效,如果“-”太多则无效,如果上半部或第二半部不是“ isnumeric”,则无效!