einmalige Zufallswerte
Moderator: Moderatoren
einmalige Zufallswerte
Habe folgendes Problem. Ich habe beispielsweise in der Spalte A1 - A 180
verschiedene Namen aufgelistet. Jetzt möchte ich, wenn ich einen Button drücke, aus dieser Spalte 11 zufällige Namen auswählen und in Spalte F anzeigen lassen. Keiner dieser Namen darf dabei doppelt erscheinen. Wie kann ich das realisieren?
verschiedene Namen aufgelistet. Jetzt möchte ich, wenn ich einen Button drücke, aus dieser Spalte 11 zufällige Namen auswählen und in Spalte F anzeigen lassen. Keiner dieser Namen darf dabei doppelt erscheinen. Wie kann ich das realisieren?
Hallo
Nimm eine "LottozahlenFunktion", schreib sie um auf "11 aus 180" zb. so :
kopiere diesen Code in ein Modul von :
->Extras ->Makros ->Makros verwalten -OOobasic 'Meine Makros' 'standard'
Rufe die Funktion zb. in C1 auf mit:
=ZAHLENLOTTO()
schreib in D2 die Funktion:
=FINDEN(",";C$1;D1+1)
ziehe diese bis D11, in D12 dann :
=LÄNGE(C1)+1
in Zelle C2 die Funktion:
=INDIREKT("A"&WERT(TEIL(C$1;D1+1;D2-D1-1)))
und ziehen bis C12
Jetzt hast du 11 Zufallsnamen aus Spalte A ohne Doppelausgaben in Spalte C
Neue Zufallsnamen erhälst du mit Strg shift [F9]
Nimm eine "LottozahlenFunktion", schreib sie um auf "11 aus 180" zb. so :
Code: Alles auswählen
function Zahlenlotto() ' 11 aus 180
Dim zahlen(10) As Integer, i As Integer, j As Integer
Dim gefunden As Boolean, msg As Variant
i = 0
zahlen(0) = Int(180 * Rnd) + 1
msg = zahlen (0)
Do
i = i + 1
gefunden = False
zahlen (i) = Int(180 * Rnd) + 1
For j = 0 To i - 1
If zahlen (j) = zahlen (i) Then
i = i - 1
gefunden = True
Exit For
End If
Next j
If Not gefunden Then msg = msg & "," & zahlen (i)
Loop Until i = 10
msg = split(msg,chr(44))
Zahlenlotto = msg
End function
Rem Ich hab die Änderungen vom übernächsten Posting hier vorgenommen.
->Extras ->Makros ->Makros verwalten -OOobasic 'Meine Makros' 'standard'
Rufe die Funktion zb. in C1 auf mit:
=ZAHLENLOTTO()
schreib in D2 die Funktion:
=FINDEN(",";C$1;D1+1)
ziehe diese bis D11, in D12 dann :
=LÄNGE(C1)+1
in Zelle C2 die Funktion:
=INDIREKT("A"&WERT(TEIL(C$1;D1+1;D2-D1-1)))
und ziehen bis C12
Jetzt hast du 11 Zufallsnamen aus Spalte A ohne Doppelausgaben in Spalte C
Neue Zufallsnamen erhälst du mit Strg shift [F9]
Zuletzt geändert von Karolus am Di, 10.10.2006 16:54, insgesamt 1-mal geändert.
Hallo
Ich hab noch eine Vereinfachung:
Ändere in der Dritten Zeile im Makrocode :
'msg as String' um in 'msg as variant'
und füge als drittletzte Zeile :
msg = split(msg,chr(44))
ein.
Jetzt kannst du die Funktion als Matrixfunktion mit [Strg+Shift+Enter] abschliessen !
Dadurch bekommst du die Ausgabe der Zufallszahlen in einer Zeile zb. von C1 bis M1,
Wenn du die Ausgabe der Namen in einer Spalte willst , dann
=INDIREKT("A"&MTRANS(C1:M1)) ebenfalls als Matrixfunktion mit [Strg+Shift+Enter] bestätigen. Die anderen zusätzlichen Formeln im Tabellenblatt brauchst du jetzt nicht mehr.
Wenn du das Auslösen der Neuberechnung auf ein Schaltfläche legen willst, erstelle dir eine Schaltfläche und verknüpfe sie mit Folgendem Code :
Gruß Karo
Ich hab noch eine Vereinfachung:
Ändere in der Dritten Zeile im Makrocode :
'msg as String' um in 'msg as variant'
und füge als drittletzte Zeile :
msg = split(msg,chr(44))
ein.
Jetzt kannst du die Funktion als Matrixfunktion mit [Strg+Shift+Enter] abschliessen !
Dadurch bekommst du die Ausgabe der Zufallszahlen in einer Zeile zb. von C1 bis M1,
Wenn du die Ausgabe der Namen in einer Spalte willst , dann
=INDIREKT("A"&MTRANS(C1:M1)) ebenfalls als Matrixfunktion mit [Strg+Shift+Enter] bestätigen. Die anderen zusätzlichen Formeln im Tabellenblatt brauchst du jetzt nicht mehr.
Wenn du das Auslösen der Neuberechnung auf ein Schaltfläche legen willst, erstelle dir eine Schaltfläche und verknüpfe sie mit Folgendem Code :
Code: Alles auswählen
sub neuberechnen
rem define variables
dim document as object
dim dispatcher as object
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:CalculateHard", "", 0, Array())
end sub
Hallo Kewi
Ich hab den Code oben inzwischen nochmal geändert, du brauchst in der Tabelle nur noch zwei Formeln zb in C1 :
=ZAHLENLOTTO()
! wichtig als Matrixformel mit [strg+shift+enter]abschliessen !
und dann wo du möchtest mit 10 leeren Zellen unterhalb :
=INDIREKT("A"&MTRANS(C1:M1))
ebenfalls als Matrixformel abschliessen
Gruß Karo
Ich hab den Code oben inzwischen nochmal geändert, du brauchst in der Tabelle nur noch zwei Formeln zb in C1 :
=ZAHLENLOTTO()
! wichtig als Matrixformel mit [strg+shift+enter]abschliessen !
und dann wo du möchtest mit 10 leeren Zellen unterhalb :
=INDIREKT("A"&MTRANS(C1:M1))
ebenfalls als Matrixformel abschliessen
Gruß Karo
Hi Wutzebub,
ich hab hier das Zahlenlotto für dich verändert in dem ich 15 zufallszahlen aus dem Zahlenbereich von 4 bis 184 ausgebe:
müsste so funktionieren, hoffe es hilft dir weiter..
mfg kewi
ich hab hier das Zahlenlotto für dich verändert in dem ich 15 zufallszahlen aus dem Zahlenbereich von 4 bis 184 ausgebe:
Code: Alles auswählen
function Zahlenlotto() ' 15 aus 184, beginn ab 4
Dim zahlen(15) As Integer, i As Integer, j As Integer
Dim gefunden As Boolean, msg As Variant
i = 1
zahlen(1) = Int(180 * Rnd) + 4
msg = zahlen (1)
Do
i = i + 1
gefunden = False
zahlen (i) = Int(180 * Rnd) + 4
For j = 0 To i - 1
If zahlen (j) = zahlen (i) Then
i = i - 1
gefunden = True
Exit For
End If
Next j
If Not gefunden Then msg = msg & "," & zahlen (i)
Loop Until i = 15
msg = split(msg,chr(44))
Zahlenlotto = msg
End function
mfg kewi
Time IS The Death And The Healing
Hallo
@ Kewi
Dein Code gilt für "16 aus 183 , Beginn bei 3"
und rufe die Funktion mit deinen Gewünschten Werten auf :
=ZAHLENLOTTO(15;4;184)
Gruß Karo
@ Kewi
Dein Code gilt für "16 aus 183 , Beginn bei 3"
1. Wie bekomme ich hin, dass der Zufallsgenerator erst bei 4 anfängt zu zählen? D.h. die 180 Werte sollen bei 4 anfangen, und bei 184 enden.
Nimm folgenden Code:2. Wenn ich einmal 15 Zufallszahlen benötige, was muss ich dann tun?
Code: Alles auswählen
REM ***** BASIC *****
function Zahlenlotto(x,von,bis) '"x" aus dem Zahlenbereich "von" "bis"
Dim zahlen(x-1) As Integer, i As Integer, j As Integer
Dim gefunden As Boolean, msg As Variant
i = 0
zahlen(0) = Int((bis - von) * Rnd) + 1
msg = zahlen (0)
Do
i = i + 1
gefunden = False
zahlen (i) = Int((bis - von) * Rnd) + 1
For j = 0 To i - 1
If zahlen (j) = zahlen (i) Then
i = i - 1
gefunden = True
Exit For
End If
Next j
If Not gefunden Then msg = msg & "," & zahlen (i)
Loop Until i = x-1
'msgbox(msg)
msg = split(msg,chr(44))
Zahlenlotto = msg
End function
=ZAHLENLOTTO(15;4;184)
Gruß Karo
Der Informatiker steht am Bahnsteig und zählt seine Koffer :
0 , 1 , 2....."grübel"? "Mist, wo ist der dritte Koffer"
Hi karo,
mal was anderes:
kann ich in deine funktion auch einen wert aus einer zelle einlesen der dann die anzahl der zufallszahlen bestimmt ?
also sowas in der art:
der wert steht in E5
mfg kewi
mal was anderes:
kann ich in deine funktion auch einen wert aus einer zelle einlesen der dann die anzahl der zufallszahlen bestimmt ?
also sowas in der art:
der wert steht in E5
Code: Alles auswählen
function Zahlenlotto() ' 15 aus 184, beginn ab 4
Dim zahlen("E5") As Integer, i As Integer, j As Integer
Dim gefunden As Boolean, msg As Variant
i = 1
zahlen(1) = Int("E5" * Rnd) + 4
msg = zahlen (1)
Do
i = i + 1
gefunden = Fals
....
Time IS The Death And The Healing
Hallo Kewi
Aufruf mit :
=ZAHLENLOTTO(15;4;184)
Anstelle der Zahlen kannst du wie bei jeder anderen Funktion Zelldressen mit entsprechenden Zahlenwerten eintragen.
Gruß Karo
Schau dir doch mal meinen Code von heute 10Uhr19 an, ist schon eingebaut.mal was anderes:
kann ich in deine funktion auch einen wert aus einer zelle einlesen der dann die anzahl der zufallszahlen bestimmt ?
Aufruf mit :
=ZAHLENLOTTO(15;4;184)
Anstelle der Zahlen kannst du wie bei jeder anderen Funktion Zelldressen mit entsprechenden Zahlenwerten eintragen.
Gruß Karo
Das mit den Werten funktioniert. Jedoch geht jetzt die Neuberechnung nicht mehr (Basic Laufzeitfehler!!!). Außerdem stehen jetzt alle Zufallswerte nebeneinander in verschiedenen Zellen und nicht mehr in einer Zelle. Das heißt, mein Problem von ganz oben ist wieder da.
Sorry, aber ich habe 0 Ahnung davon.
Sorry, aber ich habe 0 Ahnung davon.
Hallo Wutzebub
Bei dir ging es doch ursprünglich um die Zufallsnamen?-
Die erhälst nach wie vor mit der Formel :
=INDIREKT("A"&MTRANS(C1:M1))
statt 'C1:M1' gibst du natürlich den Zellbereich ein der von ZAHLENLOTTO(...)
gefüllt wird.
Falls du jetzt einfach Zufallszahlen in einer Zelle haben möchtest ?-
kommentier einfach mal die drittletzte Zeile im Code mit einem ' Hochkomma aus:
'msg = split(msg,chr(44))-
falls du eine Ausgabe in einem Dialogfenster Möchtest ?- entferne das ' Hochkomma vor der 4-letzten Zeile :
'msgbox(msg)
Gruß Karo
Bei dir ging es doch ursprünglich um die Zufallsnamen?-
Die erhälst nach wie vor mit der Formel :
=INDIREKT("A"&MTRANS(C1:M1))
statt 'C1:M1' gibst du natürlich den Zellbereich ein der von ZAHLENLOTTO(...)
gefüllt wird.
Falls du jetzt einfach Zufallszahlen in einer Zelle haben möchtest ?-
kommentier einfach mal die drittletzte Zeile im Code mit einem ' Hochkomma aus:
'msg = split(msg,chr(44))-
falls du eine Ausgabe in einem Dialogfenster Möchtest ?- entferne das ' Hochkomma vor der 4-letzten Zeile :
'msgbox(msg)
Gruß Karo