2016-04-10 11 views
0

Ich bin neu mit VBA-Loops. Was ich versuche, ist eine do-Schleife und Eingabefeld-Prozedur, die nach einem Produktcode fragt, bis ein gültiger eingegeben wird. Der Code sollte mit dem Buchstaben P beginnen, gefolgt von vier Ziffern. Bei einer ungültigen Codeeingabe sollte eine Meldung angezeigt werden, die den Benutzer darüber informiert, warum die Eingabe ungültig ist.VBA Do Schleife und Input Box Inhalt funktioniert nicht

Ich habe das folgende Verfahren codiert. Es funktioniert, wenn der Benutzer zum Beispiel p9887 eingibt.

Wenn jedoch der Benutzer o899876 oder p877789, die Nachricht gibt „Product Code sollte fünf Zeichen lang sein“ und dann hat der Benutzer wieder einzugeben. Wenn der Benutzer in diesem zweiten Versuch p9876 eingibt, obwohl er alle Kriterien erfüllt, lautet die Nachricht, die von meiner Prozedur kommt: "Die letzten vier Zeichen sollten Ziffern sein", und es bleibt in der Schleife hängen, in der der Benutzer eingeben muss Eingabe erneut, und die gleiche Nachricht kommt auf.

Jede Einsicht, was ich falsch mache, wird sehr geschätzt!

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 

************************ Hier ist eine andere Art von Code, der sauberer ist, aber immer noch tut das gleiche Problem.

Antwort

1

Versuchen Sie, diese

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 

Ein mehr Eingabeblock Code "helfen" könnte die folgende sein:

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 
+0

Wie löst das sein Problem? –

+0

Ah ... Ich verstehe. Die Musterübereinstimmung macht alle seine Überprüfungen obsolet. –

+0

ja. natürlich könnte es auch so viel "Ahnung" wie nötig gemacht werden.Ich werde eine Bearbeitung in dieser Richtung posten – user3598756

1

Die Eingabe eines neuen Produktcodes nach einem Fehler ändert nicht 3 von 4 Ihrer Variablen. Ändern Sie die Zeile strInput = InputBox("Please enter product code") zu call ProductCode. Auf diese Weise werden Ihre Variablen entsprechend der neuen Eingabe geändert.

Um diese Fehler selbst herauszufinden, können Sie "Step in" aus dem "Debug" -Menü und Maus über Ihre Variablen, während Sie durch Ihren Code bewegen. Alternativ können Sie während der Entwurfsphase Ihres Programms die Variablen nach einem Codeabschnitt anzeigen, den Sie überprüfen möchten. Löschen Sie dann diese unnötigen Zeilen, wenn Sie sicher sind, dass es funktioniert.

+0

Es tut mir leid, welche Zeile von strInput sollte zu Ihrem Vorschlag geändert werden? Ich habe mehrere in meinem Code aufgelistet. Würden Sie dies auch so machen, dass der Benutzer den Produktcode korrekt eingibt? Zum Beispiel, wenn sie das erste Mal eingeben, pxyzt, dann möchte ich die Nachricht zeigen, warum das kein gültiger Code ist. Dann sollten sie etwas Neues eingeben, wenn sie dann p9876 eingeben, dann sollte es "Danke" sagen. – Rosario

-1

ich das Problem gefunden und fixiert es mit den folgenden:

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 

Das Problem war, diese Variablen deklariert zu haben und sie so zu setzen und im Code zu verwenden.

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

Nach dem Entfernen dieser Variablen aus dem Code funktioniert die Schleife wie es sollte! Vielen Dank für Ihre Antworten!