Seite 1 von 2
Zellinhalte neu Berechnen unzuverlässig
Verfasst: So 24. Feb 2013, 23:23
von tvfi
Ein Rechenblatt mit Zufallszahlen soll mehrfach mit neuen Zahlen ausgedruckt werden. Der Code, den ich im Kern dafür benutze, ist:
Code: Alles auswählen
for i = 1 to 10
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Calculate", "", 0, Array())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:PrintDefault", "", 0, Array())
next i
Die Neuberechnung, und damit die Setzung neuer Zufallszahlen in die Zellen, funktioniert aber nicht zuverlässig. Bei einem Versuch eben kam die erste Version ein mal, die nächsten beiden je zwei mal, dann fünfmal das gleiche.
Was mache ich falsch?
Gruß
Thomas
Re: Zellinhalte neu Berechnen unzuverlässig
Verfasst: Fr 1. Mär 2013, 17:30
von F3K Total
tvfi hat geschrieben:Was mache ich falsch?
keine Ahnung, versuch es mal so:
Code: Alles auswählen
Sub S_recalculate_and_print
dim printprops()
thiscomponent.calculate
thiscomponent.print(printprops)
End Sub
Gruß R
Re: Zellinhalte neu Berechnen unzuverlässig
Verfasst: Fr 1. Mär 2013, 18:59
von tvfi
Danke für den Tipp!
Leider bringt das keine Verbesserung: erst 4 verschiedene Exemplare, dann 6 gleiche.
Gruß
Thomas
Re: Zellinhalte neu Berechnen unzuverlässig
Verfasst: Fr 1. Mär 2013, 19:14
von F3K Total
Na versuchs nochmal mit einer Pause
Code: Alles auswählen
Sub S_recalculate_and_print
dim printprops()
thiscomponent.calculate
wait 2000
thiscomponent.print(printprops)
End Sub
Gruß R
Re: Zellinhalte neu Berechnen unzuverlässig
Verfasst: Fr 1. Mär 2013, 19:30
von tvfi
Das geht in die richtige Richtung: Jetzt bekomme ich immerhin 7 verschiedene, also 3 Versionen doppelt. Auch mit "wait 4000" genau dieses Ergebnis.
Ich sollte mich doch mal tiefer in LibreOffice Basic einarbeiten.
Gruß
Thomas
Re: Zellinhalte neu Berechnen unzuverlässig
Verfasst: Fr 1. Mär 2013, 20:36
von balu
Hallo
@R
Auch wenn Du das Wait auf 10 Stunden hochsetzt, es wird nicht helfen, die Zufallszahlen werden dadurch nicht zuverlässiger zufällig ausgedruckt. Oder hast Du das vorher getestet?
@Thomas
Was mache ich falsch?
Sehr vieles!
Da passt so einiges nicht zusammen!
Der Code, den ich im Kern dafür benutze, ist:
Das ist nicht der "Kern-Code"!
-> Der Code ist nicht fehlerhaft.
Denn, es sollen 10 Ausdrucke vorgenommen werden und nach jedem Ausdruck findet eine Neuberechnung statt. Nur was wird neuberechnet, etwa Calc?
-> Der Code hat
absolut gar nichts mit Zufallszahlen zu tun.
Denn der Code ist nur die Druckroutine, die durch eine überflüssige Neuberechnung extrem kurzzeitig unterbrochen/angehalten wird.
-> Angenommen der Code ist in einer seperaten Sub, dann kannst Du 1.000 Neuberechnungen durchführen und wirst trotzdem nicht glücklicher.
Um es kurz zu machen, häng hier eine Beispieldatei mit dem kompletten Code an. Dann schaun wir uns das genauer an, und helfen dir aus dieser Miesere raus.
Gruß
balu
Re: Zellinhalte neu Berechnen unzuverlässig
Verfasst: Fr 1. Mär 2013, 21:31
von tvfi
Das hier ist der ganze ursprüngliche Code. Entstanden aus der Makro-Aufzeichnung. Ich habe nur die for-next-Schleife ergänzt.
In den Zellen des Rechenblatts steht jeweils:
=ABRUNDEN( ZUFALLSZAHL()*50)&" + "&ABRUNDEN( ZUFALLSZAHL()*50)&" = "
Code: Alles auswählen
sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
for i = 1 to 10
rem dispatcher.executeDispatch(document, ".uno:Calculate", "", 0, Array())
rem dispatcher.executeDispatch(document, ".uno:PrintDefault", "", 0, Array())
next i
end sub
Gruß
Thomas
Re: Zellinhalte neu Berechnen unzuverlässig
Verfasst: Fr 1. Mär 2013, 22:36
von F3K Total
Nun,
war doch nicht ganz so einfach, jetzt habe ich es heraus:
Code: Alles auswählen
Global oPrintJobListener As Object
global ncounter as integer
Sub S_recalculate_and_print
dim printprops()
thiscomponent.calculate
thiscomponent.print(printprops)
ncounter = ncounter + 1
End Sub
Sub Register_PrintJobListener
oPrintJobListener = CreateUnoListener( "PrintJobListener_", "com.sun.star.view.XPrintJobListener" )
ThisComponent.addPrintJobListener(oPrintJobListener)
ncounter = 0
End Sub
Sub Remove_PrintJobListener
ThisComponent.removePrintJobListener(oPrintJobListener)
End Sub
Sub PrintJobListener_printJobEvent(oEvent)
if oEvent.State = 2 then
if ncounter < 10 then S_recalculate_and_print 'hier die Anzahl einstellen
endif
End Sub
Sub PrintJobListener_disposing
end sub
wobei Register_PrintJobListener beim Öffnen des Dokumentes einmalig ausgeführt werden muß, also z.B. unter Extras/Anpassen/Ereignisse dem Ereignis "Ansicht wurde erzeugt" zuordnen. Remove_PrintJobListener kann man dem Ereignis "Ansicht wird geschlossen" zuordnen.
Ich denke der Grund war, das der PrintJob und das Neuberechnen durcheinandergekommen sind, bei dieser Variante wird erst dann neu berechnet, wenn der XPrintJobListener meldet, das der letzte Druck abgeschickt wurde.
Aber das kann Balu sicher besser erklären.
Gruß R
Re: Zellinhalte neu Berechnen unzuverlässig
Verfasst: Sa 2. Mär 2013, 01:16
von balu
Hallo
@R
Aber das kann Balu sicher besser erklären.
Und wovon träumst Du des Nachts?

Ein Listner ist für mich noch immer ein Buch mit 7 Siegeln. Und auf die Idee ihn überhaupt anzuwenden wäre ich nicht gekommen.
Ich glaub Du hast dir zu viel Mühe gemacht, die gar nicht nötig war. Meine Anerkennung hast Du aber dennoch dafür. Respekt!
@Thomas
Ich habe nur die for-next-Schleife ergänzt.
In den Zellen des Rechenblatts steht jeweils:
=ABRUNDEN( ZUFALLSZAHL()*50)&" + "&ABRUNDEN( ZUFALLSZAHL()*50)&" = "
Ja das erklärt natürlich so einiges! Und dadurch ergibt dann auch dein Eingangsproblem einen Sinn.
Die Neuberechnung, und damit die Setzung neuer Zufallszahlen in die Zellen, funktioniert aber nicht zuverlässig. Bei einem Versuch eben kam die erste Version ein mal, die nächsten beiden je zwei mal, dann fünfmal das gleiche.
Das ist nämlich kein Problem des Makros, sondern ein Problem von Calc. Auch wenn Du in Calc die dortige Funktion =ZUFALLSZAHL() einsetzt, so wird nicht garantiert das in den einzelnen Zellen doppelte Zahlen vermieden werden. Denn woher soll denn z.B. die Zelle A1 wissen was in B2 drin steht? Da die Zellen nicht miteinander komunizieren, ist es völlig normal das einige Zahlen
mehrfach vorkommen. Da kann das Makro absolut nix dafür, und es kann seine Hände in Unschuld waschen. Und ferner kannst Du es theoretisch auch so übernehmen, oder die kürzere Version die dir R schon in seiner ersten Antwort gab.
Um jetzt aber das Problem mit den mehrfach vorkommenden Zufallszahlen in den Griff zu bekommen, solltest Du mal
hier schauen.
Wenn Du damit nicht zurecht kommst, dann musst Du mal eine Beispieldatei hier anhängen, damit wir dir das verlinkte Makro einbauen können.
Gruß
balu
Re: Zellinhalte neu Berechnen unzuverlässig
Verfasst: Sa 2. Mär 2013, 09:21
von karolus
Hallo
=ABRUNDEN( ZUFALLSZAHL()*50)
Ausserdem gibts zum erzeugen
zufälliger ganzer Zahlen zwischen 0 und 49 die Funktion:
Karolus