🙏 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

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von tvfi » Sa 2. Mär 2013, 10:06

Entschuldigung! Ich dachte, es wäre einfacher, die Umstände eher wegzulassen.
Es geht um Übungsblätter für Schüler mit einer Vielzahl ähnlicher Aufgaben, die das Kopfrechnen trainieren sollen. Dafür haben sie je nach Schwierigkeitsgrad und Art der Aufgaben 5-10 Minuten Zeit.
Ich hatte diese Blätter bisher mit RagTime gemacht. Aus Kompatibilitätsgründen will ich dafür auf LibreOffice umsteigen. Mit LibreOffice Basic habe ich keine Vorerfahrungen und habe daher die Makroaufzeichnung als Ausgangspunkt genommen.

Das Aufgaben innerhalb eines Übungsblattes wiederholt vorkommen, ist klar. Das ist nicht das Problem. Das Makro liefert bei mir, trotz der Anweisung zur Neuberechnung, Blätter, die völlig identisch sind.
Wenn der Befehl zur Neuberechnung und der Druckbefehl manuell ausgewählt werden, werden die Zellen neu berechnet (natürlich mit Dubletten) und das aktualisierte Blatt ausgedruckt. Das Makro soll mir ersparen, die Tastenkombinationen sehr oft hintereinander auszuführen. Letztlich möchte ich die Zahl der unterschiedlichen Blätter angeben, die gedruckt werden sollen. Die 10 steht da jetzt erst einmal für Testzwecke.

Die PrintJobListener Variante probiere ich später aus.

Danke
Thomas
Dateianhänge
11+11 Trainer.ods
(20.54 KiB) 251-mal heruntergeladen

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

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von F3K Total » Sa 2. Mär 2013, 12:39

Hi,
obwohl es in meinem eigenen Beispieldokument mit dem PrintJobListener funktioniert, kriege ich es bei deinem nicht hin.
Wie auch immer, ich denke der von Balu vorgeschlagene Weg ist der bessere.
Definiertes Füllen der Felder mit Basic, klappt problemlos, hier der Code:

Code: Alles auswählen

Sub S_init_printjob
    dim nAnzahl as Integer
    nAnzahl = Inputbox("Bitte Anzahl eingeben:","Drucken","10")
    ncounter = 0
    S_recalculate_and_print(nAnzahl)
end sub


Sub S_recalculate_and_print(nAnzahl)
    osheet = Thiscomponent.sheets.getbyname("Tabelle1")
    orange = osheet.getcellrangebyname("A2:G14")
    for c = 1 to nAnzahl
        aformula = orange.formulaarray
        for i = 0 to ubound(aformula)
          arow = aformula(i)
          if i < ubound(aformula) then
              for k = 0 to uBound (arow)
                  z1 = int(rnd()*50)
                  z2 = int(rnd()*50)
                  arow(k) = Z1 & " + " & Z2 & " ="
              next k
          else
              for k = 0 to uBound (arow)- 1'letzte Zeile
                  z1 = int(rnd()*50)
                  z2 = int(rnd()*50)
                  arow(k) = Z1 & " + " & Z2 & " ="
              next k
          endif
        orange.setformulaarray(aformula)
        next i
        dim printprops()
        thiscomponent.print(printprops)
    next c
End Sub
Wobei du das Makro S_init_printjob an Deinen Button hängst.

Viel Erfolg
Gruß R
Windows 11: AOO, LO Linux Mint: AOO, LO

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von gogo » Sa 2. Mär 2013, 13:09

also bei mir funktioniert's so wie es soll, versuch' mal abzuwarten bis die Berechnung bzw der Printjob fertig ist:

Code: Alles auswählen

...
    z=thiscomponent.calculate
    print z
''    wait 4000
    thiscomponent.print(printprops)
next i
...
oder

Code: Alles auswählen

...
    thiscomponent.calculate
''    wait 4000
    a=thiscomponent.print(printprops)
    print a
next i
...
Du kannst den Job auch in ein anderes Makro auslagern.
Im Beispiel mit der Exportfunktion => PDF ... damit wird nicht so viel Papier verschwendet ;)

Code: Alles auswählen

sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
dim printprops()
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

for i = 1 to 10
rem ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:Calculate", "", 0, Array())

rem ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:PrintDefault", "", 0, Array())

    thiscomponent.calculate
'    wait 4000
'    thiscomponent.print(printprops)
	toPDF(thiscomponent, cstr(i))
next i

end sub

function toPDF(oDok as object, sNR as String)
Dim myProps(0) as New com.sun.star.beans.PropertyValue

	sUrl= "file:///~/Dokumente/test" & sNR & ".pdf"
	myProps(0).Name="FilterName"
	myProps(0).Value = "writer_pdf_Export"
	oDok.storetoUrl(sUrl,myProps())

'toPDF = "OK"
end function
(Falls Du auf Win oder Mac arbeitest: "sUrl= "file:///~/Dokumente/test" & sNR & ".pdf"" Pfad anpassen!)
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

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

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von balu » So 3. Mär 2013, 02:38

Hallo Leute,
F3K Total hat geschrieben: Wie auch immer, ich denke der von Balu vorgeschlagene Weg ist der bessere.
Stimmt wohl.
ABER!!!
Ich habe mir einen abgebrochen um den Code aus dem verlinktem Thread an die gegebenen Umstände anzupassen :? . Denn es sollte ja vermieden werden, dass z.B. in einer Zelle 15 + 5 = und in einer anderen Zelle das gleiche steht. Das war leider bei dir, R, der Fall gewesen.

Also musste ich mir was einfallen lassen, damit es zu solchen Kombis nicht kommt. Das habe ich wohl auch so weit regeln können, nur gefällt mir dafür der ganze Aufwand nicht. Was natürlich vorkommen kann ist, dass in ein und der selben Zelle eine Zahl doppelt steht, also z.B. 23 + 23. Das dürfte aber wohl kein Problem darstellen.

Der fertige Code ist jetzt so gesehen ein Misch-Masch aus dem verlinktem, etwas von R und etwas von mir selber. Dementsprechend ist er nicht geschwindigkeitsmäßig Optimiert. Doch dafür dürfte er theoretisch jetzt genau das machen, was verlangt wurde. Theoretisch deshalb, weil ich nicht wirklich ausgedruckt hatte, sondern das in eine PDF gespeichert hatte. Und da konnte ich keine Unstimmigkeiten feststellen.


Der gesamte Ablauf ist wie folgt:
Nach einem Klick auf den Button wird die Anzahl auszudruckender exemplare eingegeben. Sub Blaetter_Drucken


In der Sub Zufallszahlen_eintragen_und_Drucken
Der Inhalt des Tabellenblattes im Bereich A2 bis G14 wird gelöscht.

Nun wird das Tabellenblatt mit den Rechenaufgaben ausgefüllt. Formeln sind dort nicht mehr vorhanden. Das wird alles mit dem Makro gemacht.

Jetzt wird das Tabellenblatt ausgedruckt.

Der Inhalt des Tabellenblattes im Bereich A2 bis G14 wird gelöscht.

Das Tabellenblatt mit den Rechenaufgaben wird erneut neu ausgefüllt und gedruckt. Das geschieht so oft, bis das die vorgegebene Anzahl an exemplaren abgearbeitet wurden.

Hier der gesamte Code.

Code: Alles auswählen

Sub Blaetter_Drucken
	dim nAnzahl as Integer
	nAnzahl = Inputbox("Bitte Anzahl eingeben:","Drucken","10")
	Zufallszahlen_eintragen_und_Drucken(nAnzahl)
end sub
'
'###########################################################################################################
'
Sub Zufallszahlen_eintragen_und_Drucken(nAnzahl)

    thisComponent.lockcontrollers  'Bildschirmaktualisierung ausschalten
    
    Dim zahlen1(99) As Integer, zahlen2(99) As Integer, i As Integer, j As Integer
    Dim gefunden As Boolean, x as Integer, y as Integer, pri As Integer
    dim printprops()

for pri = 1 to nAnzahl
		Thiscomponent.sheets(0).getcellrangebyname("A2:G14").clearContents(4)
		i = 0
		    zahlen1(0) = Int(100 * Rnd) + 1 'erste Zufallszahl
		    zahlen2(0) = Int(100 * Rnd) + 1 'zweite Zufallszahl
	        sZuffi = sZuffi & zahlen1(0) & " + " & zahlen2(0) & " ="  & chr$(13)
		    thisComponent.sheets(0).getcellbyposition(0, 1).string = zahlen1(0) & " + " & zahlen2(0) & " ="
    Do
       i = i + 1       
       gefunden = False
		    zahlen1(i) = Int(100 * Rnd) + 1 'erste Zufallszahl
		    zahlen2(i) = Int(100 * Rnd) + 1 'zweite Zufallszahl
		    sZufall2 = zahlen1(i) & " + " & zahlen2(i) & " ="
		    
			For j = 0 To i - 1
		        if InStr(sZuffi, sZufall2) >0 then
		        i = i -1
		        gefunden = True
					Exit For
      		    End If
	      	next j	
	      			
      	If Not gefunden Then	
	        sZuffi = sZuffi & sZufall2 & zahlen1(i) & " + " & zahlen2(i) & " ="  & chr$(10)
	        x = i mod 7
    	    y = i mod 13
		    thisComponent.sheets(0).getcellbyposition(x, y+1).string = zahlen1(i) & " + " & zahlen2(i) & " ="
	    end if
    Loop Until i = 99
    
    thisComponent.sheets(0).getcellrangebyname("G14").string = "/90 P."
                
    thiscomponent.print(printprops)
    next pri
    
    thisComponent.unlockcontrollers  'Bildschirmaktualisierung einschalten
end sub
Und die geänderte Datei ist auch im Anhang.


Ich hoffe das jetzt alles zufriedenstellend funktioniert.
Wenn jemand weiß wie der Code optimiert werden kann, nur zu, würd mich darüber freuen. :)



Gruß
balu
Dateianhänge
11+11-Trainer_B2.ods
(16.87 KiB) 278-mal heruntergeladen

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

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von tvfi » So 3. Mär 2013, 07:25

Danke!

Die PrintJobListener-Variante und das direkte Füllen der Zellen funktionieren beide. An die erste hätte ich nicht gedacht, für die zweite fehlte mir das Vokabular.
In Sachen Optimierung:
Wenn gefragt ist, dass bei einer Zufallsauswahl Dubletten innerhalb eines Arbeitsblattes nicht vorkommen, gehe ich normalerweise so vor:
- Erstelle eine Liste aller möglichen Auswahlen (Das wären hier ja auch nur 2500)
- Versehe jede mit einer Zufallszahl
- Sortiere nach dieser Zufallszahl
- Drucke die Liste aus
Und das ganze so oft, wie es gebraucht wird, hier also so viele Exemplare wie Schüler. Das zwei Arbeitsblätter identisch sind, ist extrem unwahrscheinlich.
So erstelle ich beispielsweise Vokabeltests aus einer gegebenen Wortliste.
Aber fragt mich (noch) nicht, wie das mit LibreOffice geht. Dafür bin ich zu neu hier.

Gruß
Thomas

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von gogo » So 3. Mär 2013, 10:19

btw: welche Versionvon LO verwendest Du? Betriebssystem?
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

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

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von tvfi » So 3. Mär 2013, 14:54

LO 3.6.5 mit OS X 10.7.5, LinuxMint 14 und Windows 7 (Ich kann zwar Programme installieren, habe aber nicht bei allen Rechner Entscheidungsgewalt über das Betriebssystem.)

Pit Zyclade
* LO-Experte *
Beiträge: 3041
Registriert: Mo 12. Nov 2012, 16:59

Re: Zellinhalte neu Berechnen unzuverlässig

Beitrag von Pit Zyclade » Fr 12. Apr 2013, 22:19

->balu: Was mich stört, ist nicht zum Thema gehörig: Misere statt Miesere. Ist nämlich ein Fremdwort. "Kannst Du mir glauben, Schnattchen..." ;)
LO 24.8.7.2 (X86_64) / Windows 11 64bit
Problem gelöst? Dann bitte im Betreff der ersten Nachricht [gelöst] voranstellen.


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