Excel ISTEXT替代方案?

Excel ISTEXT替代方案?,excel,vba,formula,Excel,Vba,Formula,我目前正在excel电子表格上构建一个数字板检查器,该检查器将确定数字板的字母和数字是否位于正确位置且有效 我的3个标准是,如果这些公式中的数字是: (我已将一个数字表示为1,将一个字母表示为a) 如果我想在单元格内搜索,例如,第一个字符是字母a-z,返回true还是false?我该怎么做呢 此实例中的一个示例可能是: DJO148R 这将返回为真,因为第4个字符是数字,下一个2也是数字 对于相同的数字板,如何将其更改为在数字板中搜索字母而不是数字 会建议 =NOT(ISNUMBER(--MID

我目前正在excel电子表格上构建一个数字板检查器,该检查器将确定数字板的字母和数字是否位于正确位置且有效

我的3个标准是,如果这些公式中的数字是:
(我已将一个数字表示为1,将一个字母表示为a)

如果我想在单元格内搜索,例如,第一个字符是字母a-z,返回true还是false?我该怎么做呢

此实例中的一个示例可能是:

DJO148R 这将返回为真,因为第4个字符是数字,下一个2也是数字

对于相同的数字板,如何将其更改为在数字板中搜索字母而不是数字

会建议

=NOT(ISNUMBER(--MID(A5,4,3)))
。。。或者

=ISERROR(--MID(A5,4,3))
会建议,

=NOT(ISNUMBER(--MID(A5,4,3)))
。。。或者

=ISERROR(--MID(A5,4,3))
会建议,

=NOT(ISNUMBER(--MID(A5,4,3)))
。。。或者

=ISERROR(--MID(A5,4,3))
会建议,

=NOT(ISNUMBER(--MID(A5,4,3)))
。。。或者

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

根据男生们的评论,下面是使用regex的方法:

确保包含MS VB正则表达式5.5作为参考。 要做到这一点,请在VBA IDE中,转到工具,引用,然后查看正则表达式引用

然后将其添加到新模块中:

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
输出:


根据大家的评论,下面是使用regex的方法:

确保包含MS VB正则表达式5.5作为参考。 要做到这一点,请在VBA IDE中,转到工具,引用,然后查看正则表达式引用

然后将其添加到新模块中:

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
输出:


根据大家的评论,下面是使用regex的方法:

确保包含MS VB正则表达式5.5作为参考。 要做到这一点,请在VBA IDE中,转到工具,引用,然后查看正则表达式引用

然后将其添加到新模块中:

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
输出:


根据大家的评论,下面是使用regex的方法:

确保包含MS VB正则表达式5.5作为参考。 要做到这一点,请在VBA IDE中,转到工具,引用,然后查看正则表达式引用

然后将其添加到新模块中:

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
输出:


下面是一个更简单的正则表达式实现。确保包含对Microsoft VBScript正则表达式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

下面是一个更简单的正则表达式实现。确保包含对Microsoft VBScript正则表达式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

下面是一个更简单的正则表达式实现。确保包含对Microsoft VBScript正则表达式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

下面是一个更简单的正则表达式实现。确保包含对Microsoft VBScript正则表达式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

这是一个使用后期绑定的版本,因此不需要设置引用。它不区分大小写,正如您的问题中所暗示的那样,但这很容易改变

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))))))
=和(LEN(A1)=7,

或者(MMULT(--(代码MID(A1,{1,2,3,4,5,6,7},1))>64),-(转置(代码MID(A1,{1,2,3,4,5,6,7},1))64,代码(左(A1,1))64,代码(右(A1,1))64),-(转置(代码MID(A1,{1,2,3,4,5,6,7},1))这是一个使用后期绑定的版本,因此不需要设置引用。它不区分大小写,正如您的问题中暗示的那样,但很容易更改

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))))))
=和(LEN(A1)=7,

或者(MMULT(--(代码MID(A1,{1,2,3,4,5,6,7},1))>64),-(转置(代码MID(A1,{1,2,3,4,5,6,7},1))64,代码(左(A1,1))64,代码(右(A1,1))64),-(转置(代码MID(A1,{1,2,3,4,5,6,7},1))这是一个使用后期绑定的版本,因此不需要设置引用。它不区分大小写,正如您的问题中暗示的那样,但很容易更改

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))))))
=和(LEN(A1)=7,

或者(MMULT(--(代码MID(A1,{1,2,3,4,5,6,7},1))>64),-(转置(代码MID(A1,{1,2,3,4,5,6,7},1))64,代码(左(A1,1))64,代码(右(A1,1))64),-(转置(代码MID(A1,{1,2,3,4,5,6,7},1))这是一个使用后期绑定的版本,因此不需要设置引用。它不区分大小写,正如您的问题中暗示的那样,但很容易更改

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))))))
=和(LEN(A1)=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))64,CODE(LEFT(A1,1))64,CODE(RIGHT(A1,1))64),(TRANSPOSE(CODE(MID(A1,{1,2,3,4,5,6,7},1))我建议使用用户定义的函数(aka-UDF)它使用正则表达式掩码来确定零件号是否符合预定义的模式。虽然正则表达式可能有点像兔子洞,但如果您开始使用,并将您的进度与任何困难的描述一起发布,则应提供有经验的帮助。我建议使用用户定义的函数(又名UDF)可能与之重复它使用正则表达式掩码来确定零件号是否符合预定义的模式。虽然正则表达式可能有点像兔子洞,但如果您开始使用,并将您的进度与任何困难的描述一起发布,则应提供有经验的帮助。我建议使用用户定义的函数(又名UDF)可能与之重复它使用正则表达式掩码来确定零件号是否符合预定义的模式。虽然正则表达式可能有点像兔子洞,但如果您开始使用,并将您的进度与任何困难的描述一起发布,则应该会提供有经验的帮助