Answers:
问题的第一部分可以通过数据验证和自定义格式完成。为此,首先选择要验证的整个范围,然后单击“数据”功能区中的“数据验证”按钮。然后在“数据验证”对话框的“设置”选项卡中设置自定义格式,将“允许”下拉列表更改为“自定义”并粘贴或键入包含前导的公式 =
进入公式框:
=AND(A1 > 0, A1 < 1000000000, A1 = INT(A1), COUNTIF(A:A, A1) <= 1)
AND
如果所有参数都为true,则返回true。 A1 > 0
验证该数字是正数。 A1 < 1000000000
验证该数字最多为9个字符。 A1 = INT(A1)
验证该数字不是小数。 COUNTIF(A:A, A1) <= 1
验证范围仅包含1个数字实例。 除非范围被格式化为文本,否则无需检查是否没有前导零,因为Excel会自动从数字中删除任何前导零。
此公式假定您的目标范围是A列。更改所有实例 A1
在公式中,目标范围内的第一个单元格和 $A:$A
到整个范围。在提到整个范围时,请务必使用相对参考表格,而在提及整个范围时,请使用绝对参考表格(即 B1
对于第一个细胞和 $B$1:$B$20
对于整个范围。)
使用数据验证的好处是不需要使用宏,您可以在“数据验证”对话框中指定自定义输入消息和自定义错误消息。
如果没有一些VBA,你问题的第二部分就不容易实现。如果您正在使用表并将数据验证应用于列,则可以使用隐藏列和类似于以下内容的自定义函数轻松完成此操作:
Function LimitAlpha24(str As String) As Boolean
Dim rx As Object
Set rx = CreateObject("VBScript.RegExp")
rx.Pattern = "^[A-Za-z-]{0,24}$"
LimitAlpha24 = rx.Test(str)
End Function
将以下事件宏放在工作表代码区域中:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim A As Range, v As Variant, L As Long, i As Long
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
Set A = Range("A1:A10")
If Intersect(Target, A) Is Nothing Then Exit Sub
Application.EnableEvents = False
v = Target.Text
L = Len(v)
If L > 9 Then
MsgBox "input too long"
GoTo errOut
End If
For i = 1 To L
If Mid(v, i, 1) Like "[0-9]" Then
Else
MsgBox "bad character"
GoTo errOut
End If
Next i
If Left(v, 1) = "0" Then
MsgBox "leading zero"
GoTo errOut
End If
If wf.CountIf(A, v) > 1 Then
MsgBox "duplicate value"
GoTo errOut
End If
Application.EnableEvents = True
Exit Sub
errOut:
Target.Clear
Target.Select
Application.EnableEvents = True
End Sub
假定的细胞范围是 A1:A10
因为它是工作表代码,所以很容易安装和自动使用:
如果您有任何疑虑,请先在试用工作表上试用。
如果保存工作簿,宏将与其一起保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx
要删除宏:
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
要了解有关事件宏(工作表代码)的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/event.htm
必须启用宏才能使其正常工作!