Calc Tabelle in ein Makro einbinden

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Calc Tabelle in ein Makro einbinden

Re: Calc Tabelle in ein Makro einbinden

von mikeleb » Mi, 08.05.2019 13:54

Hallo,
Da Du das Thema ja offensichtlich erkannt hast
Da bin ich mir nicht so sicher, denn es sind eine Menge Fragen offen ...
Zunächst hat mich das Problem gereizt, für das es verschiedene Lösungen gibt.
dass ich Basic so weit wie notwendig in den nächsten 8 Wochen nicht lernen kann
Das ist verständlich.

Re: Calc Tabelle in ein Makro einbinden

von martin11 » Mi, 08.05.2019 09:22

Hallo Mikeleb,
ich habe so viel am Hals, dass ich Basic so weit wie notwendig in den nächsten 8 Wochen nicht lernen kann.
Ob die 8 Wochen genügen steht auch noch in den Sternen.
Nun noch mal zu meinem Wunsch.
Als Faol mir das Makro erstellt hat, habe ich aus dem Bauch heraus gesagt
240 Seiten und 2x 10 Kopfzeilen.
Faol hat daraus 20 Kopftexte gemacht.
Das war wirklich Ok.
Es hat sich aber gezeigt, dass ich eine variable Einstellung gebrauche.
Da Du das Thema ja offensichtlich erkannt hast nun meine Frage:
Machst Du mir das?
Schicke mir dazu eine private Nachricht,
dann können wir über alles sprechen.
Gruß
Martin

Re: Calc Tabelle in ein Makro einbinden

von mikeleb » Di, 07.05.2019 22:59

Hallo,
da war dann doch noch einiges zu lernen ...
1) Kopfzeilen müssen doch nicht eingeschaltet werden, da die Textrahmen ja direkt auf der Seite platziert werden.
2) Das Setzen der Textrahmen mit Verankerung auf der Seite ist doch kniffliger als gedacht:

Code: Alles auswählen

oView.jumptopage(i)
		oView.jumptostartofpage()
		...
		oDoc.Text.insertTextContent(oView, oFrame, FALSE)
Sollte ja eigentlich den Rahmen auf die Seite setzen. Allerdings passiert folgendes (ich habe es mir zumindest so zusammengereimt): Der Viewcursor ist zwar auf dem Beginn der Seite, allerdings wird der Rahmen zunächst in den aktuellen Absatz eingefügt und dann der Ankerpunkt auf der Seite gesetzt, auf der der Beginn des Absatzes liegt. Befindet sich nun am Anfang der Seite Text eines Absatzes der auf der vorangegangenen Seite begann, so wird der Rahmen auf der vorangegangenen Seite gesetzt.(Ganz heftig wird es, wenn der Absatz sich über mehrere Seiten erstrecken würde.) Dadurch entstanden auf manchen Seiten zwei Rahmen und auf manchen keine. Die Lösung dafür war, die richtige Seite nach dem Verankern per .AnchorPageNo zu setzen.
Gleichzeitig verschoben diese mehreren Rahmen den Textfluss, da ihr Umlauf auf "Parallelen Durchlauf" gesetzt war. Er ist nun auf "Durchlauf" gesetzt.
Dateianhänge
verschiedene kopfzeilen per textrahmen2.odt
(38.78 KiB) 140-mal heruntergeladen

Re: Calc Tabelle in ein Makro einbinden

von mikeleb » Mo, 06.05.2019 22:56

Hallo,
damit haben wir Martin zwei verschiedene Varianten vorgeschlagen, um die Kopfzeilentexte auf die Seiten zu verteilen.
Nun kann er sich eine aussuchen.
Unabhängig davon ist die Frage, ob mit Pseudokopfzeilen oder mit Textrahmen. Mich würde schon interessieren, warum "mein" Makro zu einem Fehler führt. (was nicht heißen soll, dass es die bessere Lösung sei - es liegt mir fern diese aufzudrängen!)

Re: Calc Tabelle in ein Makro einbinden

von mikeleb » Sa, 04.05.2019 13:56

Hallo,
so langsam wird es für verständlich.
Es gibt eine gerade Anzahl Seiten, die mit Kopfzeilentexten versehen werden sollen (z. B. n=252). Es stehen k Kopfzeilentexte für linke Seiten und k Kopfzeilentexte für rechte Seiten zur Verfügung (z. B. k=10, insgesamt 20 Texte von denen aber jeweils zwei zwingend zueinander gehören).
Es gibt mit diesen Zahlen:
126 Doppelseiten für die 10 Paare von Kopfzeilentexten. Um diese möglichst gleichmäßig zu verteilen nimmt man 4 Abschnitte á 12 Doppelseiten und 6 Abschnitte á 13 Doppelseiten.
Theoretisch ist das immer lösbar, solange die Anzahl der Seiten geradzahlig bleibt. Die Berechnung habe ich mal in den Anhang gepackt.
Es bleibt immer noch die Frage, ob das so sein soll?
Gibt es eine inhaltliche Verbindung zwischen den Seiten und den Kopfzeilentexten? Dann wäre das obige schlichtweg akademischer Unsinn.
Dateianhänge
Anzahl verschiedene Kopftexte Berechnung.ods
(17.98 KiB) 84-mal heruntergeladen

Re: Calc Tabelle in ein Makro einbinden

von mikeleb » Fr, 03.05.2019 18:56

Hallo,
wenn 20 Texte möglichst gleichmäßig auf 252 Seiten verteilt werden sollen: 8 Abschnitte á 12 Seiten und 12 Abschnitte á 13 Seiten.
252:20=12,6 -> also müssen es pro Abschnitt 12 oder 13 Seiten sein. Es muss also 12·a+13·b=252 gelten, wobei a+b=20 ist.
12·a+13·(20-a)=252 oder 260-252=13a-12a und somit: a=260-252
Ist m der aufgerundete Werte von 252:20 (Seiten n:Texte k), dann gilt allgemein a=m·k-n und b=k-a
Soweit die Theorie ...
Das geht soweit immer. Allerdings ist dann immer eine Seitenanzahl (eines Abschnittes) ungeradzahlig. Darf das sein? Gibt es weitere Bedingungen ...?
Die Bedingung, dass jeder Abschnitt eine gerade Anzahl von Seiten hat, lässt sich auch lösen:
12·a+14·b=252 mit a+b=20 -> a=14 und b=6, also 14 Abschnitte á 12 Seiten und 6 Abschnitte á 14 Seiten )geht auch immer, wenn die Gesamtseitenanzahl ganzzahlig ist.
Bleibt immer noch die Frage (an Martin) ob das so sein soll?

Re: Calc Tabelle in ein Makro einbinden

von mikeleb » Do, 02.05.2019 18:25

Hallo Faol,
soweit ist das klar. Nur sehe ich das Problem nicht.
Es sind n Seiten. Es gibt k Kopfzeilentexte (für links und für rechts). Die Frage ist nun eigentlich nur noch, wie die Abschnitte entstehen sollen - nach inhaltlicher Vorgabe, gleichmäßig verteilt, ...
Müssen alle Kopfzeilentexte verwendet werden? Werden so viele kreiert, wie notwendig werden? ...

Re: Calc Tabelle in ein Makro einbinden

von mikeleb » Mi, 01.05.2019 11:46

Hallo,
auch nach mehrfachem Lesen verstehe ich es nach wie vor nicht.
@Faol: Nach dieser Berechnung bedeutet es, dass die Anzahl der Abschnitte ein Teiler der Anzahl der Seiten sein muss. Wenn die Anzahl der Seiten nun eine Primzahl ist, geht es gar nicht(z. B. 241 Seiten). Bei z. B. 262 Seiten gäbe es nur zwei Abschnitte. Soll das so?
Nach den Fehlermeldungen, die du im Makro einbaut hast, vermute (???) ich, dass es so nicht sein soll.
Ich kann mir aber auch nicht vorstellen, dass es bei 240 Seiten 12 Abschnitte geben soll und bei 244 Seiten nur noch 4 ...
---
Daher noch einmal die Frage: Nach welcher Regel/Prinzip sollen die Kopfzeilentexte (Wie viele sind es? Variabel?) auf die Buchseiten (Alle außer der ersten? Nur im "eigentlichen" Textbereich"? Auch in Verzeichnissen? Auf leeren Seiten? ...) verteilt werden? Immer links und rechts? Sind auch ungeradzahlige Abschnittslängen möglich/zulässig? ...

Re: Calc Tabelle in ein Makro einbinden

von martin11 » Di, 30.04.2019 12:03

Hier noch mal mit ergänzenden Texte eine Erklärung für meine Idee
von der festen Seitenzahl 240 in dem Modul wegzukommen.
Martin
_Kopfzeilen_berechnet_Kürzt_1.ods
(22.12 KiB) 101-mal heruntergeladen
Faol hat das Modul ja noch mal beschrieben.
Der mir das dankenswerterweise erstellt hat.

Aber so ist das, die Wünsche der User sind unermesslich.
Martin

Re: Calc Tabelle in ein Makro einbinden

von mikeleb » Mo, 29.04.2019 23:16

Hallo,
wenn es klare Kriterien gibt, auf welchen Seiten eine solche "Kopfzeile" (mit variablem Text) erscheinen soll, dürfte das kein Problem darstellen. grundsätzlich muss auf allen solchen Seiten die reguläre Kopfzeile aktiviert werden, um Platz für den Textrahmen zu schaffen.
Für die Verteilung der Kopfzeilentexte auf die Seiten muss ebenfalls eine klare Festlegung her. Aus den bisherigen Beschreibungen werde ich nicht schlau:
Wenn es z. B. n=257 Seiten gibt und dafür a=10 Kopfzeilentexte rechts und a=10 Kopfzeilentexte links. Dann gibt es für je 257/20=12,85 Seiten denselben Kopfzeilentext. Da das natürlich nicht geht, heißt es ein bisschen rechnen und kommt auf 3x12 Seiten mit je einem Text und 17x13 Seiten mit je einem Text. Ist es so gemeint? Nun muss man sich nur noch entscheiden, ob man mit den 13er Blöcken oder den 12er Blöcken anfängt.
Dazu bedarf es etwas mehr an Informationen.

Re: Calc Tabelle in ein Makro einbinden

von mikeleb » So, 28.04.2019 10:03

Hallo,
so etwas ähnliches habe ich hier https://www.libreoffice-forum.de/viewto ... 836#p32836 schon einmal gelöst (in der Art, wie Toxitom empfiehlt).

Re: Calc Tabelle in ein Makro einbinden

von Toxitom » So, 28.04.2019 09:26

Hallo zusammen,

auch wenn schon viel über diese Thema diskutiert und geholfen wurde und es bereits umfangreiche Makros gibt, würde ich gerne noch mal eine grundsätzliche Empfehlung geben:

Überdenkt den kompletten Prozess!

Ich verstehe den Hintergrund und den Wunsch von Martin, halte aber den Weg mit dem "Einfügen eines zusätzlichen Ansatzes etc" für falsch. Dieser zerstört den Textfluss des Buches und den Sinn der Textverarbeitung. Eine Kopfzeile ist nie Teil des Textflusses und sollte es auch nicht werden!

Wenn man die eingebauten Möglichkeiten nicht nutzen möchte ( die Gründe wurden ja dargelegt - ich will sie nicht diskutieren ) wäre meiner Ansicht die korrekte Realisierung durch Einfügen eines Textrahmens. Diesen würde ich an der Seite verankern, porrekt plazieren, mit entsprechenden Abständen zum Text ausstatten sowie den Textfumlauf auf "kein" stellen.

Ein solcher Rahmen stört nicht den Textfluss, lässt sich aber korrekt platzieren - auch auf Seiten mit Index-Einträgen oder Verzeichnissen.

@Martin: Makro Buch Band 2, kapitel 9.3.4 Textrahmen - ab S. 89 ff

Der Rahmen kann durch Schleifen auf jede Seite eingetragen und dann mit Inhalt gefüllt werden - sollte also die Anforderunge erfüllen und hätte noch Potential, die (noch kommenden) Wünsche zu erfüllen.

Soll als Denkanstoss dienen ... ich schreibe das Makro nicht;)

Viele Grüße
Tom

Re: Calc Tabelle in ein Makro einbinden

von Stephan » So, 28.04.2019 09:19

@Alle Teilnehmer
Ich versuche nochmals etwas Klarheit in die Materie zu bringen. ...
ja, danke, aber ich verabschiede mich hier jetzt aus dem Thema. Ich habe mir Martins Problem vor Wochen angesehen, über Wochen habe ich danach wieder und wieder Fragen beantwortet und jetzt erlebe ich das wir faktisch wieder am Anfang stehen.
Mein "On the fly" programmiertes Dialogfenster, muss nicht zwingend als Formular aufgebaut sein!
In der Tat, das hatte ich inzwischen auch vermutet, also war der komplette Thread von Anfang an wieder völlig sinnlos. Ein Eindruck der bei mir auch bei etlichen anderen Threads in den letzten Wochen aufkam.



Gruß
Stephan

Re: Calc Tabelle in ein Makro einbinden

von martin11 » Sa, 27.04.2019 21:59

Hallo Stephan,
mit dem verstehen ist das für mich so eine Sache.
Offensichtlich habe ich eine ganz andere Sprache als Programmierer.
Dass die 240 und was dazu gehört, nicht als Formel bezeichnet, war mir nicht klar.
Ich werde nochmal versuchen, meine gedachte Aufgabenstellung anders zu beschreiben.
Martin

Re: Calc Tabelle in ein Makro einbinden

von Stephan » Sa, 27.04.2019 10:52

In meinem Buch gibt es nur eine Anleitung auf der Basis Base.
Ist das so?
In meinem vorhandenen Makro werden aber Calc-Tabellen verendet.
DU SELBST hast bereits geschrieben das:

"Ich habe einige Muster. Die basieren auf einer Calc Tabelle, in die sind Felder eingefügt, die mit Code hinterlegt sind."

darauf habe ich Dir geantwortet das das ein Formular ist.

Ob es dafür Anleitungen gibt weiß ich nicht, ein kleines Beispiel gibt es in http://de.openoffice.info/viewtopic.php?f=18&t=1553 ziemlich weit unten unter "Beispieldateien" die Datei "ComboBox_in_a_Sheet_En.ods"

In dem Makro gibt es eine starre Formel, die 240 Seiten voraussetzt.
In Deinem Beispielcode ist keine Formel ersichtlich, nur eine Konstante die den Wert 240 hat.
Die möchte ich aber mit der hochgeladenen Formel ersetzen.
Welche Formel soll das sein?
In der Datei aus dem ersten Post ("_Kopfzeilen_berechnet_Kürzt_1.ods") gibt es zwar einige Formeln, aber ich sehe da keinen Zusammenhang.

genauer gesagt:
Wenn Du statt einer Konstante im Makro einen flexiblen Wert verwenden willst musst Du diesen irgendwie eingeben/einlesen, bei einem einzelnen Wert zweckmäßigerweise mit einer INPUT-Box oder auch, eleganter, per Dialog. Es kann aber auch erwünscht sein den Wert erst in einer Calc-Tabelle, aus anderen Werten, auszurechnen und dann einzulesen.
Was für Deinen Zweck der beste Weg ist, kann Dir aber niemand 'vom grünen Tisch aus' beantworten.

Der einfachste Weg wäre, wie schon geschrieben, eine INPUT-Box, was sich allgemein so einbauen liesse:

Code: Alles auswählen

'...
Global nSeite As Integer
'...

Sub DeinMakro()
  '...
  nSeite = 240
  nSeite = InputBox("Bitte Seitenzahl eingeben/anpassen:", "Seitenzahl", nSeite)
  '...
End Sub
Auf den Beispielcode bezogen, also so:

Code: Alles auswählen

REM  *****  BASIC  *****
REM
REM ═══════════════════════════════════════════════════════════════════════════════════════════════════════	
REM  				Die Haupt-/ Startroutine heisst: StartKopfzeile
REM Es wird ein Dialog mit Steuerlementen und einem Textfeld mit weiteren Informationen 
REM zur Programmbenutzung per Code erzeugt.
REM 
REM Einlesen der Kopfzeilen-Texte aus einer Calc-Tabelle. Die Texte MÜSSEN im Zellbereich B1:B20 stehen!
REM Seitenberechnungen von Seite 2 - nSeite (siehe const nSeite=240) gleich hier oben am Anfang des Programms.
REM Formatierung jeder ersten Zeile einer Seite per Absatzvorlage, 
REM dabei Differenzierung zwischen linker und rechter Seite.
REM Eintragen der entsprechenden Texte, in Abhängigkeit der Seitenberechnung und Seite links/rechts
REM Rücksprung in die Hauptroutine
REM ═══════════════════════════════════════════════════════════════════════════════════════════════════════

REM Konstante für die zu bearbeitenden Seiten
'Const nSeite=240

REM Deklaration der Varaiblen
Dim oDocW as Object			' Writer-Dokument
Dim oDocC as Object			' Calc-Dokument (wird versteckt geöffnet)
Dim oCC as Object			' CurrentController
Dim oVC as Object			' ViewCursor
Dim mArray1 				' Array für die Kopfzeilen-Texte (linke Seite)
DIm mArray2 				' Array für die Kopfzeilen-Texte (rechte Seite)
Dim sUrl					' URL-Pfad Calc-Datei
Dim bTrue as Boolean

Global nSeite As Integer

REM Deklaration der Objektvariablen des Programmdialogs
Dim oDlg as Object

REM Start der Hauptroutine
Sub StartKopfzeile
Dim oDlgM as Object 	' das Modell des Dialogs
Dim oMod as Object 		' nimmt jeweils das Modell der Objekte auf

nSeite = 240
nSeite = InputBox("Bitte Seitenzahl eingeben/anpassen:", "Seitenzahl", nSeite)

REM das Dialogmodell erzeugen
	oDlgM = createUnoService("com.sun.star.awt.UnoControlDialogModel")
REM Eigenschaften zuweisen
	With oDlgM
		.setPropertyValue("PositionX", 100)
		.setPropertyValue("PositionY", 100)
		.setPropertyValue("Width", 350)
		.setPropertyValue("Height", 195)
		.setPropertyValue("BackgroundColor", RGB(255,255,255)	'Hintergrundfarbe
		.setPropertyValue("Title", "Programm zur Bearbeitung der Pseudo-Kopfzeilen innhalb des Writer-Dokuments")
	End With
REM Textlabel erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
	With oMod
		.setPropertyValue("Name", "Text2")
		.setPropertyValue("PositionX", 20)
		.setPropertyValue("PositionY", 10)
		.setPropertyValue("Width", 310)
		.setPropertyValue("Height", 140)
		.setPropertyValue("BackgroundColor", RGB(250,230,0)	'Hintergrundfarbe
		.setPropertyValue("Border", 1)	
		.setPropertyValue("Label", chr(10) & " Die regulären Kopfzeilen sind in diesem Writer-Dokument, innerhalb der Seitenvorlagen absichtlich deaktiviert." & chr(10) & _
							" Anstelle der regulären Kopfzeilen, wird auf jeder Seite per Makro die erste Zeile"  & chr(10) & _
								" mittels Absatzvorlagen formatiert und der jeweilige Text eingefügt."  & chr(10) &  chr(10) & _
									" Das Makro erwartet eine Calc-Datei namens >>> Kopfzeilen_Texte.ods <<<" & chr(10) & _
										" Jede andere Datei-Auswahl führt zu einem Fehler und zu einem Programmabbruch!"  & chr(10) & chr(10) &_
											" Die Datei >>> Kopfzeilen_Texte.ods <<< enthält die Texte für die Pseudokopfzeilen." & chr(10) & _
												" Änderungen der Texte können nur in der Calc-Datei vorgenommen werden." & chr(10) & _
													" Die Zeilen 1-10 enthalten die Texte für die linken Seiten des Dokuments." & chr(10) & _
														" Die Zeilen 11-20 enthalten die Texte für die rechten Seiten des Dokuments." & chr(10) & _
															" Mehr als zwanzig Einträge, werden vom Makro nicht berücksichtigt!"& chr(10) & chr(10) &_
																" Wenn das Programm zur Bearbeitung der Writer-Datei gestartet werden soll," & chr(10) &_
																	" dann klicken Sie bitte auf den Button 'Start', ansonsten 'Abbruch'" & chr(10))
	End With
	oDlgM.insertByName("Text2", oMod)
	
REM Button erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlButtonModel")
	With oMod
		.setPropertyValue("Name", "btn")
		.setPropertyValue("PositionX", 260)
		.setPropertyValue("PositionY", 160)
		.setPropertyValue("Width", 65)
		.setPropertyValue("Height", 20)
		.setPropertyValue("Label", "Abbruch/ Beenden" )
	End With
	oDlgM.insertByName("btn", oMod)

REM den eben erzeugten Button klonen (vor der Anzeige des Dialogs)
	oMod = oMod.CreateClone
	With oMod
		.Setpropertyvalue("PositionX",25)
		.Setpropertyvalue("PositionY",160)
		.Setpropertyvalue("Name","btnStart")
		.SetpropertyValue("Label", "Start"
	End With
	oDlgM.insertByName("btnStart", oMod)

REM den eben erzeugten Button klonen (vor der Anzeige des Dialogs)
	oMod2 = oMod.CreateClone
	With oMod2
		.Setpropertyvalue("PositionX",115)
		.Setpropertyvalue("PositionY",160)
		.setPropertyValue("Width", 120)
		.Setpropertyvalue("Name","btnStart")
		.SetpropertyValue("Label", "Texte der Pseudo-Kopfzeilen löschen"
	End With
	oDlgM.insertByName("btnDelete", oMod2)

REM Dialog ertellen 
	oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
	oDlg.setModel(odlgM)
	
REM Listener für Abbruch-Button
	oListenerClone = CreateUnoListener("btn_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btn")
	oControl.addActionListener(oListenerClone)
	
REM Listener für den geklonten Button
	oListenerClone = CreateUnoListener("btnStart_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnStart")
	oControl.addActionListener(oListenerClone)
	
REM Listener für den geklonten Button
	oListenerClone2 = CreateUnoListener("btnDelete_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnDelete")
	oControl.addActionListener(oListenerClone2)	
	
REM Dialog anzeigen
	oWin = createUnoService("com.sun.star.awt.Toolkit")
	oDlg.createPeer(oWin, null)
	oDlg.execute
End Sub

'... 
Erbarmt sich, jemand eines Schriftstellers?
Das tun hier seit Wochen etliche Forumsteilnehmer.
Wenn möglicherweise inzwischen die Antworten spärlicher werden, dann wohl weil in zwischen Einige davor kapitulieren Fragen zu beantworten, deren Zusammenhang man kaum versteht.



Gruß
Stephan

Nach oben