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
[quote]In meinem Buch gibt es nur eine Anleitung auf der Basis Base.
Ist das so?
In meinem vorhandenen Makro werden aber Calc-Tabellen verendet.[/quote]
DU SELBST hast bereits geschrieben das:
[i]"Ich habe einige Muster. Die basieren auf einer Calc Tabelle, in die sind Felder eingefügt, die mit Code hinterlegt sind."
[/i]
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"
[quote]In dem Makro gibt es eine starre Formel, die 240 Seiten voraussetzt.[/quote]
In Deinem Beispielcode ist keine Formel ersichtlich, nur eine Konstante die den Wert 240 hat.
[quote]Die möchte ich aber mit der hochgeladenen Formel ersetzen.[/quote]
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]
'...
Global nSeite As Integer
'...
Sub DeinMakro()
'...
nSeite = 240
nSeite = InputBox("Bitte Seitenzahl eingeben/anpassen:", "Seitenzahl", nSeite)
'...
End Sub
[/code]
Auf den Beispielcode bezogen, also so:
[code]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
'...
[/code]
[quote]Erbarmt sich, jemand eines Schriftstellers?[/quote]
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