Abfrage der Spalten für Quiz

  • Excel

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Flambo.

    Abfrage der Spalten für Quiz

    Hallo alle zusammen!

    Für eine Projektarbeit muss ich ein Quiz erstellen, dass auf einer Exceltabelle basiert.
    Bei der Tabelle habe ich eine Spalte mit Stadtteilen und eine Spalte mit den dazugehörigen Straßen/Wegen/Plätzen.
    Bei dem Quiz geht es darum, das man zuvor auswählen kann, ob man zu einer Straße den Stadteil "erraten" will oder zu einem Stadteil die Straße(n).
    - Dem Spieler werden pro Spiel nacheinander fünf Fragen gestellt
    - Pro Frage müssen zu einem vorgegebenen Stadtteil dazugehörige Straßen/Wege/Plätze identifiziert werden bzw. andersrum, wobei aus vier vorgegebenen Antwortmöglichkeiten gewählt werden kann
    - 1 - max. 4 Antwortmöglichkeiten pro Frage sind korrekt
    - Pro Frage gibt es keine redundanten Antwortmöglichkeiten, d.h. vier verschiedene Straßen/Wege/Plätze sind stets als Antwortmöglichkeiten vorgegeben
    - In Abhängigkeit der richtigen Antworten erhält der Spieler folgende Punkte pro Frage: 0 Punkte falls keine korrekte Antwortmöglichkeit selektiert worden ist; 2 Punkte falls mindestens eine aber nicht alle korrekte(n) Antwortmöglichkeiten selektiert worden sind; 5 Punkte falls alle korrekten Antwortmöglichkeiten selektiert worden sind

    Es soll schlussendlich wie auf dem angehängten Bild aussehen.
    Wie erstelle ich so ein Quiz?
    Dateien
    • Quiz.pdf

      (88,8 kB, 290 mal heruntergeladen, zuletzt: )
    Für die Abfrage der Exceltabelle sowie die Antwortmöglichkeiten habe ich leider keinen Code, sonst hätte ich diesen schon hochgeladen.
    Mein derzeitiger Standpunkt ist, dass ich den Loginbereich angelegt habe, von dem man nach Bestätigung des Passworts zu den Spielregeln weitergeleitet wird. Wenn man dann die Spielregeln bestätigt, kommt man zu dem Auswahlmenu mit 2 OptionButton, um festzulegen ob man den Stadtgebieten die Straßen zuordnen will oder andersherum. Nach der Auswahl kommt man dann zum Quiz. Je nach dem welche Auswahl man getroffen hat kommt man zu Form1 (Quiz für Stadtgebiete) oder Form2 (Quiz für Straßen). Auch hier funktionieren meine CommandButtons wie gewollt und selbst die Namenübernahme vom Login hier her funktioniert.
    Um den Aufbau des ganzen besser verstehen zu können, habe ich das ganze mal aufgezeichnet (s. Anhang)
    Der einzige aber entscheidende Punkt, andem ich hänge, ist die Abfrage der Exceltabelle, um daraus die Frage und die Antwortmöglichkeiten nach dem Zufallsprinzip zu generieren.
    Dateien
    • Aufbau.pdf

      (97,83 kB, 269 mal heruntergeladen, zuletzt: )
    Dann stelle ich jetzt meine Fragen eben nacheinander:

    1. Ich habe eine Textbox die sich beim Klick auf den CommandButton teilweise ändern soll.

    Quellcode

    1. TextBox.text = "Welche der nachfolgenden Straßen gehören zu dem Stadtgebiet Innenstadt"


    Der Teil "Innenstadt" soll sich beim Klick auf den Button jedes mal ändern. Es soll durch einen Zufallgenerator ein neues Stadtgebiet aus der Spalte B2:B707 ausgewählt werden.
    Wie kann ich das umsetzen?

    Danke schon einmal im Voraus!

    Visual Basic-Quellcode

    1. dim stadtgebiet as integer
    2. Dim ganzerSatz as String
    3. Stadtgebiet= int((705*rnd)+2)
    4. GanzerSatz="Welcher der nachfolgenden Straßen gehören zu dem Stadtgebiet " + worksheets("tabellenname").cells(2,Stadtgebiet)
    5. Textbox1.text=ganzerSatz


    Probier das mal. Das sollte dir einen zufälligen Stadtteil aus deiner Tabelle aus der Spalte B ab Zeile 2 auswerfen.
    Den Quellcode habe ich bei CommandButton_Click eingefügt, weil ich ja möchte, dass er sich beim Klicken auf den Button ändert. Leider funktioniert dies nicht. In der TextBox wird keine Frage ausgegeben und ich erhalte regelmäßig beim debuggen die Meldung "Index außerhalb des gültigen Bereichs" (bezogen auf Zeile 4 dex Codes)
    Ich hab den Code jetzt schon an meine Tabelle angepasste, aber es funktioniert weiterhin nicht.

    Quellcode

    1. Dim Stadtteil As Integer
    2. Dim ganzerSatz As String
    3. Stadtteil = Int((705 * Rnd) + 2)
    4. ganzerSatz = "Welche der nachfolgenden Straßen gehören zu dem Stadtteil " + Worksheets("Tabelle2").Cells(2, Stadtteil)
    5. TextBox1.Text = ganzerSatz


    Zum besseren Verständniss habe ich mal einen Ausschnitt der Tabelle mit hochgeladen.
    Vielen Dank schon mal!
    Dateien
    • Tabelle.pdf

      (178,02 kB, 308 mal heruntergeladen, zuletzt: )
    Änderungen mal die Zeile 4 so um

    Visual Basic-Quellcode

    1. GanzerSatz="Welcher der nachfolgenden Straßen gehören zu dem Stadtgebiet " + worksheets("tabellenname").cells(2,Stadtgebiet).value


    Wenn das nicht geht, kommentier mal Zeile 4 aus und Änderungen mal die textbox auf

    Visual Basic-Quellcode

    1. Textbox1.text=Stadtteil


    um und sag mal was der in die textbox einträgt. Ist es eine Zahl zwischen 2-705?
    Wenn ich .value anhänge kommt wieder die Meldung "Index außerhalb des gülting Bereichs"
    Wenn ich Zeil4 auskommentiere passiert nichts, es wird kein Wert ausgegeben.

    Im nachfolgend steht jetzt mal der komplette Code. Vielleicht liegt hier auch irgendwo ein Fehler, der es unmöglich macht, dass die Funktion funktioniert. Bitte nicht erschrecken, ich hab das mit meinen VB Kenntnissen, nach einem Pflichtsemester "Anwendungspakete", dass ich für mein BWL Studium brauche, geschrieben.

    Quellcode

    1. Private Sub CommandButton1_Click()
    2. Static cnt As Long
    3. If cnt >= 5 Then GoTo Neustart
    4. Dim Stadtteil As Integer
    5. Dim ganzerSatz As String
    6. Stadtteil = Int((705 * Rnd) + 2)
    7. ganzerSatz = "Welche der nachfolgenden Straßen gehören zu dem Stadtteil " + Worksheets("Tabelle2").Cells(2, Stadtteil).Value
    8. TextBox1.Text = ganzerSatz
    9. If CheckBox1.Value = True Or CheckBox2.Value = True Or CheckBox3.Value = True Or CheckBox4.Value = True Then
    10. CheckBox1.Value = False
    11. CheckBox2.Value = False
    12. CheckBox3.Value = False
    13. CheckBox4.Value = False
    14. Else
    15. UserForm10.Show
    16. cnt = cnt - 1
    17. End If
    18. Neustart:
    19. cnt = cnt + 1
    20. If cnt = 5 Then
    21. CommandButton1.Caption = "Noch mal?"
    22. CommandButton2.Caption = "Punkte einlösen"
    23. CheckBox1.Enabled = False
    24. CheckBox2.Enabled = False
    25. CheckBox3.Enabled = False
    26. CheckBox4.Enabled = False
    27. End If
    28. If cnt = 6 Then
    29. Unload Me
    30. Unload UserForm8
    31. UserForm8.Show
    32. End If
    33. End Sub


    Zur Erklärung, was bei Klick auf den Button passieren soll:
    1. Frage wird gestellt
    2. Jeder Click wird gezählt (cnt = cnt +1)
    3. Es wird überprüft ob mindestens eine Antwort angekreuzt ist
    --> Wenn wahr: CheckBoxes werden für nächste Fragen wieder geleert
    --> Wenn falsch: Fehlermeldung; cnt = cnt - 1
    5. Ab fünf gezählten Clicks (d.h. alle fünf Fragen wurden beantwortet) wird er If Befehl übersprungen
    6. Wenn fünf Clicks gezählt wurden ändert sich die Bennenung des Buttons auf "Noch mal?" um; (Ein anderer Button änder auch seine Bennenung auf "Punkte einlösen") und die CheckBoxes werden deaktiviert
    7. Der 6 Click ruft eine andere UserForm auf und schließt diese

    Ich hoffe es ist verständlich.
    Hab mir jetzt nochmal Hilf geholt und mit folgendem Code funktioniert es. Gibt es allerdings noch eine Möglichkeit, dass nicht zwei Mal das gleiche Stadtteil durch Zufall gerneriert wird?

    Quellcode

    1. Const Untergrenze As Integer = 2
    2. Const Obergrenze As Integer = 707
    3. Randomize Timer
    4. Dim Stadtteil As Integer
    5. Dim ganzerSatz As String
    6. Stadtteil = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    7. ganzerSatz = "Welche der nachfolgenden Straßen gehören zu dem Stadtteil " & Worksheets("Tabelle2").Cells(Stadtteil, "C").Text
    8. TextBox1.Text = ganzerSatz
    Das kommt davon, wenn man nur aus dem Kopf arbeitet.
    Habe bei cells die Spalte mit der Zeile vertauscht. Deshalb auch außerhalb des Index...
    Für den Wiederholungsfall kannst nen Array erstellen, mit den letzten 10 Ergebnissen und diese vor Weitergabe an die textbox prüfen und einen neuen durchlauf der zufallszahl erzwingen.
    Was muss ich machen, damit der Inhalt der Checkboxes ungleich ist?
    Ich habs mit Do Loop Until probiert, aber das funktioniert nicht.

    Quellcode

    1. Const Untergrenze As Integer = 2
    2. Const Obergrenze As Integer = 707
    3. Randomize Timer
    4. Dim Straße As Integer
    5. Do
    6. Straße = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    7. CheckBox1.Caption = Worksheets("Tabelle2").Cells(Straße, "B").Text
    8. CheckBox2.Caption = Worksheets("Tabelle2").Cells(Straße, "B").Text
    9. CheckBox3.Caption = Worksheets("Tabelle2").Cells(Straße, "B").Text
    10. CheckBox4.Caption = Worksheets("Tabelle2").Cells(Straße, "B").Text
    11. Loop Until CheckBox1.Caption <> CheckBox2.Caption <> CheckBox3.Caption <> CheckBox4.Caption
    Hat sich erledigt. Vielleicht ein bisschen kompliziert aber mit folgendem Code klappt alles.

    Quellcode

    1. Const Untergrenze As Integer = 2
    2. Const Obergrenze As Integer = 707
    3. Randomize Timer
    4. Dim Straße1 As Integer
    5. Dim Straße2 As Integer
    6. Dim Straße3 As Integer
    7. Dim Straße4 As Integer
    8. Do
    9. Do
    10. Straße1 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    11. CheckBox1.Caption = Worksheets("Tabelle2").Cells(Straße1, "B")
    12. Straße2 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    13. CheckBox2.Caption = Worksheets("Tabelle2").Cells(Straße2, "B")
    14. Straße3 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    15. CheckBox3.Caption = Worksheets("Tabelle2").Cells(Straße3, "B")
    16. Straße4 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    17. CheckBox4.Caption = Worksheets("Tabelle2").Cells(Straße4, "B")
    18. Loop Until Straße1 <> Straße2 <> Straße3 <> Straße4
    19. Loop Until Worksheets("Tabelle2").Cells(Straße1, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Or Worksheets("Tabelle2").Cells(Straße2, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Or Worksheets("Tabelle2").Cells(Straße3, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Or Worksheets("Tabelle2").Cells(Straße4, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C")
    Letzte Frage, dann habe ich das leidige Thema "Quiz" hinter mir.

    Der folgende Code generiert beim öffnen der UserForm eine Frage und vier verschiedene Antworten, von denen mind. eine richtig ist

    Quellcode

    1. Private Sub UserForm_Initialize()
    2. Dim Stadtteil As Integer
    3. Dim ganzerSatz As String
    4. Dim Straße1 As Integer
    5. Dim Straße2 As Integer
    6. Dim Straße3 As Integer
    7. Dim Straße4 As Integer
    8. Const Untergrenze As Integer = 2
    9. Const Obergrenze As Integer = 707
    10. Randomize Timer
    11. Stadtteil = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    12. ganzerSatz = "Welche der nachfolgenden Straßen gehören zu dem Stadtteil " & Worksheets("Tabelle2").Cells(Stadtteil, "C") & "?"
    13. TextBox1.Text = ganzerSatz
    14. Do
    15. Do
    16. Straße1 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    17. CheckBox1.Caption = Worksheets("Tabelle2").Cells(Straße1, "B")
    18. Straße2 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    19. CheckBox2.Caption = Worksheets("Tabelle2").Cells(Straße2, "B")
    20. Straße3 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    21. CheckBox3.Caption = Worksheets("Tabelle2").Cells(Straße3, "B")
    22. Straße4 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    23. CheckBox4.Caption = Worksheets("Tabelle2").Cells(Straße4, "B")
    24. Loop Until Straße1 <> Straße2 <> Straße3 <> Straße4
    25. Loop Until Worksheets("Tabelle2").Cells(Straße1, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Or Worksheets("Tabelle2").Cells(Straße2, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Or Worksheets("Tabelle2").Cells(Straße3, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Or Worksheets("Tabelle2").Cells(Straße4, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C")
    26. End Sub


    Anschließend soll beim Click des Buttons abgeklärt werden, ob die Antwort richtig ist.
    - Wenn alle möglichen Antwort richtig ausgewählt wurden erhöht sich der Wert in der TextBox7 um 5
    - Ist mind. eine Antwort aber nicht alle richtig erhöht sich der Wert in der TextBox7 um 2
    - Ist keine Antwort richtig ausgewählt worden gibt es keine Punkte.

    Im folgenden Code habe ich versucht dies umzusetzen

    Quellcode

    1. Private Sub CommandButton1_Click()
    2. Static cnt As Long
    3. Dim Stadtteil As Integer
    4. Dim ganzerSatz As String
    5. Dim Straße1 As Integer
    6. Dim Straße2 As Integer
    7. Dim Straße3 As Integer
    8. Dim Straße4 As Integer
    9. Const Untergrenze As Integer = 2
    10. Const Obergrenze As Integer = 707
    11. Dim x As Integer
    12. Dim Zähler As String
    13. If cnt >= 5 Then GoTo Neustart
    14. If CheckBox1.Value = True Or CheckBox2.Value = True Or CheckBox3.Value = True Or CheckBox4.Value = True Then
    15. If Worksheets("Tabelle2").Cells(Straße1, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Then
    16. If CheckBox1.Value = True Then
    17. CB2:
    18. If Worksheets("Tabelle2").Cells(Straße2, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Then
    19. If CheckBox2.Value = True Then
    20. CB3:
    21. If Worksheets("Tabelle2").Cells(Straße3, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Then
    22. If CheckBox3.Value = True Then
    23. CB4:
    24. If Worksheets("Tabelle2").Cells(Straße4, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Then
    25. If CheckBox4.Value = True Then
    26. TextBox7.Text = TextBox7.Text + 5
    27. Else
    28. TextBox7.Text = TextBox7.Text + 2
    29. End If
    30. End If
    31. TextBox7.Text = TextBox7.Text + 5
    32. Else
    33. TextBox7.Text = TextBox7.Text + 2
    34. End If
    35. Else: GoTo CB4
    36. End If
    37. TextBox7.Text = TextBox7.Text + 5
    38. Else
    39. TextBox7.Text = TextBox7.Text + 2
    40. End If
    41. Else: GoTo CB3
    42. End If
    43. TextBox7.Text = TextBox7.Text + 5
    44. Else
    45. TextBox7.Text = TextBox7.Text + 2
    46. End If
    47. Else: GoTo CB2
    48. End If
    49. CheckBox1.Value = False
    50. CheckBox2.Value = False
    51. CheckBox3.Value = False
    52. CheckBox4.Value = False
    53. Randomize Timer
    54. Stadtteil = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    55. ganzerSatz = "Welche der nachfolgenden Straßen gehören zu dem Stadtteil " & Worksheets("Tabelle2").Cells(Stadtteil, "C") & "?"
    56. TextBox1.Text = ganzerSatz
    57. Do
    58. Do
    59. Straße1 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    60. CheckBox1.Caption = Worksheets("Tabelle2").Cells(Straße1, "B")
    61. Straße2 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    62. CheckBox2.Caption = Worksheets("Tabelle2").Cells(Straße2, "B")
    63. Straße3 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    64. CheckBox3.Caption = Worksheets("Tabelle2").Cells(Straße3, "B")
    65. Straße4 = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
    66. CheckBox4.Caption = Worksheets("Tabelle2").Cells(Straße4, "B")
    67. Loop Until Straße1 <> Straße2 <> Straße3 <> Straße4
    68. Loop Until Worksheets("Tabelle2").Cells(Straße1, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Or Worksheets("Tabelle2").Cells(Straße2, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Or Worksheets("Tabelle2").Cells(Straße3, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C") Or Worksheets("Tabelle2").Cells(Straße4, "C") = Worksheets("Tabelle2").Cells(Stadtteil, "C")
    69. Else
    70. UserForm10.Show
    71. cnt = cnt - 1
    72. End If
    73. Neustart:
    74. cnt = cnt + 1
    75. If cnt <= 4 Then
    76. x = cnt + 1
    77. Zähler = "Frage " & x & " von 5"
    78. Label4.Caption = Zähler
    79. End If
    80. If cnt = 5 Then
    81. CommandButton1.Caption = "Noch mal?"
    82. CommandButton2.Caption = "Punkte einlösen"
    83. CheckBox1.Caption = ""
    84. CheckBox1.Enabled = False
    85. CheckBox2.Caption = ""
    86. CheckBox2.Enabled = False
    87. CheckBox3.Caption = ""
    88. CheckBox3.Enabled = False
    89. CheckBox4.Caption = ""
    90. CheckBox4.Enabled = False
    91. TextBox1.Text = ""
    92. End If
    93. If cnt = 6 Then
    94. Unload Me
    95. Unload UserForm8
    96. UserForm8.Show
    97. End If
    98. End Sub


    Ich bin mir nicht genau sicher wo der Fehler liegt, aber ich gehe davon aus, dass die bei Sub UserForm_Initialize() generierten Anfangswerte nicht mit zu Sub CommandButton1_Click übernommen werden.
    Alles andere funktioniert, bis auf die If-Verschachtelung zur Ermittlung der Punkte.
    Der Fehler Bezieht sich auf Zeile 17 von Code2 (CommandButton_Click) und lautet: "Laufzeitfehler '1004': Anwendungs- oder objektdefinierter Fehler"

    Vielen Dank schon mal im Vorraus!