Seite 1 von 2

einmalige Zufallswerte

Verfasst: Di, 10.10.2006 09:31
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?

Verfasst: Di, 10.10.2006 13:59
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]

Verfasst: Di, 10.10.2006 14:35
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.

Verfasst: Di, 10.10.2006 16:24
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

Verfasst: Di, 10.10.2006 19:09
von Wutzebub
Es funktioniert. Super. Vielen, vielen Dank.

Verfasst: Mi, 11.10.2006 16:33
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

Verfasst: Do, 12.10.2006 00:25
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

Verfasst: Do, 12.10.2006 09:20
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

Verfasst: Fr, 03.11.2006 06:50
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?

Verfasst: Fr, 03.11.2006 09:32
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

Verfasst: Fr, 03.11.2006 10:19
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"

Verfasst: Fr, 03.11.2006 14:08
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

Verfasst: Fr, 03.11.2006 17:17
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

Verfasst: Fr, 03.11.2006 18:47
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.

Verfasst: Fr, 03.11.2006 19:38
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