Calc Tabelle in ein Makro einbinden
Moderator: Moderatoren
Calc Tabelle in ein Makro einbinden
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?
Martin
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?
Martin
Re: Calc Tabelle in ein Makro einbinden
Hallo,
was willst du uns damit sagen oder fragen?
was willst du uns damit sagen oder fragen?
Gruß,
mikeleb
mikeleb
Re: Calc Tabelle in ein Makro einbinden
Das was dasteht kann garnicht gelingen, wahrscheinlich meinst Du aber etwas Anderes. Nur was?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?
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
Re: Calc Tabelle in ein Makro einbinden
Danke Stephan,
ich werde in dem Buch jetzt wegen Formulare nachschlagen.
Martin
ich werde in dem Buch jetzt wegen Formulare nachschlagen.
Martin
Re: Calc Tabelle in ein Makro einbinden
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?
Martin
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
Re: Calc Tabelle in ein Makro einbinden
DU SELBST hast bereits geschrieben das:In meinem Buch gibt es nur eine Anleitung auf der Basis Base.
Ist das so?
In meinem vorhandenen Makro werden aber Calc-Tabellen verendet.
"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 Deinem Beispielcode ist keine Formel ersichtlich, nur eine Konstante die den Wert 240 hat.In dem Makro gibt es eine starre Formel, die 240 Seiten voraussetzt.
Welche Formel soll das sein?Die möchte ich aber mit der hochgeladenen Formel ersetzen.
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
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
'...
Das tun hier seit Wochen etliche Forumsteilnehmer.Erbarmt sich, jemand eines Schriftstellers?
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
Re: Calc Tabelle in ein Makro einbinden
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
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
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.@Alle Teilnehmer
Ich versuche nochmals etwas Klarheit in die Materie zu bringen. ...
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.Mein "On the fly" programmiertes Dialogfenster, muss nicht zwingend als Formular aufgebaut sein!
Gruß
Stephan
Re: Calc Tabelle in ein Makro einbinden
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
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
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Re: Calc Tabelle in ein Makro einbinden
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).
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
mikeleb
Re: Calc Tabelle in ein Makro einbinden
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.
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
mikeleb
Re: Calc Tabelle in ein Makro einbinden
Hier noch mal mit ergänzenden Texte eine Erklärung für meine Idee
von der festen Seitenzahl 240 in dem Modul wegzukommen.
Martin 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
von der festen Seitenzahl 240 in dem Modul wegzukommen.
Martin 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
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? ...
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? ...
Gruß,
mikeleb
mikeleb
Re: Calc Tabelle in ein Makro einbinden
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? ...
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? ...
Gruß,
mikeleb
mikeleb
Re: Calc Tabelle in ein Makro einbinden
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?
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?
Gruß,
mikeleb
mikeleb