Excel 如何使IsNumeric检查整个字符串/变量,而不仅仅是第一个字符?

Excel 如何使IsNumeric检查整个字符串/变量,而不仅仅是第一个字符?,excel,vba,variables,split,isnumeric,Excel,Vba,Variables,Split,Isnumeric,我正在使用IsNumeric检查变量的一部分是否为数字。不幸的是,它似乎只检查字符串部分的第一个字符,而不是整个位 该公司目前接受Q123 1234567和QWER 1QWERTYR(以及其他类型的产品)。而我需要的前4个字符都是字母,其他的都是数字 我不知道我还缺少什么。请添加额外的意见,如果有可能的话,我对vba的理解仍然是基本的 Dim ConNr As String Dim Space As String Dim Four As String Dim Six As String Dim

我正在使用
IsNumeric
检查变量的一部分是否为数字。不幸的是,它似乎只检查字符串部分的第一个字符,而不是整个位

该公司目前接受Q123 1234567和QWER 1QWERTYR(以及其他类型的产品)。而我需要的前4个字符都是字母,其他的都是数字

我不知道我还缺少什么。请添加额外的意见,如果有可能的话,我对vba的理解仍然是基本的

Dim ConNr As String
Dim Space As String
Dim Four As String
Dim Six As String
Dim One As String
Dim Container As String

ConNr = Me.txtContainer.Value
Space = " "
Four = Left(Me.txtContainer.Value, 4)
Four = UCase(Four)
Six = Mid(Me.txtContainer.Value, 5, 6)
One = Right(Me.txtContainer.Value, 1)

'Check if all 4 are letters
If IsNumeric(Four) = True Then
    MsgBox "First 4 need to be letters."
    Me.txtContainer.SetFocus
    Exit Sub
Else
    'MsgBox "Four Letters " + Four

'Check if 6 characters are numbers
If IsNumeric(Six) = False Then
    MsgBox "4 Letters followed by 6 numbers."
    'MsgBox "These Six " + Six
    Me.txtContainer.SetFocus
    Exit Sub
Else
    'MsgBox "Six Numbers " + Six

'Last number is number
If IsNumeric(One) = False Then
    MsgBox "Last character needs to be a number."
    Me.txtContainer.SetFocus
    Exit Sub
Else
    'MsgBox "Last Number " + One
    ConNr = Four & Space & Six & Space & One
    Container = ConNr
End If
End If
End If
根据JvdV编辑

当我尝试
“[A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z]时,
输出是空的

我不想强迫用户使用正确的格式。(大写,空格)但需要4个字母/7个数字


Dim ConNr As String: ConNr = Me.txtContainer.Value


If ConNr Like "[A-Za-z][A-Za-z][A-Za-z][A-Za-z]#######" Then ‘Without spaces, else it doesn’t post.
Container = UCase(ConNr)
    Else
    MsgBox "YOU FAILED."
    Me.txtContainer.SetFocus
    Exit Sub

End If

‘Output should become ASDF 123456 7. Currently gives me ASDF1234567.

根据我的评论,这里有一个简单的示例代码来演示
Like
操作符的使用:

Sub Test()

Dim str As String: str = "QWER 1234567"
Dim arr As Variant: arr = Split(str, " ")

If arr(0) Like "[A-Z][A-Z][A-Z][A-Z]" And IsNumeric(arr(1)) Then
    Debug.Print str & " is passed!"
End If

End Sub
顺便说一句,如果你想允许使用大写和小写,你可以使用:
[A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z]


编辑

如果您要寻找4个字母字符、一个空格和6个数字的模式,您甚至可以做一些更简单的事情:

Sub Test()

Dim str As String: str = "QWER 123456"

If str Like "[A-Z][A-Z][A-Z][A-Z] ######" Then
    Debug.Print str & " is passed!"
End If

End Sub
如果要包含其他空格/数字,请扩展表达式。你说的是:

“ConNr=4&空间&6&空间&1”

所以
[A-Z][A-Z][A-Z][A-Z].\


根据您的评论,您不希望强制用户使用特定格式,只要他们的字符串中有4个字母和7个数字字符。以任何形式。 所以我想,既然有这么多地方可以放置空格,最好使用
Application.Substitute
来消除它们。您的代码可能如下所示:

If Application.Substitute(Me.txtContainer.Value, " ", "") Like "[A-Za-z][A-Za-z][A-Za-z][A-Za-z]#######" Then
    Debug.Print str & " is passed!"
End If
如果您不想取消大写字母,但仍想返回大写字母,请使用
UCase
函数立即覆盖整个字符串

Debug.Print UCase(Application.Substitute(Me.txtContainer.Value, " ", ""))

很难隐藏这样一个事实,即它非常类似于
RegEx

在这个解决方案中,合同编号格式的批准是由一个函数提供的,如果编号是好的,则返回True;如果编号是假的,则返回False。如果数字不好,函数会告诉你它有什么问题。如果发现可以接受,则调用过程继续执行程序。请注意,该函数可容纳缺少的或额外的空格,并将小写字母转换为大写字母

Option Explicit

Private Sub TestConNumber()

    Dim ConNr As String

'    ConNr = Me.txtContainer.Value
    ConNr = "QAAK 781234 x"
    If GetConNumber(ConNr) Then
        MsgBox "The Contract number is " & ConNr
    End If
End Sub

Private Function GetConNumber(ConNr As String) As Boolean
    ' return Not True if incorrect

    Dim Fun As Boolean                     ' function return value
    Dim Nr As String
    Dim Msg As String
    Dim Arr(1 To 3) As String

    Nr = UCase(Replace(ConNr, " ", ""))
    If Len(Nr) = 11 Then
        Arr(1) = Left(Nr, 4)
        If Arr(1) Like "[A-Z][A-Z][A-Z][A-Z]" Then
            If IsNumeric(Right(Nr, 7)) Then
                Arr(2) = Mid(Nr, 2, 6)
                Arr(3) = Right(Nr, 1)
                ConNr = Join(Arr)
                Fun = True
            Else
                Msg = "The last 7 digits must be numbers."
            End If
        Else
            Msg = "The first 4 characters must be non-numeric"
        End If
    Else
        Msg = "Input must have 11 characters"
    End If

    If Not Fun Then
        MsgBox Msg, vbExclamation, "Wrong input"
    End If

    GetConNumber = Fun
End Function

我建议这样做:您可以使用这样的模式来验证字符串。问题是
isNumeric
只能判断整个(子)字符串是否为数字。它无法判断它是否包含数字如果不想使用正则表达式,则需要检查每个字符是否为数字,或者使用
instr
测试字符串是否包含
0-9
中的任何一个ᴇʜ,
RegEx
是检查这些的一种非常好的方法,但是有一个内置的类似于
操作符的替代方法。@Pᴇʜ谢谢你,在找到最近的神之前,我仔细阅读了这篇文章并做了几次诚实的尝试。我发现
Like
选项对我来说要简单得多,因为我有点了解代码中发生了什么以及为什么。嗯,很好,我不知道
Like
操作符接受基本的正则表达式语法,比如
[A-Z]
。很好的了解和简单的检查可能比正则表达式更容易实现。相当令人惊讶的权利@Pᴇʜ. 下面是一些很好的例子。然而,它并没有告诉你,你可以把这些范围结合起来。因此,即使是
[A-Za-z0-9]
也能起作用(以及
[A-Ca-d3-7]
等品种)。对这些进行了测试。他们成功了!但是,当我在
[A-Z]
之后或
#
之间添加空格时,字符串不会发布。当我删除这些数字时,数字确实会打印到工作表上,但是作为QWER1234567而不是QWER1234567。@戴维,你能编辑你原来的问题并给出一些例子吗?听起来您需要一个
应用程序。在运行比较之前修剪
。如果可以有任意数量的空格,那么使用我文章中的第一个解决方案,但要循环返回的数组。@JvdV我编辑了这个问题,希望这就是你的意思。恐怕我自己还不知道如何创建循环。我尝试了这个方法,但得到了一个编译错误“注释只允许在
End Sub
End Function
End Property
之后出现”。(突出显示了
选项Explicit
)。我是否要将此代码添加到表单中,还是需要将其添加到单独的模块中?选项Explicit必须位于代码表的最顶部,位于任何程序声明的上方。函数调用应该在您现有的过程中:如果是GetConNumber(ConNr),则在顶部,如果在过程结束之前结束(避免使用Exit Subs中断代码流)。函数GetConNumber应该位于调用过程的下面,但也可以将其放置在标准代码模块中。如果它与调用过程不在同一模块中,则从其声明中删除“Private”一词以使其公开。