einmalige Zufallswerte

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

Wutzebub
*
Beiträge: 11
Registriert: Di, 10.10.2006 09:19

einmalige Zufallswerte

Beitrag von Wutzebub »

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?
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo

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.
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]
Zuletzt geändert von Karolus am Di, 10.10.2006 16:54, insgesamt 1-mal geändert.
Wutzebub
*
Beiträge: 11
Registriert: Di, 10.10.2006 09:19

Beitrag von Wutzebub »

Danke erstmal. Habs kurz versucht. Es funktioniert. Kann man das aktualisieren auch mit einem Button belegen? Sorry, aber ich habe nicht wirklich Ahnung von dem Thema.
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

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 :

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
Gruß Karo
Wutzebub
*
Beiträge: 11
Registriert: Di, 10.10.2006 09:19

Beitrag von Wutzebub »

Es funktioniert. Super. Vielen, vielen Dank.
kewi
Beiträge: 9
Registriert: Mi, 11.10.2006 16:29
Kontaktdaten:

Beitrag von kewi »

genau das problem wie am anfang beschrieben hab ich auch, allerdings bekomme ich bei der Zeile:

=FINDEN(",";C$1;D1+1)

und

=INDIREKT("A"&WERT(TEIL(C$1;D1+1;D2-D1-1)))

die meldung: #WERT!

sonst hab ich alles wie oben erklärt gemacht...
falls euch was einfällt, lasst es mich wissen

mfg kewi der n00b
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

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
kewi
Beiträge: 9
Registriert: Mi, 11.10.2006 16:29
Kontaktdaten:

Beitrag von kewi »

hi Karolus,

vielen dank, klappt echt sehr gut !
danke, danke, danke...

gibt es eigentlich eine möglichkeit das die ausgewählten namen in der Liste automatisch markiert werden ?

mfg Kewi
Wutzebub
*
Beiträge: 11
Registriert: Di, 10.10.2006 09:19

Beitrag von Wutzebub »

Hab leider eine neue Problemserie.

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.

2. Wenn ich einmal 15 Zufallszahlen benötige, was muss ich dann tun?
kewi
Beiträge: 9
Registriert: Mi, 11.10.2006 16:29
Kontaktdaten:

Beitrag von kewi »

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:

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
müsste so funktionieren, hoffe es hilft dir weiter..

mfg kewi
Time IS The Death And The Healing
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo
@ 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.
2. Wenn ich einmal 15 Zufallszahlen benötige, was muss ich dann tun?
Nimm folgenden Code:

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 
und rufe die Funktion mit deinen Gewünschten Werten auf :

=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"
kewi
Beiträge: 9
Registriert: Mi, 11.10.2006 16:29
Kontaktdaten:

Beitrag von kewi »

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

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
      ....
mfg kewi
Time IS The Death And The Healing
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo Kewi
mal was anderes:
kann ich in deine funktion auch einen wert aus einer zelle einlesen der dann die anzahl der zufallszahlen bestimmt ?
Schau dir doch mal meinen Code von heute 10Uhr19 an, ist schon eingebaut.
Aufruf mit :

=ZAHLENLOTTO(15;4;184)
Anstelle der Zahlen kannst du wie bei jeder anderen Funktion Zelldressen mit entsprechenden Zahlenwerten eintragen.

Gruß Karo
Wutzebub
*
Beiträge: 11
Registriert: Di, 10.10.2006 09:19

Beitrag von Wutzebub »

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.
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

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
Antworten