Hallo liebe Comunity,
ich bin neu hier und bastel seit einiger Zeit an einem Tool um Vokabeln zu lernen, da ich anfangs nicht wusste ob es klappt wie ich mir das vorstelle, ist der Code über die Zeit gewachsen. Da ich leider kein Experte in VBA bin ist er dadurch nicht wirklich "dry" . Aber ich weiß leider auch nicht wie man es umsetzten kann das er es wird.
Der Grund für das Wachstum des Codes ist jedoch auch in Zukunft notwendig, da ich die Liste an Vokabeln stetig erweitern möchte. Daher wäre es schön wenn man den Code mit wenigen Änderungen, ggf. nur in Variablen auf die neuen Gegebenheiten anpassen kann.
Nun aber erstmal die Erklärung wie ich es bisher aufgebaut habe:
Ich weiß nicht ob das Einfügen des Bildlinks funktioniert, daher hier nochmal der Link: https://imgur.com/a/okuhv3L
So sieht also meine Abfrage Eingabefenster aus, zur Erläuterung, auch wenn es relativ selbsterklärend ist:
1. Hier wird das abgefragte Wort Angezeigt
2.Hier muss die Antwort eingetippt werden, bei richtiger Antwort erscheint ein "Richtig!" in der Zeile darunter bei falscher Antwort erscheint "Leider Falsch die Richtige Antwort ist ..." und die richtige Antwort wird angezeigt.
3.Ist der Start Knopf den man vor der ersten Eingabe bei jedem neu Öffnen drücken muss, da er sonst keinen Bezug hat.
4. / 5. nach Eingabe der Antwort muss einer der beiden Buttons gedrückt werden, somit hat man immer die Wahl, auch wenn eine Antwort als falsch angezeigt wird, z.B. auf Grund einer Kleinigkeit (vergessenes Fragezeichen o.ä.) kann man trotzdem sagen das es richtig war
6. Nur kleine Spielereien, Highscore, richtige Antworten infolge etc.
Auf dem letzten Bild sieht man die Wordlist die ich erstellt habe, welche sich entsprechend auch immer erweitert, in Spalte F habe ich ein "Ranking" dies ändert sich entsprechend ob meine Antwort richtig (-1) oder falsch (+1) war. Die höchste Zahl eines Abschnitts wird als nächste Vokabel gewählt.
Nun zu meinem Code, ich weiß das es nicht schön ist was ich da gebastelt habe, daher wende ich mich an euch um hier was dazuzulernen und Anregungen bekomme wie man sowas "sauber / dry" umsetzen kann. Ich kenne mich zwar etwas mit VBA aus aber auch dieser Code entstand dann immer mit Unterstützung von Google etc.
Private Sub CommandButton1_Click()
Set sh = Sheets(3) 'Edit sheet name
Set Rng = sh.Range("F2:F567") 'change to total range
Mx = WorksheetFunction.Max(Rng)
rw = WorksheetFunction.Match(Mx, Rng, 0) + Rng.Row - 1
Range("C5") = sh.Range("D" & rw)
Cells(15, 3).Clear
Cells(15, 3).Font.Size = 48
End Sub
Private Sub CommandButton2_Click()
sh.Range("F" & rw).Value = sh.Range("F" & rw).Value - 1
nr = rw
Cells(15, 3).Clear
Cells(15, 3).Font.Size = 48
Cells(25, 4).Value = Cells(25, 4).Value + 1
If Cells(25, 4).Value > Cells(30, 4).Value Then Cells(30, 4).Value = Cells(25, 4).Value
Dim arr
arr = Array(1, 95, 190, 285, 389, 480, 517) 'add new array beginning
rando1 = arr(Int(Rnd() * 7)) 'change array Number
Debug.Print rando1
If rando1 = 1 Then rando2 = 39
If rando1 = 95 Then rando2 = 189
If rando1 = 190 Then rando2 = 284
If rando1 = 285 Then rando2 = 388
If rando1 = 389 Then rando2 = 479
If rando1 = 480 Then rando2 = 516
If rando1 = 517 Then rando2 = 567 'add new random
Cells(42, 3).Value = rando1
Debug.Print rando2
Set Rng = sh.Range("F" & rando1, "F" & rando2) 'or whatever
Mx = WorksheetFunction.Max(Rng)
rw = WorksheetFunction.Match(Mx, Rng, 0) + Rng.Row - 1
If nr = rw Then
Randomize
rw = Int(565 * Rnd) + 2 'change
Range("C5") = sh.Range("D" & rw)
End If
Range("C5") = sh.Range("D" & rw)
End Sub
Private Sub CommandButton3_Click()
sh.Range("F" & rw).Value = sh.Range("F" & rw).Value + 1
Cells(15, 3).Clear
Cells(15, 3).Font.Size = 48
Cells(25, 4).Value = 0
Randomize
rw = Int(565 * Rnd) + 2 'change
Range("C5") = sh.Range("D" & rw)
End Sub
Zur Erläuterung, wenn der Button "Antwort richtig" (commandButton2) geklickt wird, wird per random eine von inzwischen 7 zahlen aus einem Array gepickt (rando1), zu dieser Zahl gibt es dann jeweils einen 2 Wert (rando2) aus diesen beiden Zahlen ergibt sich eine Range aus derer dann die Zeile gewählt wird die wie zuvor beschrieben das höchste "Rating" hat. Durch diese Unterteilung in mehrere Abschnitte, verhindere ich das mehrfach dasselbe Wort hintereinander kommt weil es ein höheres "Rating" hat als alle anderen Zahlen. Sollte der Fall eintreffen das doch zufällig dasselbe Wort kommt gibt es einen Abgleich, wenn es identisch ist, wird irgendein zufälliges Wort aus der gesamten Liste ausgewählt. Abschließend verringert sich das Ranking um 1. Achso und im oberen Bereich werden noch die Outputs für Highscore etc. abgeglichen.
Beim Drücken auf den Button "Antwort war falsch" (CommandButton3) wird einfach ein zufälliges Wort aus der gesamten Liste gewählt, der Counter zurückgesetzt und das Rating um 1 erhöht.
Die Lösung mit rando1 und rando 2 aus den Arrays war eine Behelfslösung eben um zu verhindern das die Liste stumpf von oben nach unten abgearbeitet wird und mehrfach dieselbe Vokabel hintereinander kommt. Auch zum Updaten ist dies nicht optimal da der code immer an mehreren Stellen geändert werden muss.
Meine Überlegung war jetzt das es schön wäre ein Array zu haben in dem in zufälliger Reihenfolge die 10/20 Vokabeln mit dem höchsten "Rating" stehen, und die Abfrage sich an diesem Array orientiert. Leider kann ich nicht einschätzen ob sowas leicht und sinnvoll möglich ist und schon gar nicht wie man es umsetzen kann. Natürlich bin ich auch für andere Vorschläge offen wie man hier eine Abwechslungsreiche Abfrage, die sich jedoch in der Mehrzahl auf die hohen "Ratings" bezieht erstellen kann.
Wichtig ist natürlich immer, dass das erweitern der Hauptliste hier schnell implementiert werden kann.
Ich hoffe ich konnte es Detailliert genug Beschreiben und mein Ziel ist deutlich, ich freue mich über jede Hilfe/Unterstützung. Und noch mal die Info, das ich leider kein experte bin, daher die Bitte auch bei den Antworten etwas ins Detail zu gehen, da ich sonst leider wenig damit anfangen kann.
Vielen Dank im Voraus, wenn weitere Informationen benötigt werden bitte Bescheid sagen.
|