我目前正在excel电子表格上构建一个号码检查器,用于确定铭牌的字母和数字是否在正确的位置且有效。
我拥有的3个标准是这些公式中的数字牌是什么:
(我将一个数字表示为1,将一个字母表示为A)
AAA111A A111AAA AA11AAA
最终目标是让节目提出问题“看看这些号牌,它们是否遵循上面所示的格式。”
到目前为止,我只能检查某些地方是否有号码,但是当我尝试从左,右和中心进行搜索功能时,我无法指定字符A-Z。
=ISNUMBER(--MID(A3,1,3))
如果我想在单元格内搜索,例如第一个字符,是字母a-z,返回true还是false?我该怎么做呢?
此实例中的示例可能是:
DJO148R
公式
=ISNUMBER(--MID(A5,4,3))
这将返回true,因为第4个字符是数字,下一个字符也是如此。
使用相同的铭牌,如何更改它以搜索字母而不是数字牌中的数字?
答案 0 :(得分:2)
这是一个更简单的RegEx实现。确保包含对Microsoft VBScript Regular Expressions 5.5的引用。这将进入一个新的插入模块
Function PlateCheck(cell As Range) As Boolean
Dim rex As New RegExp
rex.Pattern = "[A-Z][0-9|A-Z][0-9|A-Z][0-9|A-Z][0-9|A-Z][0-9|A-Z][A-Z]"
If rex.Test(cell.Value) Then
PlateCheck = True
Else
PlateCheck = False
End If
End Function
答案 1 :(得分:1)
根据大家的评论,这是你如何用正则表达式做的:
确保包含 MS VB正则表达式5.5 作为参考。 为此,在VBA IDE中,转到Tools,Reference,然后查看正则表达式引用。
然后在新模块中添加:
Function VerifyLicensePlate(ip As Range) As String
Dim regex As New RegExp
Dim inputstr As String: inputstr = ip.Value
With regex
.Global = True
.IgnoreCase = True
End With
Dim strpattern(2) As String
strpattern(0) = "[A-Z][A-Z][A-Z][0-9][0-9][0-9][A-Z]"
strpattern(1) = "[A-Z][A-Z][0-9][0-9][A-Z][A-Z][A-Z]"
strpattern(2) = "[A-Z][0-9][0-9][0-9][A-Z][A-Z][A-Z]"
For i = 0 To 2
regex.pattern = strpattern(i)
If regex.Test(inputstr) Then
VerifyLicensePlate = "Match"
Exit Function
Else
VerifyLicensePlate = "No match"
End If
Next
End Function
输出:
答案 2 :(得分:0)
答案 3 :(得分:0)
这是一个使用后期绑定的版本,因此无需设置引用。 IT不区分大小写,因为您的问题似乎暗示了这一点,但这很容易改变。
Option Explicit
Function MatchPattern(S As String) As Boolean
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.Pattern = "\b(?:[A-Z]{3}\d{3}[A-Z]|[A-Z]{2}\d{2}[A-Z]{3}|[A-Z]\d{3}[A-Z]{3})\b"
.ignorecase = True
MatchPattern = .test(S)
End With
End Function
但是,正如G Serg指出的那样,你真的不需要正则表达式:
Option Explicit
Option Compare Text 'Case Insensitive
Function MatchPattern(S As String) As Boolean
Const S1 As String = "[A-Z][A-Z][A-Z]###[A-Z]"
Const S2 As String = "[A-Z]###[A-Z][A-Z][A-Z]"
Const S3 As String = "[A-Z][A-Z]##[A-Z][A-Z][A-Z]"
MatchPattern = False
If Len(S) = 7 Then
If S Like S1 Or _
S Like S2 Or _
S Like S3 Then _
MatchPattern = True
End If
End Function
这是一个相当复杂的公式,似乎符合您的规格:
=AND(LEN(A1)=7,
OR(MMULT(--(CODE(MID(A1,{1,2,3,4,5,6,7},1))>64),--(TRANSPOSE(CODE(MID(A1,{1,2,3,4,5,6,7},1))<91)))={4,5}),
CODE(LEFT(A1,1))>64,CODE(LEFT(A1,1))<91,
CODE(RIGHT(A1,1))>64,CODE(RIGHT(A1,1))<91,
ISNUMBER(-MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&"0123456789")),
7-MMULT(--(CODE(MID(A1,{1,2,3,4,5,6,7},1))>64),--(TRANSPOSE(CODE(MID(A1,{1,2,3,4,5,6,7},1))<91))))))
A1
的实例替换为UPPER(A1)
我认为UDF解决方案更好。