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”一词以使其公开。