Calc Tabelle in ein Makro einbinden

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

martin11
***
Beiträge: 73
Registriert: Do, 30.03.2017 16:07

Calc Tabelle in ein Makro einbinden

Beitrag von martin11 » Di, 23.04.2019 13:52

Diese Calc Tabelle in ein Makro einfügen oder dazu konvertieren wie kann das gelingen?
Ich habe einige Muster.
Die basieren auf einer Calc Tabelle, in die sind Felder eingefügt, die mit Code hinterlegt sind.
Dient die Tabelle als Dialog oder wie muss ich das verstehen?
_Kopfzeilen_berechnet_Kürzt_1.ods
(18.92 KiB) 48-mal heruntergeladen

Martin

mikeleb
******
Beiträge: 796
Registriert: Fr, 09.12.2011 16:50

Re: Calc Tabelle in ein Makro einbinden

Beitrag von mikeleb » Di, 23.04.2019 16:56

Hallo,
was willst du uns damit sagen oder fragen?
Gruß,
mikeleb

Stephan
********
Beiträge: 11071
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Tabelle in ein Makro einbinden

Beitrag von Stephan » Di, 23.04.2019 21:56

Diese Calc Tabelle in ein Makro einfügen oder dazu konvertieren wie kann das gelingen?
Das was dasteht kann garnicht gelingen, wahrscheinlich meinst Du aber etwas Anderes. Nur was?
Ich habe einige Muster.
Die basieren auf einer Calc Tabelle, in die sind Felder eingefügt, die mit Code hinterlegt sind.
Dient die Tabelle als Dialog oder wie muss ich das verstehen?


Eine Tabelle mit (zusätzlichen) Feldern versteht sich in OO/LO als Formular. Das ist nicht Dasselbe wie ein Dialog, weder optisch (was ja zu sehen ist) noch hinsichtlich de Programmierung, weil Formularfelder anders angesprochen werden müssen als Dialogfelder und teils (z.B. Radio-Buttons) auch programmiermäßig anders behandelt werden.


Gruß
Stephan

martin11
***
Beiträge: 73
Registriert: Do, 30.03.2017 16:07

Re: Calc Tabelle in ein Makro einbinden

Beitrag von martin11 » Mi, 24.04.2019 09:50

Danke Stephan,
ich werde in dem Buch jetzt wegen Formulare nachschlagen.
Martin

martin11
***
Beiträge: 73
Registriert: Do, 30.03.2017 16:07

Re: Calc Tabelle in ein Makro einbinden

Beitrag von martin11 » Fr, 26.04.2019 18:20

Nun habe ich mich auch mit Formularen befasst.
In meinem Buch gibt es nur eine Anleitung auf der Basis Base.
Ist das so?
In meinem vorhandenen Makro werden aber Calc-Tabellen verendet.
In dem Makro gibt es eine starre Formel, die 240 Seiten voraussetzt.
Die möchte ich aber mit der hochgeladenen Formel ersetzen.
Erbarmt sich, jemand eines Schriftstellers?

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

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

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

'Aktion bei Klick auf 'Abbrechen'
Sub btn_actionPerformed(oEvent)
	oDlg.EndExecute
End Sub

REM Aktion Pseudo-Kopfzeilen eintragen und formatieren
Sub btnStart_actionPerformed(oEvent)
	'Listener für geklonten Button
	oListenerClone = CreateUnoListener("btnStart_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnStart" & cStr(iMax))
	oControl.addActionListener(oListenerClone)
		Dateidialog
End Sub

REM Aktion Pseudo-Kopfzeilen löschen
Sub btnDelete_actionPerformed(oEvent1)
	oListenerClone2 = CreateUnoListener("btnDelete_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnDelete" & cStr(iMax))
	oControl.addActionListener(oListenerClone2)
'Dim nResult As Integer

'	If bTrue=True then Exit Sub
'	' 1= OK  2 = Cancel
'	nResult = MsgBox("Wollen Sie wirklich alle Texte in den Pseudo-Kopfzeilen löschen?", 305, "WARNUNG!")
'	
'	If nResult = 1 then
'			Msgbox "Die Texte der Kopfzeilen werden gelöscht", 64, "Texte werden gelöscht!"
'				bTrue=True
'					Kopfzeileloeschen
'	ElseIf nResult = 2 then
'			Msgbox "Die Aktion wird abgebrochen!", 48, "Texte werden nicht gelöscht!"
'				bTrue=True
'					Exit Sub
'	End If

	Kopfzeileloeschen

End Sub
REM ???????????????????????? ENDE DIALOG-ROUTINE ??????????????????????????????????????????????????????????

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
Sub Dateidialog
On Error GoTo ErrorHandler
REM Laden der Bibliothek "Tools" mit den Hilfsfunktionen
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )

		MsgBox "Der nachfolgende Dateidialog fordert sie zum Öffnen dieser Datei auf:" & chr(10) & _ 
					">>> Kopfzeilen_Texte.ods <<<" & chr(10) & _ 
					"Wählen Sie zunächst den korrekten Pfad zu dieser Datei aus." ,64,"Hinweis"
	' Filepicker (Datei-Dialog
	ChooseAFileName
		
		sExt=getFileNameExtension(sUrl)
			' Fehlermeldung für den Fall, dass kein Calc-Dokument ausgewählt wurde
			if sExt <> "ods" then 
				MsgBox("Bitte wählen Sie ein Calc-Dokument aus!" & chr(10) & _
							"Das Programm wird beendet!"  & chr(10)   & chr(10) & _
								"Starten Sie das Programm erneut.", 48, "Fehler: Dateiauswahl")
					exit sub
			end if
REM Calc-Datei im Hintergrund öffnen
Call FileOperation

REM Routine für die Pseudo-Kopfzeilen aufrufen
Call Seite
Exit Sub
REM ErrorHandler für den Fall, dass im Dateidialog auf "ABRUCH" geklickt wurde
ErrorHandler:
Msgbox "Sie haben den Dateidialog abgebrochen!" & chr(10) & _
			"Starten Sie das Programm erneut und wählen eine Calc-Datei aus!", 48, "Fehler: Anwender hat Dateiauswahl abgebrochen!"
End Sub

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
REM Calc-Datei im Hintergrund öffnen
REM Dateioperation: Datei öffnen und auslesen
Sub FileOperation
n = FreeFile                  		' Immer nötig. Nächste freie Dateinumer
Open sUrl For Input As #n  			' Datei zum Lesezugriff öffnen
Do While NOT EOF(n)            		' Solange NOT End Of File
  Input #n, s                  		' Daten werden gelesen

REM Hier werden die Daten verarbeitet

	' Objekt-Eigenschaften
	Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
	
	' Dokument im Hintergrund öffnen
	FileProperties(0).Name = "Hidden"
	FileProperties(0).Value = true

	FileProperties(1).Name = "AsTemplate"
	FileProperties(1).Value = true
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
		' Datei öffnen
		oDocC = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, FileProperties())
'mri oDocC
			' Daten aus Tabelle einlesen und in die Arrays verteilen
			' mArray1() = Daten für die linke Seite (gerade Seitenzahl)
			mArray1()=oDocC.Sheets().getByName("KopfZeilenTexte").getCellRangeByName("A1:B10").getDataArray()

			' mArray2() = Daten für die rechte Seite (ugerade Seitenzahl)
			mArray2()=oDocC.Sheets().getByName("KopfZeilenTexte").getCellRangeByName("A11:B20").getDataArray()
			
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????		
			' Datei nur einmal öffnen			
			x="true"
			if x = "true" then exit do
Loop
	' Calc-Datei korrekt schließen
	CloseDocC
End Sub

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
REM Datei mit Filepicker öffnen
Function ChooseAFileName() As String
  Dim vFileDialog         			' Instanz des Service FilePicker
  Dim vFileAccess         			' Instanz des Service SimpleFileAccess
  Dim iAccept as Integer  			' Rückgabe vom FilePicker
  Dim sInitPath as String 			' Der Startpfad

  ' Achtung: Die folgenden Services müssen in dieser Reihenfolge
  ' aufgerufen werden, sonst wird Basic den vFileDialog nicht wieder entfernen.
  vFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
  vFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")

  ' Jetzt wird der Startpfad gesetzt.
  sInitPath = ConvertToUrl(CurDir)
  If vFileAccess.Exists(sInitPath) Then
    vFileDialog.SetDisplayDirectory(sInitPath)
  End If
  
  iAccept = vFileDialog.Execute()       		' Der Dateiauswahldialog wird ausgeführt.
  If iAccept = 1 Then                   		' Prüfung des Rückgabewerts des Dialogs.
    ChooseAFileName = vFileDialog.Files(0) 		' Rückgabe des Dateinamens, falls
                                         		' der Dialog nicht abgebrochen wurde.
	sUrl = ChooseAFileName
  End If
  vFileDialog.Dispose()                 		' Der Dialog wird entfernt.
End Function
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
REM Datei korrekt schließen
Sub CloseDocC
	If HasUnoInterfaces(oDocC, "com.sun.star.util.XCloseable") Then
	  oDocC.close(true)
	Else
	  oDocC.dispose()
	End If
End Sub
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????


REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
Sub Seite
'Dim oStar as Object
'Dim oDocW as Object
Dim oCC as Object
Dim oVC as Object
Dim oText as Object
Dim oEndCursor as Object
Dim oStartCursor as Object
Dim nDiv%
'mri oStar	
	oDocW=ThisComponent
	oCC=oDocW.CurrentController
	oVC = oCC.getViewCursor
	oVC.jumpToPage(2)
'mri oVC

' Berechnung der erforderlichen Durchläufe
nDiv=nSeite/10			' 10 = Anzahl der Arrayfelder

	' Schleife über je 10 Arrayfelder
	for i = 0 to 9
		' 
		for j = 0 to nDiv
		
			' gerade Seitenzahl	= linke Seite
			if oVC.Page mod 2 = 0 then			
				With oVC
					.jumpToStartOfPage(False)
					.ParaStyleName="_Gl_Text-8_pt_Kopf_Gerade_Rechts bündig"
					.String=mArray1(i)(1)
'					.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE
					.collapseToEnd
					.collapseToStart
					.jumpToNextPage					
				End With

			' ungerade Seitenzahl = rechte Seite
			else
				With oVC
					.jumpToStartOfPage(False)
					.ParaStyleName="_Gl_Text-8_pt Kopf_Ungerade_Links bündig"
					.String=mArray2(i)(1)
'					.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE
					.collapseToEnd
					.collapseToStart
					.jumpToNextPage					
				End With
			end if
		
		next j
	next i

	MsgBox("Die Kopfzeileninhalte wurden ab Seite 2 bis zur Seite " & nSeite & " eingetragen!", 64, "Programmende: Kopfzeilen-Einträge")
End Sub

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
Sub Kopfzeileloeschen
Dim oCC as Object
Dim oVC as Object
Dim oText as Object
Dim oEndCursor as Object
Dim oStartCursor as Object
Dim nDiv%	

	oDocW=ThisComponent
	oCC=oDocW.CurrentController
	oVC = oCC.getViewCursor
	oVC.jumpToPage(2)
'mri oVC

' Berechnung der erforderlichen Durchläufe
nDiv=nSeite/10			' 10 = Anzahl der Arrayfelder

	' Schleife über je 10 Arrayfelder
	for i = 0 to 9
		for j = 0 to nDiv
		
			' gerade Seitenzahl	= linke Seite
			if oVC.Page mod 2 = 0 then			
				With oVC
					.jumpToStartOfPage(False)
					.ParaStyleName="_Gl_Text-8_pt_Kopf_Gerade_Rechts bündig"
					.gotoEndOfLine(true)
					.String="" 'mArray1(i)(1)
'					.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE
					.collapseToEnd
					.collapseToStart
					.jumpToNextPage					
				End With
		
			' ungerade Seitenzahl = rechte Seite
			else
				With oVC
					.jumpToStartOfPage(False)
					.ParaStyleName="_Gl_Text-8_pt Kopf_Ungerade_Links bündig"
					.gotoEndOfLine(true)
					.String="" 'mArray2(i)(1)
'					.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE
					.collapseToEnd
					.collapseToStart
					.jumpToNextPage					
				End With
			end if
		
		next j
	next i

		MsgBox("Die Kopfzeileninhalte wurden von Seite 2 bis " & nSeite & " gelöscht!", 15, "Programmende: Kopfzeilen-Löschung")

End Sub
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????


Martin

Stephan
********
Beiträge: 11071
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Tabelle in ein Makro einbinden

Beitrag 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

martin11
***
Beiträge: 73
Registriert: Do, 30.03.2017 16:07

Re: Calc Tabelle in ein Makro einbinden

Beitrag 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

Benutzeravatar
Faol
****
Beiträge: 119
Registriert: Di, 26.01.2016 21:18

Re: Calc Tabelle in ein Makro einbinden

Beitrag von Faol » Sa, 27.04.2019 22:11

Hallo,

@Alle Teilnehmer
Ich versuche nochmals etwas Klarheit in die Materie zu bringen.
Der gepostete Writer-Code stammt von mir.

Dazu muss ich zunächst auf Probleme von Libreoffice hinweisen,
die aber nur unter bestimmten Bedingungen auftreten.
Bezüglich dieser Probleme hatte ich eine Diskussion an anderer Stelle
angestoßen, bei der sich drei Dinge herauskristallisierten.
  1. Mein Code war nicht ganz einwandfrei
  2. Es gibt einen Libo-Bug im Folder-/Filepicker seit ca. Version 6.x
    siehe Bug-Report
    Wird also ab Libo-Version 6.2.3. behoben sein.
  3. Es gibt einen Libo-Bug, wenn man einer Schaltfläche, welche auf
    einem Writer-Blatt platziert ist, das Event „Aktion bestätigen“ zu weist.
    siehe meinen Bug-Report
    Noch keine Lösung vorhanden.
Punkt c)
  • tritt nicht ein, wenn man wie Martin es macht, das Makro über ein
    benutzerdefiniertes Menü aufruft.
  • tritt nicht ein, wenn man mit AOO arbeitet.
  • tritt auch nicht ein, wenn man diesen Code der Schaltfläche zu weist:

Code: Alles auswählen

Sub Main
Msgbox „Test der Schaltfläche mit dem Event ‚Aktion bestätigen‘“
End Sub
Hier nun ein Zip-File, welches die erforderliche Calc-Datei enthält und die Writer-Datei mit Makro.
Die Writer-Datei ist formal dem Original-Buch nachempfunden.
D.h. die Datei enthält die Original Seitenvorlagen, zwei Absatzvorlagen,
ebenso wie diese im Buch für die "Pseudo-Kopfzeilen" verwendet werden.
Alle anderen Vorlagen wurden nicht verändert, damit findet man sich leicht zurecht,
wenn man im Vorlagenfenster "Benutzerdefinierte Vorlagen", bzw. "Benutzervorlagen" zur Filterung einsetzt.
Zippy.zip
(43.98 KiB) 35-mal heruntergeladen
In beiden Dokumenten sind weitere Beschreibung enthalten.
In der Writer-Datei befinden sich ab Seite 241 weitere Informationen.

Das Makro in der Writer-Datei ist eine neue Version von mir.
Startbar über einer der Schaltflächen; Bitte die Hinweise auf den Schaltflächen beachten!

@Martin
Bitte lösche das alte Kopfzeilen-Makro und nutze nur noch dieses.


@Alle Teilnehmer
Ich wiederhole nochmals:
Warum „Pseudo-Kopfzeilen“?
Martins Wunsch ist es nur eine begrenzte Anzahl von Seitenvorlagen zu nutzen.
Da aber die regulären Kopfzeilen dem Automatismus unterliegen, dass einmal eingetragene Texte auf den Folgeseiten (ggf. rechte/ linke Seite anders) automatisch wiederholt werden, aber eine Unterbrechnung der Wiederholung nur mit zusätzlichen Seitenvorlagen realisierbar wäre, habe ich ihm dazu geraten, die Kopfzeilen generell auszuschalten.
Dann den ersten Absatz einer jeden Seite als „Pseudo-Kopfzeilen“ zu formatieren und zu nutzen.
Nun können im Wechsel (rechts/links), als auch abschnittsweise unterschiedliche Texte dort per Makro eingetragen werden.
Dazu Ganze umfaßt konstant 240 Seiten ( S.2-S.241).
Es gibt in der Calc-Datei frei editierbare Texte. Jeweils 10 für die linken Seiten des Buchs und 10 für die rechten Seiten des Buchs.
Später kam Martins Wunsch, ab Seite 242 ebenfalls die Kopfzeilen-Texte einzutragen.
Dieses ist aber ohne weiter Seitenvorlagen nicht möglich, weil sich von Seite 243 bis Seite 252 ein Stichwortverzeichnis erstreckt. Da man auf den Seiten oberhalb eines Stichwortverzeichnisses keine Absatzmarke einfügen kann, muss hier die reguläre Kopfzeile passend zu jeder neuen Seitenvorlage wieder eingeschaltet werden.
Das abgeänderte Buch liegt Martin nun vor.
Auch das hochgeladenen Musterbuch ist dem entsprechend formatiert.

Wo ist nun das Problem?
Mein Makro arbeitete nur mit einer konstanten Seitenzahl (S=240) und genau 20 Kopfzeilen-Texten.
Martin möchte aber beides variabel haben.
D.h.
a) variable Anzahl von Seiten
b) variable Anzahl von Kopfzeilen-Texten
Das Makro soll nun anhand der Calc-Datei (Quelle der Kopfzeilen-Texte) erkennen wieviele Texte im Buch verteilt werden sollen, dies in Abhängigkeit von der Anzahl der Gesamtseiten-1 des Buches. Minus 1, weil die erste Seite des Buches anders formatiert ist.
Also Verteilung der Kopfzeilen-Texte von Seite 2 bis Ende des Buches.

Ich weiß nicht wie ich diese Variabilität im Makro bewerkstelligen soll.
Eine zusätzliche Calc-Datei für die Seiten- und Textberechnung ist jedenfalls nicht erforderlich.
Die Ermittlung der Mengen (Seiten und Texte) und die Berechnungen zur Verteilung könnten innerhalb der Routinen „Sub zKopfzeilenTexteSchreiben“ und „Sub zKopfzeilenTexteloeschen“ erfolgen.

Hiermit endet mein kleines Buch :lol:
------------------------------------------------------------------------
Was sind nun Martins tatsächliche Fragen?
  1. Wie muss das Makro abgeändert werden, damit man mit einer variablen Anzahl von Texten arbeiten kann?
  2. Wie muss das Makro abgeändert werden, damit man mit einer variablen Anzahl von Seiten arbeiten kann?
  3. Mein "On the fly" programmiertes Dialogfenster, muss nicht zwingend als Formular aufgebaut sein!
    Also Eingabe von Daten gemäß Punkt 1 und 2, usw.
  4. sonstige Wünsche?
@Martin
Wenn meine Aussagen und die für Dich gestellten Fragen nicht korrekt sind,
dann antworte bitte verständlich und vor allem ausführlich.
In jedem Fall, wäre ich auch über eine eindeutige Zustimmung sehr erfreut. :)
Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.6 • LibO 6.2.3.2 (x64)
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Stephan
********
Beiträge: 11071
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Tabelle in ein Makro einbinden

Beitrag 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

Toxitom
********
Beiträge: 3572
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Calc Tabelle in ein Makro einbinden

Beitrag 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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic

mikeleb
******
Beiträge: 796
Registriert: Fr, 09.12.2011 16:50

Re: Calc Tabelle in ein Makro einbinden

Beitrag 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).
Gruß,
mikeleb

Benutzeravatar
Faol
****
Beiträge: 119
Registriert: Di, 26.01.2016 21:18

Re: Calc Tabelle in ein Makro einbinden

Beitrag von Faol » Mo, 29.04.2019 17:49

Hallo,

vielen Dank für Eure Rückmeldungen.

Ich hatte mich eingeschaltet, weil ich Maritn‘s Buch und seine Wünsche kenne.
Da ich die Restproblematik nun klar gestellt habe, verabschiede ich mich nun auch aus diesem Thread.
Martin hatte ich schon vor Wochen mitgeteilt, dass ich keine Zeit mehr habe mich weiter um sein Anliegen zu kümmern.

Aus meiner Sicht erfüllt mein Makro ca. 95% der Wünsche, denn das Hauptanliegen war,
eine einfache automatisierte Methode zu finden die Kopfzeilen-Texte zu schreiben und ggf. zu löschen.
Dieses funktioniert bis zur Seite 241 tadellos.
Die Texte für die restlichen Seiten können aus meiner Sicht unproblematisch manuell
eingefügt werden, zumal das Buch nahezu fertig ist.

@mikeleb
Vielen Dank für Dein Makro. Ich habe es am hochgeladenen Musterbuch ausprobiert, dort lief es tadellos.
Wenn ich es aber auf Martins Buch anwende, dann erhalte ich nach dem 208. Frame einen Laufzeitfehler:
Zeile 43
oTextC=oDoc.Text.createtextcursorbyrange(oView)
Runtime Error.png
Runtime Error.png (11.74 KiB) 1403 mal betrachtet
Die Ursache ist mir schleierhaft. Es befindet sich an der Fehlerstelle im Buch kein Verzeichnis,
auch keine Tabelle. Habe aber zu wenig Zeit, nun hier noch längere Tests durchzuführen.

Desweiteren müßte das Makro wenn es auf Martin's Buch angewendet werden soll, noch um einige Dinge
ergänzt werden, weil es spätestens ab dem Stichwortverzeichnis wieder zu Problemen kommt.
Es müßten also mehrere Abfragen eingebaut werden, ob der Rahmen im Fließtext abgelegt werden soll oder in der Kopfzeile.
Gemäß:
Wenn Seite 243ff. oder bestimmte Seitenvorlage, dann Rahmen in Kopfzeile.
Hinzu kommt auch bei der Verwendung von Rahmen noch das offne Thema:
>> variable Seitenanzahl - variable Anzahl „Kopfzeilen-Texte“ und deren Verteilung <<
Da beißt sich dann die Katze wieder…

Nochmals vielen Dank.
Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.6 • LibO 6.2.3.2 (x64)
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

mikeleb
******
Beiträge: 796
Registriert: Fr, 09.12.2011 16:50

Re: Calc Tabelle in ein Makro einbinden

Beitrag 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.
Gruß,
mikeleb

martin11
***
Beiträge: 73
Registriert: Do, 30.03.2017 16:07

Re: Calc Tabelle in ein Makro einbinden

Beitrag 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) 41-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

Benutzeravatar
Faol
****
Beiträge: 119
Registriert: Di, 26.01.2016 21:18

Re: Calc Tabelle in ein Makro einbinden

Beitrag von Faol » Di, 30.04.2019 21:23

Hallo,
Martin hat geschrieben:Aber so ist das, die Wünsche der User sind unermesslich.
Wem sagst Du das... :lol:

Hier eine kleine Berechnungsgrundlage, die aber noch nicht in mein Makro eingeflossen ist.
Werde diese Arbeit auch nicht erledigen können.
Nur mal so als Anregung:
Kopfzeilen_Texte Makroberechnungen v01.ods
(33.5 KiB) 36-mal heruntergeladen
Bitte die Kommentare in der Tabelle lesen und alles auf Korrektheit prüfen.

Um neue Berechnungen durchzuführen bitte nur in die Zellen A9 und B9 andere Werte eingeben.

Zelle B12 ist nur ein Zähler für den Zellbereich A15:B114, hat aber keinerlei Einfluß auf die Berechnungen.
Dafür sind nur die Zellen A9 und B9 zuständig.
Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.6 • LibO 6.2.3.2 (x64)
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Antworten