Zufallswerte aus definierter Liste, keine doppelte

Moin,

wie kann ich Excel beibringen zufällige Werte/Wörter aus einer Liste auszuwählen, die man vorher definiert.

Eine Einschränkung dabei es sollen in mehreren Runden zufällige Werte aus der Liste gezpgen werden, aber keine doppelten. Sprich wenn ein Wert in der Runde schon gezogen worden ist, sollte er in dieser Runde nicht mehr ausgewählt werden.

Wer hat einen VBA-Ansatz, ich steh noch ein wenig auf dem Schlauch.

Danke und Gruß

slam

wie kann ich Excel beibringen zufällige Werte/Wörter aus einer
Liste auszuwählen, die man vorher definiert.

Eine Einschränkung dabei es sollen in mehreren Runden
zufällige Werte aus der Liste gezpgen werden, aber keine
doppelten. Sprich wenn ein Wert in der Runde schon gezogen
worden ist, sollte er in dieser Runde nicht mehr ausgewählt
werden.

Hallo Slam,

was genau meinst du mit „gezogen“?
Willst du wie beim Lotto als Ergebnis in der tabelle 6 Werte stehen haben die aus 49 anderen zufällig gezogen wurden.

Gruß
Reinhard

wie kann ich Excel beibringen zufällige Werte/Wörter aus einer
Liste auszuwählen, die man vorher definiert.

Wer hat einen VBA-Ansatz, ich steh noch ein wenig auf dem
Schlauch.

Hallo Slam,

für Lotto könnte man das z.B. so machen:

Sub Lotto()
Dim Zahl As Integer, Zei As Long
While Zei 0
 Zei = Zei + 1
 Cells(Zei, 1) = Zahl
Wend
End Sub

Gruß
Reinhard

Hallo rinhard,

Lotto ist kein schlechtes Beispiel, aber 2 eben wieder nur Zahlen. Es sollte auch mit einer definierten Liste mit Worten z.B. gehen.

Um beim Lotto zu bleiben, beim Lotto werden 6 Zahlen gezogen die in einen Topf kommen. Ich hättte gerne z.B. auch 6 „Werte“ gezogen, aber verteilt in 2 oder 3 Töpfe.

Gruß

slam

Hallo Slam,

Lotto ist kein schlechtes Beispiel, aber 2 eben wieder nur
Zahlen. Es sollte auch mit einer definierten Liste mit Worten
z.B. gehen.

da kann man fast den gleichen Code nehmen. a wird ja zufällig eine zahl zwischen 1 und 49 „gezogen“. Wenn man diese Zahl als Zeilennummer ansieht einer Spalte ansieht in der Texte untereinander stehen hat mans doch schon gelöst.

Um beim Lotto zu bleiben, beim Lotto werden 6 Zahlen gezogen
die in einen Topf kommen. Ich hättte gerne z.B. auch 6 „Werte“
gezogen, aber verteilt in 2 oder 3 Töpfe.

„aber verteilt in 2 oder 3 Töpfe“ verstehe ich grad nicht ausreichend genug.

Beschreib mal genauer wo was steht in der Tabelle und wo was stehen soll nach x Ziehungen.

Vielleicht sogar eine Beispielmappe mit rapidshare hier zeigen, FAQ:2606

Gruß
Reinhard

Hallo Reinhard,

hier der Link mit dem Beispiel

http://rapidshare.com/files/378404571/Test.xls.html

Gruss
slam

http://rapidshare.com/files/378404571/Test.xls.html

Hallo Slam,

sieht lösbar aus.

Noch eines, du sagst die Anzahl der Werte pro Topf und die Anzahl der Töpfe kann variieren.

Wo/wie wird das festgelegt?

Direkt im Code? Oder durch Eingabe der Werte in Zellen?

Gruß
Reinhard

Moin Reinhard,

am schönsten wäre die Eingabe in Zellen, das schafft mehr Flexibilität.

Gruß

slam

am schönsten wäre die Eingabe in Zellen, das schafft mehr
Flexibilität.

Hallo Slam,

bastle dir mal so eine Tabelle:

Tabellenblatt: C:\DOKUME~1\ich2\LOKALE~1\Temp\[Test.xls]!Sheet1
 │ A │ B │ C │
──┼──────────┼──────┼─────────────────┤
1 │ Werte │ Topf │ Anzahl pro Topf │
──┼──────────┼──────┼─────────────────┤
2 │ blau │ 1 │ 3 │
──┼──────────┼──────┼─────────────────┤
3 │ braun │ 2 │ 2 │
──┼──────────┼──────┼─────────────────┤
4 │ gelb │ 3 │ 5 │
──┼──────────┼──────┼─────────────────┤
5 │ gold │ │ │
──┼──────────┼──────┼─────────────────┤
6 │ grau │ │ │
──┼──────────┼──────┼─────────────────┤
7 │ grün │ │ │
──┼──────────┼──────┼─────────────────┤
8 │ hellblau │ │ │
──┴──────────┴──────┴─────────────────┘
A1:C8
haben das Zahlenformat: Standard

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Dann dieses Makro:

Sub Zufall()
Dim Zahl As Integer, Zei As Long, Spa As Long, Z As Long
Dim colC As New Collection, C As Long
On Error Resume Next ' wegen colC
Zei = Cells(Rows.Count, 1).End(xlUp).Row - 1
While colC.Count 

Gruß
Reinhard

Dann dieses Makro:

Sub Zufall()

Hallo Reinhard

Bei Dir lernt man nie aus! Z. B. „New Collection“ sehe ich zum ersten Mal in einem Makro.

Ich kriege, wenn ich Dein Makro laufen lasse einen Laufzeitfehler 9: „Index ausserhalb des gültigen Bereiches.“ Und zwar bei der 4. letzten Zeile:
Cells(Zei, Spa + 2).Value = colC©

Ich habe keine Ahnung, wo da der Fehler liegen könnte. Kannst Du mir auf die Sprünge helfen?

Ich arbeite mit Excel 2003. Ich hoffe, Du kannst mir auch in dieser Version noch helfen und bist nicht schon ganz auf die neuesten Versionen eingeschworen :wink:))

Vielen Dank und viele Grüsse
Niclaus

Fehler gefunden
Hallo Reinhard

Du schreibst im Makro „On Error GoTo 0“. Mit Zeilennummern (hier: 0) habe ich immer ein Problem. Ich habe die 0 durch eine Zeilenmarke ersetzt: „… GoTo finis“ und vor dem EndSub „finis:“ eingefügt. So klappt es.
Es klappt auch, wenn ich statt „On Error GoTo 0“ noch einmal „On Error Resume Next“ schreibe.

Weisst Du, warum bei der Fehlerbehandlung „On Error GoTo 0“ nicht klappt? Ich habe das auch schon bei andern Makros festgestellt. Excel 2003.

Vielen Dank für Deine Bemühungen. Viele Grüsse
Niclaus

Hallo Niclaus,

Bei Dir lernt man nie aus! Z. B. „New Collection“ sehe ich zum
ersten Mal in einem Makro.

Collection ist nicht schlecht, damit kann man locker 1000 Werte einlesen und hat keine Doppelte weil dann ein Fehler käme, deshalb On Error Resume Next.

Würde man das in ein eigenes Array einlesen müßte man jeweils per Code nachprüfen ob es den Wert schon gibt.

Achja, Collection mag nur Strings als Werte.

Ich kriege, wenn ich Dein Makro laufen lasse einen
Laufzeitfehler 9: „Index ausserhalb des gültigen Bereiches.“
Und zwar bei der 4. letzten Zeile:
Cells(Zei, Spa + 2).Value = colC©

Sorry, ich hatte es getestet und logischerweise kam kein Fehler sonst hätte ich es nich hier gepostet.

Gehe mit F8 den Code durch, oder auch mit F5, prüfe im Fehlerfall den Wert von Zei und Spa.
Einfach die Maus drüber stellen.

Ich arbeite mit Excel 2003. Ich hoffe, Du kannst mir auch in
dieser Version noch helfen und bist nicht schon ganz auf die
neuesten Versionen eingeschworen :wink:))

Überhaupt nicht, ich benutze Excel2000, Excel2007 nur wenn ich unbedingt muß, weil ich da immer viel rumsuchen muß mag ich es nicht besonders :smile:

Und ich weiß daß Boris, einer von denen von www.excelformeln.de immer noch Excel97 benutzt und der andere der drei, WF, noch nie im Leben Vba-Code gestartet hat.
Ich mag solche Konsequenz. Und wenn ich leute direkt frage was sie jetzt mit Excel 2007, gar 2010 tun können was ich mit Excel 2000 nicht könnte werden sie sehr mundfaul.

Damit meine ich jetzt nicht so unnötigen Schickschnack wie farbige Tabellenblattreiter.

Gruß
Reinhard

Gruß
Reinhard

Du schreibst im Makro „On Error GoTo 0“. Mit Zeilennummern
(hier: 0) habe ich immer ein Problem. Ich habe die 0 durch
eine Zeilenmarke ersetzt: „… GoTo finis“ und vor dem EndSub
„finis:“ eingefügt. So klappt es.
Es klappt auch, wenn ich statt „On Error GoTo 0“ noch einmal
„On Error Resume Next“ schreibe.

Hallo Niclaus,

für mich bedeutet On Error Goto 0 daß danach der Debugger wieder wie gewohnt auf Fehler reagiert.

Mit On Error Resume next heble ich ihn aus, d.h. er ignoriert Fehler und geht zur nächsten Codezeile.
Jetzt ist es ja so wie ich im Beispiel vorgehe vorprogrammiert daß Collection.Add einen Fehler produziert wenn ein schon vorhandener Wert, also ein Doppelter auftaucht.
Deshalb während des Einlesens der Collection On Error Resume next.

Danach dann wieder On Error Goto 0, denn ich will ja mitkriegen ob ein Fehler stattfindet.
Einfach in jeden Code On Error Resume Next einbauen ist sehr trügerisch, das überdeckt Codelogikfehler.

Und wenn nun ein Fehler auftritt und der Debugger sich meldet so ist daß für dich, für Thomas *gg*, für mich okay, dann kann man den Code verbessern.
Aber wenn Fremde den Code, die Mappe, benutzen die noch nie den VB-Editor sahen geht das nicht.

Dann muß man eine Fehlerbehandlungsroutine einbauen.
Google mal nach „Errorhandler“, so nennen viele diese Routine.

Diese Routine bringt meist nur eine MsgBox mit der mehr oder minder genauen Angabe warum etwas falsch läuft und was zu tun ist.
Man kann sogar rauskriegen in welcher Codezeile der Fehler geschah,
schau mal nach Err.Number, Err.Raise, Err.Description usw.

Aber ich mache diesen, an sich sehr nötigen Aufwand, nur wenn es der Gesamtcode rechtfertigt, nicht hier für Kleincodes.

Gruß
Reinhard

Danach dann wieder On Error Goto 0, denn ich will ja
mitkriegen ob ein Fehler stattfindet.
Einfach in jeden Code On Error Resume Next einbauen ist sehr
trügerisch, das überdeckt Codelogikfehler.

Vieln Dank für diese Info - endlich verstehe ich Goto 0 und Rexume Next. - Ich würde mir das alles gern hinter die Ohren schreiben - nur bräuchte ich dazu Elefantenohren!!

In der Zwischenzeit ist mir auch klar, wo der Fehler entstand, danach habe ich eben auch lange gesucht und war dabei auf einem Holzweg.

Ganz herzlichen Dank und viele Grüsse
Niclaus