Excel ISTEXT替代方案?

时间:2015-02-09 15:57:26

标签: excel vba formula

我目前正在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个字符是数字,下一个字符也是如此。

使用相同的铭牌,如何更改它以搜索字母而不是数字牌中的数字?

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,然后查看正则表达式引用。

enter image description here

然后在新模块中添加:

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

输出:

enter image description here

答案 2 :(得分:0)

Occam's Razor会建议,

=NOT(ISNUMBER(--MID(A5,4,3)))

......或,

=ISERROR(--MID(A5,4,3))

答案 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))))))
  • 确保我们只有七个字符
  • OR(MMULT ...函数计算字母数,如果是4或5则返回TRUE。
  • 检查以确保第一个和最后一个字符是一个字母
  • 应该保留两位或三位数的连续字符串(字母数减少七位)
    • 如果您希望公式不区分大小写,请将A1的实例替换为UPPER(A1)

我认为UDF解决方案更好。