Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Beim Zufallsgenerator Wiederholung vermeiden?

Betrifft: Beim Zufallsgenerator Wiederholung vermeiden? von: OlliB
Geschrieben am: 03.06.2008 18:58:36

Hallo liebe Forumsgemeinde...
ich hoffe, mir kann hier bei einem kleinen Problem geholfen werden.

Mittels Button in einer UF wird in einer Access-Datenbank zuerst in Spalte "Gewinn" nach einem bestimmten Wert gesucht. Die Anzahl der Treffer hier sehr unterschiedlich (bis zu 50). In dieser Trefferliste soll nun per Zufallsgenerator eine Zeile ausgewählt werden und die Inhalte werden dann in der UF angezeigt. So weit so gut...das hab ich mit dem untenstehenden Code realisieren können.

Problem ist, wenn der Button danach wieder betätigt wird, soll der Zufallsgenerator bereits ausgewählte Zeilen nicht mehr erneut anzeigen, sprich, er soll erkennen, dass die ID-Nummer in der 1. Spalte der Access-Datenbank bereits einmal aufgerufen wurde. Und dies soll er sich so lange merken, wie die aktuelle Sitzung andauert.

Das bekomme ich nicht hin....bzw. nur über Umwege. Könnte die ID-Nummern zwar in ne Tabelle speichern und darüber dann prüfen, aber es gibt bestimmt einen eleganteren und einfacheren Weg, oder?
Wäre top, wenn mir wer helfen könnte....

Hier mal ein Auszug aus dem Code:

Dim lastrec As Long, z As Integer
Dim i As Integer, dummy As Integer
Dim wahl: wahl = Array(1, 2, 3, 4)
Dim FrageNr As Long
Dim db As DAO.Database, tbl As DAO.TableDef, rs As DAO.Recordset

GetSQLData
On Error Resume Next
Set db = OpenDatabase(ThisWorkbook.Path & dbfile, True, True)

dbTable = Mid(dbQry, InStr(dbQry, "FROM") + 5)
Set tbl = db.TableDefs(dbTable)
ReDim GestellteFrage(tbl.RecordCount)
Set rs = db.OpenRecordset(dbQry & " WHERE (FZ1=""Thema"");")
rs.MoveFirst

'Filtern nach Spielstufen
Set rs = db.OpenRecordset(dbQry & " WHERE ((" & dbTable & ".Min <= " & Gewinn(Spielstufe) & ") AND (" & dbTable & ".Max >= " & Gewinn(Spielstufe) & "));")
If Err.Number <> 0 Then MsgBox Err.Description: Exit Sub

On Error GoTo 0
rs.MoveLast
lastrec = rs.AbsolutePosition
If rs.RecordCount < 1 Then MsgBox "Keine passenden Fragen gefunden!", , wwm: Exit Sub
'Auswahl nach Zufallsprinzip
Randomize Timer

z = 0: Do
FrageNr = Int(Rnd * lastrec)
rs.MoveFirst
rs.Move FrageNr
z = z + 1
Loop Until GestellteFrage(rs![Id]) = 0 Or z > lastrec Or lastrec = 0

GestellteFrage(rs![Id]) = FrageNr

  

Betrifft: AW: Beim Zufallsgenerator Wiederholung vermeiden? von: Nepumuk
Geschrieben am: 03.06.2008 19:21:36

Hallo Olli,

ein Beispiel:

Public Sub Beispiel()
    Const TEST_KEY = "Test"
    Dim intIndex As Integer
    Dim objDict As Object
    Set objDict = CreateObject("Scripting.Dictionary")
    For intIndex = 1 To 2
        If Not objDict.Exists(TEST_KEY) Then
            objDict.Add TEST_KEY, TEST_KEY
        Else
            MsgBox "Gibt's schon"
        End If
    Next
End Sub


Einfach mal mit F8 durchsteppen, damit du siehst wie es funktioniert.

Gruß
Nepumuk


  

Betrifft: AW: Beim Zufallsgenerator Wiederholung vermeiden? von: OlliB
Geschrieben am: 03.06.2008 19:49:00

Hallo Nepumuk,

prima....werd ich gleich mal testen und dann noch einmal melden..auf jeden Fall schon mal DANKE ;O)
Gruß
Olli


  

Betrifft: AW: Beim Zufallsgenerator Wiederholung vermeiden? von: OlliB
Geschrieben am: 03.06.2008 22:53:41

Hallo..
hab mich mal an dem Code nun versucht...grds. versteh ich ihn auch, aber ich komme dennoch irgendwie da nicht weiter...

Die Konstante muss sich bei jedem Button-Klick erweitern, also um die jeweilige ID-Nr. Und die anschl. Prüfung muss dann alle Constanten einzeln durchgehen. Da die Anzahl aber variable ist, komme ich da nicht weiter...

Vielleicht noch zum Hintergrund, warum ich eine Lösung benötige:
Wenn ich bspw. "nur" 4 Zeilen in der abgefragten Kategorie hab, dann liegt die Wahrscheinlichkeit, dass der Zufallsgenerator nur einen der ersten beiden Zeilen auswählt merkwürdigerweise bei 100 %. Die Zeilen 3 und 4 wählt er gar nicht aus. Egal, wie oft der Button den Zufallsgenerator neu startet. Daher der Gedanke bzgl. Ausschluss bereits aufgerufener ID (=Zeilen)

Über eine Hilfe bezogen konkret auf meinen Code würde ich mich echt freuen.


  

Betrifft: AW: Beim Zufallsgenerator Wiederholung vermeiden? von: Nepumuk
Geschrieben am: 03.06.2008 23:16:00

Hallo Olli,

du hast den Sinn des Beispiels nicht verstanden. Die Konstante ist doch nur dazu da, damit du siehst, dass es nicht möglich ist eine Schlüsseleintrag zweimal anzulegen. An Stelle der Konstanten kommt natürlich deine ID.

Bei VBA - gut sollte das umsetzen in deinen Code kein Problem sein. Du musst doch nur eine Do - Loop - Schleife um die Auswahl zu legen. So lange Schlüssel gefunden werden, die schon benutzt wurden bleibst du in der Schleife, sobald du einen unbenutzen findest trägst du ihn ein und verlässt du sie.

Gruß
Nepumuk


  

Betrifft: AW: Beim Zufallsgenerator Wiederholung vermeiden? von: OlliB
Geschrieben am: 04.06.2008 08:08:58

Hallo Nepumuk,
na ja...das mit der Selbsteinschätzung ist immer so ne Sache...ich dachte zumindest, meine Kenntnisse wären gut ;O)
Ich versuch mich noch einmal dran, vielleicht war es gestern einfach nur schon zu spät für mich. Wenn es nicht klappt, dann melde ich mich noch einmal

Gruß
Olli


 

Beiträge aus den Excel-Beispielen zum Thema "Beim Zufallsgenerator Wiederholung vermeiden?"