Содержимое VBA Do Loop и поля ввода не работает

Я новичок в циклах VBA. То, что я пытаюсь сделать, - это процедура цикла do и поля ввода, которая запрашивает код продукта до тех пор, пока не будет введен действительный код. Код должен начинаться с буквы P и сопровождаться четырьмя цифрами. При вводе недопустимого кода должно отображаться сообщение, сообщающее пользователю, почему код недействителен.

У меня закодирована следующая процедура. Это работает, например, когда пользователь вводит p9887.

Однако, если пользователь вводит o899876 или p877789, появляется сообщение "Код продукта должен состоять из пяти символов", после чего пользователю приходится вводить снова. При этой второй попытке, если пользователь вводит p9876, хотя он соответствует всем критериям, в результате моей процедуры появляется сообщение: «Последние четыре символа должны быть цифрами», и оно застревает в том цикле, где пользователь должен ввести свои введите еще раз, и появится то же сообщение.

Любое понимание того, что я делаю неправильно, очень ценится!

Option Explicit
Public Sub ProductCode()


Dim strInput As String

Dim intFrstLetter As Integer

Dim intLastFour As String

Dim strFrstLetter As String

Dim test As String

Dim blDone As Boolean


strInput = InputBox("Please enter product code")

intFrstLetter = InStr(1, strInput, "p")

intLastFour = Right(strInput, 4)

strFrstLetter = Left(strInput, 1)

Do

If strFrstLetter = "p" Then

    If Len(strInput) <> 5 Then
      MsgBox "Product code should have five characters."
     strInput = InputBox("Please enter product code")
    Else
       If IsNumeric(intLastFour) Then
       MsgBox "Thank You"
       blDone = True
       Exit Do
       Else
         MsgBox "The last four characters should be digits"
         strInput = InputBox("Please enter product code")
  If strFrstLetter <> "p" Then
    MsgBox "Product code should start with the letter P"
    strInput = InputBox("Please enter product code")
        End If
    End If
  End If
End If
Loop Until blDone = True
End Sub

************************ Вот еще один тип кода, который чище, но все еще делает ту же проблему.

Public Sub ProductCode()
Dim strInput As String
Dim intFrstLetter As Integer
Dim intLastFour As String
Dim strFrstLetter As String
Dim blDone As Boolean


strInput = InputBox("Please enter product code")

intFrstLetter = InStr(1, strInput, "p")
intLastFour = Right(strInput, 4)
strFrstLetter = Left(strInput, 1)
Do
    If strFrstLetter = "p" Then
        If Len(strInput) = 5 Then
           If IsNumeric(intLastFour) = True Then
            MsgBox "Thank You"
            Exit Do
           Else
            MsgBox "The last four characters should be digits"
            strInput = InputBox("Please enter product code")
           End If
       Else
         MsgBox "Product code should have five characters"
         strInput = InputBox("Please enter product code")
       End If
  Else
    MsgBox "Product code should start with the letter P"
    strInput = InputBox("Please enter product code")
 End If
Loop

person Rosario    schedule 10.04.2016    source источник


Ответы (3)


Попробуй это

Do While Not blDone
    blDone = InputBox("Please enter product code") Like "P####"
    If Not blDone Then MsgBox "the input didn't match the pattern 'P####' where:" _
                              & vbCrLf & vbCrLf & vbTab & "'P' must be the 'P' letter" _
                              & vbCrLf & vbTab & "'####' must be four integer digits"
Loop

Более «полезный» код блока ввода может быть следующим:

Dim strInput As String, msgStrng As String, defStrng As String
Dim blDone As Boolean

defStrng = "P####  [enter digits for each '#']"
Do While Not blDone
    strInput = InputBox("Please enter product code", "Product Code input", defStrng)
    blDone = strInput Like "P####"
    If Not blDone Then
        Select Case True
            Case Len(strInput) <> 5
                msgStrng = "Product code should have five characters"
                defStrng = Left(strInput, 5)
            Case Left(strInput, 1) <> "P"
                msgStrng = "Product code should start with letter 'P'"
                defStrng = "P" & Left(strInput, 4)
            Case Else
                msgStrng = "last four characters of Product code should be digits"
                defStrng = strInput
            End Select

            MsgBox msgStrng, vbCritical
    Else
        MsgBox "Thank you"
    End If
Loop
person user3598756    schedule 10.04.2016
comment
Ах я вижу. Совпадение с образцом делает все его проверки устаревшими. - person Paul Ogilvie; 10.04.2016
comment
да. конечно, его также можно было бы сделать настолько запутанным, насколько это необходимо. Я опубликую правку в этом направлении - person user3598756; 10.04.2016
comment
спасибо, user3598756, это помогло определить мою ошибку - person Rosario; 10.04.2016

Ввод нового кода продукта после ошибки не изменяет 3 из 4 ваших переменных. Измените строку strInput = InputBox("Please enter product code") на call ProductCode. Таким образом, ваши переменные будут изменены в соответствии с новым вводом.

Чтобы выяснить эти ошибки самостоятельно, вы можете использовать «Step into» из меню «debug» и наводить указатель мыши на свои переменные, пока вы перемещаетесь по своему коду. Или, в качестве альтернативы, на этапе разработки вашей программы отображайте свои переменные после фрагмента кода, который вы хотите проверить. Затем удалите эти ненужные строки, когда убедитесь, что это работает.

person Jens Bushrod-Roose    schedule 10.04.2016
comment
Извините, какую строку strInput следует изменить по вашему предложению? Я перечислил несколько из них в моем коде. Кроме того, сделает ли это так, чтобы пользователь правильно вводил код продукта? Например, если они вводят в первый раз pxyzt, то я хочу, чтобы в сообщении отображалось, почему это недействительный код. Затем они должны ввести что-то новое, поэтому, если они затем наберут p9876, то они должны сказать спасибо - person Rosario; 10.04.2016

Я нашел проблему и исправил ее следующим образом:

strInput = InputBox("Please enter product code")

Do
If Left(strInput, 1) = "p" Then
    If Len(strInput) = 5 Then
        If IsNumeric(Right(strInput, 4)) = True Then
            MsgBox "Thank You!"
            blDone = True
            Exit Do
        Else
            MsgBox "The last four characters should be digits"
            strInput = InputBox("Please enter product code")
        End If
    Else
        MsgBox "Product code should have five characters"
        strInput = InputBox("Please enter product code")
    End If
Else
    MsgBox "Product code should start with the letter P"
    strInput = InputBox("Please enter product code")
End If

Loop Until blDone = True

Проблема заключалась в том, чтобы объявить эти переменные, установить их вот так и использовать в коде.

intFrstLetter = InStr(1, strInput, "p")
intLastFour = Right(strInput, 4)
strFrstLetter = Left(strInput, 1)

После удаления этих переменных из кода цикл работает как надо! Спасибо всем за ваши ответы!

person Rosario    schedule 10.04.2016