Zahlenraten

  • Word

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Holger.

    Hallo Zusammen,
    ich lerne gerade vba und bin noch Anfänger.
    Hab in Word ein UserForm mit zwei Zahlen-Eingabefeldern. Die Erste soll von Person 1 vorgeben werden und zwischen 0 und 100 liegen. Die Zweite soll von Person 2 geraten werden. Ein 3 Textfeld soll eine Information darüber liefern wie nah die geratene Zahl an der Vorgegeben liegt.
    Bedingung für die Ergebnisausgabe in Feld 3 ist:

    größer oder kleiner als die vorgegbene Zahl, unter 10 oder gleich 10 an der vorgegeben Zahl oder größer als 10 von der Ursprungszahl entfernt.
    Ich darf aber nur mit If und Select case arbeiten

    Folgenden Code habe ich erstellt:

    Quellcode

    1. 'Variablendeklaration
    2. Dim btewert1 As Byte
    3. Dim btewert2 As Byte
    4. Dim strerg1 As String
    5. Dim strerg2 As String
    6. Dim btediff1 As Integer
    7. Dim btediff2 As Integer
    8. btewert1 = Me.txt_wert1
    9. btewert2 = Me.txt_wert2
    10. 'Bei unzulässiger Eingabe
    11. If btewert1 <= 0 Then 'Wenn die Eingabe = 0 ist
    12. MsgBox "Sie mogeln!" & vbCrLf & _
    13. "Die Zahl soll größer als 0 sein!" & vbCrLf & _
    14. "Möchten Sie es erneut versuchen?", vbYesNo, "Wert = 0" 'Mitteilung über eine falsche Eingabe"
    15. If vbYes Then 'Wenn auf Yes geklickt wird
    16. Me.txt_wert1.Value = "" 'Die Einagebfelder leeren
    17. Me.txt_wert2.Value = ""
    18. Me.txt_wert1.SetFocus 'Den Curser in das Feld Wert1 setzen
    19. Else
    20. Unload Me 'Wenn auf No geklickt wird, Mitteilung schleißen
    21. End If
    22. ElseIf btewert1 >= 100 Then 'Wenn die Eingabe >=100
    23. MsgBox "Sie mogeln!" & vbCrLf & _
    24. "Die Zahl soll kleiner als 100 sein!" & vbCrLf & _
    25. "Möchten Sie es erneut versuchen?", vbYesNo, "Wert = 100" 'Mitteilung über eine falsche Eingabe
    26. If vbYes Then 'Wenn auf Yes geklickt wird
    27. Me.txt_wert1.Value = "" 'Die Einagebfelder leeren
    28. Me.txt_wert2.Value = ""
    29. Me.txt_wert1.SetFocus 'Den Curser in das Feld Wert1 setzen
    30. Else
    31. Unload Me 'Wenn auf No geklickt wird Mitteilung schließen
    32. End If
    33. 'Bei zulässiger Eingabe
    34. Else
    35. 'Variablendeklaration wenn die Vorgabnezahl OK
    36. btediff1 = btewert1 - 10 'Vorgabewert (txt_wert1) -10
    37. btediff2 = btewert1 + 10 'Vorgabewert (txt_wert1) +10
    38. 'Größer oder kleiner als die Vorgabe
    39. Select Case btewert2
    40. Case Is > btewert1 'Ratezahl ist zu groß
    41. strerg1 = "Sie werden übermütig"
    42. Case Is < btewert1 'Ratezahl ist zu klein
    43. strerg1 = "Sie müssen in größeren Dimensionen Denken!"
    44. Case Is = btewert1 'Ratezahl getroffen
    45. strerg1 = "Gratulation. Sie haben es geschafft!"
    46. Case Else
    47. End Select
    48. 'Vorgbae wurde um höchstens 10 oder mehr als 10 verfehlt
    49. Select Case btewert2
    50. Case Is = btewert1 'Ratezahl getroffen
    51. strerg2 = ""
    52. Case Is >= btediff1 'Ratezahl ist größer oder gleich als angegebene Zahl -10
    53. strerg2 = "Das ist schon ziemlich gut"
    54. Case Is < btediff1 'Ratezahl ist kleiner als angegebene Zahl -10
    55. strerg2 = "Strengen Sie sich etwas mehr an"
    56. Case Is <= btediff2 'Ratezahl ist kleiner oder gleich als angegebne Zahl +10
    57. strerg2 = "Das ist schon ziemlich gut"
    58. Case Is > btediff2 *************** 'Ratezahl ist größer als angegebene Zahl +10
    59. strerg2 = "Strengen Sie sich etwas mehr an"
    60. Case Else
    61. End Select
    62. End If
    63. Me.txt_ergebnis.Value = strerg2 + vbNewLine + strerg1 'Textausgabe im Ergebnisfeld


    Das letze Case If, mit den Sternchen im Kommentar, zeigt im Ergebnisfeld nicht an. Nach meinem Dafürhalten müsste aber funktionieren,
    oder ich sehe den Wald vor lauter Bäumen nicht. ?(
    Kann mit jemand Helfen?
    Mit vielem Dank vorab
    Holger

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Holger“ ()

    Hallo petaod,
    Dank Dir für Deine antwort

    Ich bin zwar mit dem Debugger noch nicht so vertraut aber ich habe
    auf die Art festgestellt das der Zugewiesene Wert = 0 ist.
    Ich kann aber nicht erkennen warum das so ist. Ich weise dem Variablen:

    btediff1 = btewert1 - 10 'Vorgabewert (txt_wert1) -10
    btediff2 = btewert1 + 10 'Vorgabewert (txt_wert1) +10


    doch einen klaren wert zu. Entweder + oder - 10

    btewert1 hat beide male den richtigen Inhalt.


    btediff1 bekommt den richtigen Wert zugewiesen also eingabewert - 10
    btediff2 bleibt 0

    Ich glaub ich seh den Wald vor lauter Bäumen nicht.
    Kannst Du mir vielleicht einnen Tipp zum Fehler geben. Du musst mir ja keine Lösung sagen.

    Danke schon mal vorab

    Gruß

    Holger

    Holger schrieb:

    btediff1 bekommt den richtigen Wert zugewiesen also eingabewert - 10
    btediff2 bleibt 0
    Das glaube ich weniger.
    Der CASE-Ast wird nicht durchlaufen, weil eine früher eintretende Bedingung das Select beendet.

    Welche Eingabewerte verwendest du denn?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    ich habe mir die Variablenwerte im Form, in Textfeldern, ausgeben lassen. Sie stimmen.
    Im Direktfenster allerdings wird mir für die Variable btediff2 der Wert 0 angezeigt.
    Die Eingabezahlen sind willkürlich

    Beispiel:

    Die Vorgabe lautet 50.
    Die zeite Zahl durch eine zweite Person eingegeben lautet 61 (Der Variableninhalt btediff2 hat jetzt den Wert 60, zumindest in Formularanzeige)
    Hier soll jetzt im Ergebnisfeld stehen: Sie werden übermütig. Strengen Sie sich etwas mehr an.
    Es steht aber: Sie werden übermütig. Das ist schon ziemlich gut. Eigentlich ist das der zutreffende Text für einen Eingabewert wie 56. Da funktioniert das auch.
    Ebenso nach unten. Also wenn dei zweite Person 45 oder 20 eingeben würde.

    Die frühzeitig erfüllte Bedingung kann ich einfach nicht finden.

    Holger

    Visual Basic-Quellcode

    1. Select Case btewert2
    2. Case Is = btewert1 'Ratezahl getroffen
    3. strerg2 = ""
    4. Case Is >= btediff1 'Ratezahl ist größer oder gleich als angegebene Zahl -10 'HIER IST DIE KRITISCHE STELLE
    5. strerg2 = "Das ist schon ziemlich gut"
    6. Case Is < btediff1 'Ratezahl ist kleiner als angegebene Zahl -10
    7. strerg2 = "Strengen Sie sich etwas mehr an"
    8. Case Is <= btediff2 'Ratezahl ist kleiner oder gleich als angegebne Zahl +10
    9. strerg2 = "Das ist schon ziemlich gut"
    10. Case Is > btediff2 '*************** 'Ratezahl ist größer als angegebene Zahl +10
    11. strerg2 = "Strengen Sie sich etwas mehr an"
    12. Case Else
    13. End Select


    Wenn du im Single-Step-Modus (F8) durchgehst, dann siehst du, dass der Case-Zweig bei der zweiten Bedingung verlassen wird und damit die fünften Bedingung gar nie abgefragt wird.
    Und das völlig zurecht.
    Du kannst das richtige Verhalten durch Umstellung der Case-Struktur erreichen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Sorry petaod aber ich war schwer im Stress!

    Jawoll du hast Recht, die Bedingung wird schon vorher erfüllt. Bis ich das geblickt habe!
    Durch eine Umstellung habe ich das Problem nicht lösen können aber so gehts:

    Visual Basic-Quellcode

    1. Select Case btewert2
    2. Case Is = btewert1 'Ratezahl getroffen
    3. strerg2 = ""
    4. Case Is > intgr 'Ratezahl ist größer als angegebene Zahl +10
    5. strerg2 = "Strengen Sie sich etwas mehr an"
    6. Case Is < intkl 'Ratezahl ist kleiner als angegebene Zahl -10
    7. strerg2 = "Strengen Sie sich etwas mehr an"
    8. Case Is <= intgr 'Ratezahl ist kleiner oder gleich als angegebne Zahl +10
    9. If btewert2 > btewert1 Then
    10. strerg2 = "Das ist schon ziemlich gut"
    11. Else
    12. strerg2 = "Das ist schon ziemlich gut"
    13. End If
    14. Case Is >= intkl 'Ratezahl ist größer oder gleich als angegebene Zahl -10
    15. If btewert2 < btewert1 Then
    16. strerg2 = "Das ist schon ziemlich gut"
    17. Else
    18. strerg2 = "Das ist schon ziemlich gut"
    19. End If
    20. Case Else
    21. End Select


    Ich danke dir für Deine Tipps.
    Gruß Holger