【发布时间】:2020-05-06 05:09:22
【问题描述】:
我正在使用IsNumeric 检查变量的一部分是否为数字。不幸的是,它似乎只检查字符串部分的第一个字符而不是整个位。
它目前接受即 Q123 1234567 和 QWER 1QWERTYR(以及其他变体)。虽然我需要前 4 个字符都是字母,其他字符都是数字。
我不知道我还缺少什么。如果可能的话,请添加额外的 cmets,我对 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] ###### #" 时,输出为空。
我不想强迫用户使用正确的格式。 (大写、空格。)但 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.
【问题讨论】:
-
我建议使用Regular Expressions 执行此操作:您可以使用类似
^[A-Za-z]{4} [0-9]+$的模式来验证您的字符串。问题是isNumeric只能判断整个(子)字符串是否为数字。它无法判断它是否包含数字。 • 如果您不想使用RegEx,那么您需要检查每个字符是否为数字,或者使用instr来测试字符串是否包含0-9。 -
根据@Pᴇʜ,
RegEx是检查这些内容的绝佳方式,但Like运算符有一个内置替代方案。 -
@Pᴇʜ 谢谢,在找到最近的神之前,仔细阅读了这篇文章并进行了一些诚实的尝试。我发现
Like选项对我来说更容易理解,因为我有点理解代码中发生了什么以及为什么。
标签: excel vba variables split isnumeric