我正在尝试为Excel创建一个VBA脚本。我想在一定范围的单元格中限制用户的输入,以仅允许一个确切的数字,然后是一个破折号和另一个数字或仅一个数字。验证应仅允许以下两种类型的输入:
12-500 要么 12
我知道这可以通过excel的内置数据验证来完成,但是我试图通过vba脚本寻找另一种选择。
我想到的唯一想法就是使用类似这样的东西:
如果不是cell.Value,例如“ [A-Z]”,则
我刚刚开始使用VBA,所以我似乎无法理解如何在代码中实现它。
答案 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”,则无效!