Как заставить IsNumeri c проверять всю строку / переменную, а не только первый символ? - PullRequest
3 голосов
/ 20 января 2020

Я использую IsNumeric, чтобы проверить, являются ли часть переменной числами или нет. К сожалению, кажется, что проверяется только первый символ строки, а не весь бит.

В настоящее время он принимает, например, Q123 1234567 и QWER 1QWERTYR (и другие варианты этого). Хотя мне нужно, чтобы первые 4 символа были все буквы, а остальные - все цифры.

Я понятия не имею, что мне все еще не хватает. Пожалуйста, добавьте дополнительные комментарии, если это возможно, мое понимание vba все еще ниже базового c.

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.

Ответы [ 2 ]

3 голосов
/ 20 января 2020

Согласно моему комментарию, приведем простой пример кода, демонстрирующий использование оператора 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]


Редактировать

Если вы ищете комбинацию из 4 букв c символов, то пробел, затем 6 цифры, вы даже можете сделать что-то более простое c:

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

Расширьте выражение, если хотите добавить еще один пробел / di git. Вы говорите о:

"ConNr = Четыре и Пробел и Шесть и Пробел и Один"

Так что [A-Z][A-Z][A-Z][A-Z] ###### # будет работать для вас в этом случае.


Согласно вашему комментарию, вы не хотите навязывать конкретный формат c для пользователей, если они имеют 4 буквенных и 7 цифр c символов в их строка В любой форме. Итак, я решил, что так как много мест для размещения пробелов, лучше всего избавиться от них, используя 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

Если вы не хотите ставить перед собой c заглавные буквы, но все же хотите его вернуть, используйте функцию UCase, чтобы ограничить всю строку сразу!

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

Трудно скрыть тот факт, что это очень похоже на RegEx.

0 голосов
/ 20 января 2020

В этом решении утверждение формата номера контракта обеспечивается функцией, которая возвращает 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
...