我试图在我的 excel 工作表中限制某些单元格的输入,如下所示:
1-7,10,12
,这意味着只有数字和符号0
才能出现在单元格中。我想以非基于 vba 的数据验证方式理想地处理它,但即使是基于 vba 的解决方案也可以。9
-
,
编辑 - 有一个关键字将是一个例外,“固定”,如果我看到这个词,它将被允许。
我试图在我的 excel 工作表中限制某些单元格的输入,如下所示:
1-7,10,12
,这意味着只有数字和符号0
才能出现在单元格中。我想以非基于 vba 的数据验证方式理想地处理它,但即使是基于 vba 的解决方案也可以。9
-
,
编辑 - 有一个关键字将是一个例外,“固定”,如果我看到这个词,它将被允许。
使用Regex
对象的 VBA 版本:我刚刚编写了函数。您可以在工作表更改事件中简单地调用此函数。(就像悉达多的使用方式一样)。还有一件事,每次用户输入错误的字符时,该函数都会将它们全部删除:D ...然后,您需要再次注意,以确保此操作发生在您选择的特定范围内..因为否则它可以擦除任何正在更改的单元格!!!鉴于 Siddtharthinfinite loops
在此“工作表更改事件”中的帖子,我已经编辑了代码以包含该位。
Option Explicit
'-- within sheet change event
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Zoo
Application.EnableEvents = False
Call NumbersAndCommaDashOnly(Target)
GetBack:
Application.EnableEvents = True
Exit Sub
Zoo:
MsgBox Err.Description
Resume GetBack
End Sub
Function NumbersAndCommaDashOnly(ByRef rngInput As Range) As String
Dim objRegex As Object
Dim strInput As String
Set objRegex = CreateObject("VBScript.RegExp")
objRegex.IgnoreCase = True
objRegex.Global = True
objRegex.Pattern = "^[-,0-9]+$|^[Fixed]$"
If Not IsNull(rngInput.Value) Then
strInput = rngInput.Value
Else
NumbersAndCommaDash = "Empty Range"
rngInput.Value = ""
Exit Function
End If
If objRegex.Test(rngInput.Value) Then
NumbersAndCommaDash = objRegex.Replace(rngInput, "")
Else
NumbersAndCommaDash = "No numbers found"
rngInput.Value = ""
End If
End Function
这是仅适用于单元格 A1 的 VBA 方法。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
On Error GoTo Whoa
Application.EnableEvents = False
If Not Intersect(Target, Range("A1")) Is Nothing Then
If Len(Range("A1").Value) <> 0 Then
For i = 1 To Len(Range("A1").Value)
Select Case Asc(Mid(Range("A1").Value, i, 1))
'~~> Check for 0-9, "," and "-"
Case vbKey0 To vbKey9, 44, 45
Case Else
Range("A1").ClearContents
MsgBox "Invalid Value"
Exit For
End Select
Next
End If
End If
Letscontinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume Letscontinue
End Sub
代码进入Sheet1
代码区域。
屏幕截图(运行代码)
跟进问题中最近的编辑
换行
If Len(Range("A1").Value) <> 0 Then
到
If Len(Range("A1").Value) <> 0 And _
UCase(Range("A1").Value) <> "FIXED" Then