Excel ISTEXT替代?
我目前正在Excel电子表格上build立一个铭牌检查器,确定铭牌上的字母和数字是否在正确的位置并且是有效的。
我所拥有的3个标准是如果这些公式中包含数字标牌:
(我把一个数字表示为1,一个字母表示为A)
AAA111A A111AAA AA11AAA
最终的目标是让程序提出这样的问题:“看看这些号码牌,是否按照上面所示的格式。”
到目前为止,我只能检查在某些地方是否有数字,但是当试图从左,右和中心执行searchfunction时,我不能指定字符A-Z。
=ISNUMBER(--MID(A3,1,3))
如果我想在一个单元格内search,例如,第一个字符,它是一个字母az,返回true或false? 我怎么去做这个?
在这种情况下的一个例子可能是:
DJO148R
公式
=ISNUMBER(--MID(A5,4,3))
这将会变成真实的,因为第四个字符是一个数字,下一个是2。
使用相同的电话号码牌,如何将其更改为在号码牌内search字母而不是数字?
这是一个更简单的RegEx实现。 确保您包含对Microsoft VBScript正则expression式5.5的引用。 这将进入一个新的插入模块
Function PlateCheck(cell As Range) As Boolean Dim rex As New RegExp rex.Pattern = "[AZ][0-9|AZ][0-9|AZ][0-9|AZ][0-9|AZ][0-9|AZ][AZ]" If rex.Test(cell.Value) Then PlateCheck = True Else PlateCheck = False End If End Function
根据这些家伙的评论,这是你如何使用正则expression式:
确保包含MS VB正则expression式5.5作为参考。 为此,在VBA IDE中,转到“工具”,“引用”,然后查看正则expression式引用。
然后将其添加到一个新的模块中:
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) = "[AZ][AZ][AZ][0-9][0-9][0-9][AZ]" strpattern(1) = "[AZ][AZ][0-9][0-9][AZ][AZ][AZ]" strpattern(2) = "[AZ][0-9][0-9][0-9][AZ][AZ][AZ]" 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
输出:
奥卡姆的剃刀会build议,
=NOT(ISNUMBER(--MID(A5,4,3)))
… 要么,
=ISERROR(--MID(A5,4,3))
这是一个使用迟绑定的版本,所以不需要设置引用。 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(?:[AZ]{3}\d{3}[AZ]|[AZ]{2}\d{2}[AZ]{3}|[AZ]\d{3}[AZ]{3})\b" .ignorecase = True MatchPattern = .test(S) End With End Function
但正如G Serg指出的那样,你并不需要正则expression式:
Option Explicit Option Compare Text 'Case Insensitive Function MatchPattern(S As String) As Boolean Const S1 As String = "[AZ][AZ][AZ]###[AZ]" Const S2 As String = "[AZ]###[AZ][AZ][AZ]" Const S3 As String = "[AZ][AZ]##[AZ][AZ][AZ]" 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))))))
- 确保我们只有七个字符
- OR(MMULT …)函数计算字母的数量,如果是四个或五个,则返回TRUE。
- 检查以确保第一个和最后一个字符是一个字母
- 应该保持连续的两位或三位数字(less于七位字母)
- 如果要使公式不区分大小写,请使用
UPPER(A1)
replaceA1
的实例,
- 如果要使公式不区分大小写,请使用
我认为UDF解决scheme更好。