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更好。