Seite 1 von 2

zufallsgenarator

Verfasst: Di, 09.01.2007 20:43
von wegomyway
ich muss folgendes problem lösen und benötige fachkundige hilfe ...
ich habe in der spalte a senkrecht die zahlen 1- 200 zu stehen , hinter jeder dieser zahlen verbirgt sich ein blatt welches dann abgearbeitet wird .
in die spalte b muss ein haken gesetzt werden und in der spalte c das heutige datum .
das ganze sollte per schaltfläche ( oder wie immer man das nennt ) ausgeführt werden . ich öffne also immer dann die datei wenn ich arbeiten bin und klicke einmal täglich auf die schaltfläche . es muss aus der zahlenliste eine zahl per zufall gezogen werden , gleichzeitig muss der haken und das datum gesetzt werden . solange wie nicht alle zahlen komplett abgearbeitet worden sind darf keine zahl ein zweites mal gezogen werden . erst wenn auch die letzte zahl gezogen wurde dann kann mit dem 201ten klick alles genullt werden und das speil beginnt von vorne .... alle , wirklich alle sind willkommen mir zu helfen , weil ich das nicht hin kriege ... :oops:

Verfasst: Mi, 10.01.2007 01:51
von komma4
Dazu benötigst Du:

a) das Analyse-Add-In von OOo
b) folgendes Makro
c) die Zuweisung des Makros zu einer Schaltfläche

a) findest Du in Deiner Installationsroutine (Betriebssystem? OOo Version?)
c) findest Du hier im Forum, oder im http://www.ooowiki.de

b):

Code: Alles auswählen

'http://de.openoffice.info/posting.php?mode=reply&t=10535
' 
' nutzt Funktion "Zufallsbereich" aus Analyse-Add-In
' 20070110 OOo 2.1/Linux
Sub ZufallsZelle
Dim bWEITERSUCHEN as Boolean

' alle Tabellen dieser CALC-Datei
oAlleTAB = ThisComponent.getSheets()

' Tabelle bestimmen
oTabelle = oAlleTAB.getByName( "Tabelle1" )

' Endlosschleife
' zur Sicherheit nach 1000 Durchläufen abbrechen
bWEITERSUCHEN = TRUE
i = 1
idxZeile = 0

Do 	
	' Zufallswert ermitteln
	iZUFALL = Zufall_1_bis_200()
	
	if iZUFALL = 0 then
		msgbox "Fehler Zufallsbereich 1 bis 200"
		exit sub
	else	
		oInhalt = _
			oTabelle.getCellByPosition( 1, iZUFALL - 1).getString() 
	end if
	
	' Inhalt kontrollieren
	if oInhalt = "" then
		' leer: eintragen
		oTabelle.getCellByPosition( 1, iZUFALL - 1 ).setString( date() ) 
		' Schalter
		bWEITERSUCHEN = FALSE 
	else 
		i = i + 1 
	end if	

	if i > 1000 then
		msgbox "Keinen Zufallstreffer erreicht"
	exit sub 
	end if
	
Loop While ( bWEITERSUCHEN = TRUE ) 

msgbox "Anzahl Versuche: " & i & _
	CHR(13) & "Heute wurde Blatt " & iZUFALL  & " gewählt"

End Sub


' ---------------------------------------------------
Function Zufall_1_bis_200()
Dim oPSM
oPSM = _
	GetProcessServiceManager().createInstance( _
	"com.sun.star.sheet.FunctionAccess" )

on error goto errZufall

' Funktion aus dem Analyse-Addin
Zufall_1_bis_200 = oPSM.callFunction("ZUFALLSBEREICH", Array(1,200) )
exit Function

' bei einem Fehler der Funktion 0 (null) zurückgeben
errZufall:
Zufall_1_bis_200 = 0

End Function
Anmerkungen:
* Fehlerschalter eingebaut, da ich nicht weiss, wie stabil die Funktion ZUFALLSBEREICH ist.
* Da ich hier mit Index Basis Null arbeite wird die Zufallszahl beim Zugriff auf die Zeile um Eins reduziert. Annahme: Zahlen ab der ersten Zeile, keine Überschrift.
* Das Setzen des Hakens in Spalte B habe ich durch Setzen des Datums in gleicher Spalte variiert: ein eingetragenes Datum IST der Haken.
* Den Teil zur Überprüfung, ob die Liste abgearbeitet ist, werde ich innerhalb der nächsten 199 Tage nachliefern - wenn kein Kollege schneller ist. Für heute ist erstmal Feierabend.

War eine nette Denksportaufgabe :-)

Kommst Du damit zurecht?

Verfasst: Mi, 10.01.2007 11:44
von Karolus
Hallo

@Winfried

Da hast du ja dem "Fussvolk" kaum noch was übrig gelassen, funktioniert wunderbar- auch die allerletzte Zahl wird in deutlich unter 1000 Durchläufen gefunden.

@all
Fürs Zurücksetzen wenn alle abgearbeitet sind:
Den folgenden Code in Winfrieds Makro zwischen ' oTabelle =......' und 'Endlosschleife ...' einfügen:

Code: Alles auswählen

....
'_____Zurücksetzen ? wenn B1:B200 gefüllt ist
for d =1 to 200
bereich = oTabelle.getcellrangebyname( "B"&d).getstring
if bereich <> "" then
wieviel =  wieviel +1
end if
next
obereich = oTabelle.getcellrangebyName("B1:B200")
	if wieviel = 200 then
		msg =msgbox("habe fertig :-))"& chr(13) & "alle Blätter sind abgearbeitet"_
		&chr(13) & "soll das Projekt jetzt zurückgesetzt werden ?",4)				
				if msg = 6 then
obereich.clearContents(com.sun.star.sheet.CellFlags.VALUE +_
com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME)
				exit sub
				end if
	exit sub
	end if
...
edit
nochmal überarbeitet am 11.1 23:00 Uhr

Gruß Karo

der generator

Verfasst: Mi, 10.01.2007 16:09
von wegomyway
also ich hab die 2.01er version drauf .... und bs ist ein über autoup gepflegtes xp ...
aber mal am rande .... WIE soll ich denn das hinbekommen :?: das geht doch nicht .... aber irre das es hier leute wie euch gibt die sowas dann auch noch "nette denksportaufgabe" nennen ... also da habt ihr meinen allergrößten respekt ....
das ganze werd ich mir mal zu papier bringen und mich daran setzen .... da muss ich ja schon beim tippen aufpassen das ich da bloß nicht was vergesse oder so .... DAS muss ich jetzt erstmal verdauen .... ihr hört auf jeden fall von mir .... wahrscheinlich brauch ich länger das umzusetzen wir ihr die lösung gefunden habt .... also irgendwie krieg ich mich nicht ein .... der knaller .... :D

Verfasst: Mi, 10.01.2007 17:18
von Karolus
Hallo
das ganze werd ich mir mal zu papier bringen und mich daran setzen .... da muss ich ja schon beim tippen aufpassen das ich da bloß nicht was vergesse oder so ....
Also ich wäre jetzt einfach viel zu faul das alles einzutippen, ist auch fehleranfällig wenn man noch nicht weiss worauf man achten muss.
Einfach copy und paste ins Basic-fenster, dort in Ruhe durchlesen, und erstmal in einem leeren Testdokument starten, evtl. bekommst du noch ein paar Fehlermeldungen in den Zeilen die mit _Unterstrich enden, füge diese dann mit der folgenden Zeile zusammen und entferne den _Unterstrich.

Gruß Karo

Verfasst: Mi, 10.01.2007 17:20
von Eddy
Hallo wegomyway,
.... da muss ich ja schon beim tippen aufpassen das ich da bloß nicht was vergesse oder so ....
von mir nur ein Tipp... Den Code kannst Du markieren, in die Zwischenablage einstellen und dann kopieren.

Mit unkopierten Grüßen

Eddy

zufallsgenerator

Verfasst: Mi, 10.01.2007 18:42
von wegomyway
ja , das mit dem copy hab ich mir auch schon überlegt .... und dann kam mir die erleuchtung .... auf arbeit hab ich nix mit internet .... aber ich hab den internet-sammler drauf .... da hab ich das ganze hier , also die komplette seite einfach gespeichert ... und schon hab ich die vorlage bzw. vorgabe auf dem rechner und kann das entsprechend angehen ... das wird ein spass .... thx :)

zufallsgenerator

Verfasst: Do, 11.01.2007 16:53
von wegomyway
also ich hab das ganze in der letzten nacht masl angegangen .... so wie geschrieben wurde per copy usw. , das hat auch alles soweit geklappt .... eine schaltfläche einfügen ist auch ok , da zuweisen der schaltfläche zum acro "erlese" ich mir und dann geht das auch ... aber , ein problem bleibt bzw. ist bei mir vorhanden .... wenn ich das macro ausführe bleibt es genau folgend an der klammer nach der "13" stehen und meldet einen "vba-syntaxfehler unerwartetes symbol: &" und das war es .... es ist diese stelle

msgbox "Anzahl Versuche: " & i & _
CHR(13) & "Heute wurde Blatt " & iZUFALL & " gewählt"

hab das ganze in einem leeren blatt genauso wie die ausgefüllte spalte mit den zahlen probiert , auch als gespeicherte datei tritt dieser fehler auf :(

Verfasst: Do, 11.01.2007 17:10
von komma4
Die Unterstriche am Ende von Zeilen sind Fortsetzungszeichen, die bedeuten, dass die Anweisung in der nächsten Zeile weiter geht.

Hinter den Unterstrichen darf kein Zeichen, auch keine Leerstelle, mehr stehen. Prüfe das bitte mal.

Alternativ -wie schon Karolus schrieb - eine Zeile daraus machen:

Code: Alles auswählen

msgbox "Anzahl Versuche: " & i & CHR(13) & "Heute wurde Blatt " & iZUFALL & " gewählt" 

generator

Verfasst: Do, 11.01.2007 18:22
von wegomyway
da hab ich wieder nicht richtig gelesen .... karolus hatte das was du mir als ratschlag gegeben hast auch schon erwähnt :oops:
es kam nach der beseitigung dieses problemes weiter unten gleich die nächste fehlermeldung die sich aber als das gleiche , ein unterstrich am ende einer zeile herausstellte und beseitigt wurde ... nun läuft das ganze durch , also nur der große code ohne den kleineren teil eingefügt zu haben , aber als meldung erscheint wenn ich das ausführe "keine zufallstreffer erreicht"

Verfasst: Do, 11.01.2007 18:42
von Karolus
Hallo
aber als meldung erscheint wenn ich das ausführe "keine zufallstreffer erreicht"
Dann lösch erstmal den Bereich B1:B200, oder Starte das Makro in einem neuen leeren Tabellendokument.

Gruß Karo

zufallsgenerator

Verfasst: Do, 11.01.2007 20:37
von wegomyway
also ich beschreib mal mein vorgehen . zuerst calc geöffnet , die neue datei als test gespeichert . den code von hier kopiert , dann extras , macros , verwalten , openoffice.org basic , dort ist dann meine gespeicherte datei vorhanden , da klich ich rauf , und dann auf neu und ich kann das ganze einfügen ( nehme von der vorlage die drei zeilen raus und füge den code hier ein .... sieht dann so aus

REM ***** BASIC *****

Sub ZufallsZelle
Dim bWEITERSUCHEN as Boolean

' alle Tabellen dieser CALC-Datei
oAlleTAB = ThisComponent.getSheets()

' Tabelle bestimmen
oTabelle = oAlleTAB.getByName( "Tabelle1" )

' Endlosschleife
' zur Sicherheit nach 1000 Durchläufen abbrechen
bWEITERSUCHEN = TRUE
i = 1
idxZeile = 0

Do
' Zufallswert ermitteln
iZUFALL = Zufall_1_bis_200()

if iZUFALL = 0 then
msgbox "Fehler Zufallsbereich 1 bis 200"
exit sub
else
oInhalt = _
oTabelle.getCellByPosition( 1, iZUFALL - 1).getString()
end if

' Inhalt kontrollieren
if oInhalt = "" then
' leer: eintragen
oTabelle.getCellByPosition( 1, iZUFALL - 1 ).setString( date() )
' Schalter
bWEITERSUCHEN = FALSE
else
i = i + 1
end if

if i > 1000 then
msgbox "Keinen Zufallstreffer erreicht"
exit sub
end if

Loop While ( bWEITERSUCHEN = TRUE )

msgbox "Anzahl Versuche: " & i & CHR(13) & "Heute wurde Blatt " & iZUFALL & " gewählt"

End Sub


' ---------------------------------------------------
Function Zufall_1_bis_200()
Dim oPSM
oPSM = _
GetProcessServiceManager().createInstance( "com.sun.star.sheet.FunctionAccess" )

on error goto errZufall

' Funktion aus dem Analyse-Addin
Zufall_1_bis_200 = oPSM.callFunction("ZUFALLSBEREICH", Array(1,200) )
exit Function

' bei einem Fehler der Funktion 0 (null) zurückgeben
errZufall:
Zufall_1_bis_200 = 0

End Function

das ganze geispeichert , datei pro forma geschlossen wieder geöffnet und über extras , macros , ausführen , dann auf die datei test dort ins modul und die unterlegte dann ausführen
da kommt nun "fehler zufallsbereich 1-200"
ich hab auch schon die zahlen in spalte a oder auch c gepackt , der gleiche fahler :oops:

irgendwie kriegt ich graue haare .... :lol:

Verfasst: Do, 11.01.2007 20:48
von komma4
Du hast das Analyse-Add-In installiert?

Schreibe in eine Zelle

Code: Alles auswählen

=ZUFALLSBEREICH(1;2000)
und drücke die EIngabetaste. Wird die Funktion ausgeführt?

generator

Verfasst: Do, 11.01.2007 21:29
von wegomyway
das open-paket ist vollständig installiert worden , ohne ausnahme ...
habe den code mal in a1 kopiert und entertaste .... als ergebnis erscheint 1396 ... hilft das weiter :?:

Verfasst: Do, 11.01.2007 21:55
von Karolus
Hallo
Wenn die Formel so funktioniert, kann es daran nicht liegen, daher nochmal die Frage : Ist der Bereich : B1:B200 in Tabelle1 deines Testdokuments leer ?
Hast du Spalte B vielleicht ausgeblendet ?

Gruß Karo