🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Zellinhalte neu Berechnen unzuverlässig

Alles zur Programmierung im LibreOffice.
tvfi
Beiträge: 7
Registriert: So 24. Feb 2013, 23:17

Zellinhalte neu Berechnen unzuverlässig

Beitrag von tvfi » So 24. Feb 2013, 23:23

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

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von F3K Total » Fr 1. Mär 2013, 17:30

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
Windows 11: AOO, LO Linux Mint: AOO, LO

tvfi
Beiträge: 7
Registriert: So 24. Feb 2013, 23:17

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von tvfi » Fr 1. Mär 2013, 18:59

Danke für den Tipp!
Leider bringt das keine Verbesserung: erst 4 verschiedene Exemplare, dann 6 gleiche.

Gruß
Thomas

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von F3K Total » Fr 1. Mär 2013, 19:14

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
Windows 11: AOO, LO Linux Mint: AOO, LO

tvfi
Beiträge: 7
Registriert: So 24. Feb 2013, 23:17

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von tvfi » Fr 1. Mär 2013, 19:30

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

balu
* LO-Experte *
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von balu » Fr 1. Mär 2013, 20:36

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

tvfi
Beiträge: 7
Registriert: So 24. Feb 2013, 23:17

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von tvfi » Fr 1. Mär 2013, 21:31

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

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von F3K Total » Fr 1. Mär 2013, 22:36

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
Windows 11: AOO, LO Linux Mint: AOO, LO

balu
* LO-Experte *
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von balu » Sa 2. Mär 2013, 01:16

Hallo

@R
Aber das kann Balu sicher besser erklären.
Und wovon träumst Du des Nachts? :lol:
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

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von karolus » Sa 2. Mär 2013, 09:21

Hallo
=ABRUNDEN( ZUFALLSZAHL()*50)
Ausserdem gibts zum erzeugen zufälliger ganzer Zahlen zwischen 0 und 49 die Funktion:

Code: Alles auswählen

=ZUFALLSBEREICH(0;49)
Karolus
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten