Hallo Juergen & *,
nachdem Gerhard festgestellt hatte
(https://listarchives.libreoffice.org/de/users/msg21491.html), dass
Dein Makro bei direktem Start von "StartKopfzeile" in der BASIC-IDE
(interner Start) fehlerfrei läuft im Gegensatz zum Start über die
Schaltfläche "Start Texte eintragen" in der Datei "Musterbuch mit
Makro_06.odt" (externer Start), habe ich mir überlegt zu schauen, was
passiert, wenn man Dein Makro über ein Windows-CMD extern startet, was
ja auch eine Form des externen Makro-Starts darstellt.
Da mir Dein Makro (für eventuelle Fehlersuche) durch die vielen SUBs
und FUNCTIONs zu unübersichtlich ist, habe ich es mal neu geschrieben
auf Basis des von Dir verwendeten Algorithmus.
Das (neue) Makro läuft fehlerhaft, wenn man den
Betriebssystem-FilePicker "com.sun.star.ui.dialogs.FilePicker" auswählt.
Im Kontext der von Oliver und mir festgestellten Probleme mit dem
Betriebssystem-FolderPicker "com.sun.star.ui.dialogs.FolderPicker"
scheint es mir doch nun sehr wahrscheinlich, dass da ein Problem mit
der Picker-Software vorliegt, wenn man die Betriebssystem-Versionen
der Picker-Software verwendet - also auch Deine Probleme mit Deinem
Makro wohl damit zusammenhängen.
Gruß
Hans-Werner
[1] Ergebnis (Systemumgebung: LO 6.2.2.2 (x64) @ Windows 7 Home
Premium 64-bit)
[1.1] Verwendet man für die Dateiauswahl den Betriebssystem-FilePicker
("com.sun.star.ui.dialogs.FilePicker"), bleibt das Makro nach der
Dateiauswahl hängen.
[1.2] Verwendet man für die Dateiauswahl den Office-FilePicker
("com.sun.star.ui.dialogs.OfficeFilePicker"), läuft das Makro
fehlerfrei durch.
[1.3] Verwendet man in Deinem Makro den Office-FilePicker
("com.sun.star.ui.dialogs.OfficeFilePicker"), hat dies keine
Auswirkung auf das Hängenbleiben bei dem MsgBox-Aufruf. Ich spekuliere
mal, dass da wohl vielleicht noch andere ungünstige Randbedingungen
auftreten, die den FilePicker-Fehler kaschieren oder auch der
FilePicker-Fehler selbst andere Fehler verursacht.
[2] Das "neue" Makro
[2.1] Die Dialog-Sachen (Schaltfläche "Start Texte eintragen") habe
ich durch eine einfache InputBox ersetzt.
[2.2] Die Datei "CALC.ods" ist eine unveränderte Kopie Deiner Datei
"Kopfzeilen_Texte.ods".
[2.3] Die Datei "WRITER.odt" ist eine Kopie Deiner Datei "Musterbuch
mit Makro_06.odt", wobei ich lediglich
+ Dein Makro "modKopfzeile" entfernt habe.
+ die Schaltfläche "Start Texte eintragen" entfernt habe.
[2.4] Soweit ich es überschaut habe, liefert mein Makro das gleiche
Ergebnis wie Dein Makro (identische Seitenzahl von 249 Seiten und
entsprechende Kopfzeilen-Einträge, aber auf der letzten Seite (249)
gibt es eine (kleine) Abweichung:
+ Dein Makro: "Mein Text Links 10" und "Mein Text Rechts 10Mein Text
Rechts 10Mein Text Rechts 10"
+ Mein Makro: "Mein Text Links 10" und "Mein Text Rechts 10"
[2.5] Falls Du weitere Abweichungen oder Fehlfunktionen in dem (neuen)
Makro feststellen solltest, so melde Dich bitte.
[3] Hinweise:
[3.1] Makro (Download-Datei: Kopfzeilen.txt)
Das (neue) Makro besteht aus der "Sub Kopfzeilen" und der "Function
DateiAuswahl".
[3.2] Windows-CMD (Download-Datei: Kopfzeilen.cmd)
Damit kann man das Makro (unter Windows) extern starten (für Linux
entsprechend BASH-Syntax):
SET L="C:/Program Files/LibreOffice/program/soffice.exe"
SET M="macro:///Standard.Kopfzeilen.Kopfzeilen()"
%L% --nologo %M%
Mit:
+ Der Speicherpfad von "soffice.exe", muss gegebenenfalls angepasst
werden:
SET L="C:/Program Files/LibreOffice/program/soffice.exe"
+ Der Speicherpfad des Makros:
SET M="macro:///Standard.Kopfzeilen.Kopfzeilen()"
+ Standard = Bibliothek = "[Meine Makros & Dialoge].Standard"
+ Kopfzeilen = Modul = "Kopfzeilen"
+ Kopfzeilen() = Makro (im Modul "Kopfzeilen")
Wenn Du das Makro in der BASIC-IDE nicht in einem Modul abspeicherst,
dann nur: SET M="macro:///Standard.Kopfzeilen()"
[3.3] CALC.ods
Siehe [2.2] !
[3.4] WRITER.odt
Siehe [3.2] !
[3.5] Download-Link
https://www.magentacloud.de/share/r8eyn.v.s0
enthält:
Kopfzeilen.txt
Kopzeilen.cmd
WRITER.odt
CALC.ods
[4] Marko-Code
Dies nur zur Vorschau. Der eMail-Server wird wohl wieder
aufeinanderfolgende Leerzeichen reduzieren, wodurch die Struktur
vermurkst wird. Deshalb besser "Kopfzeilen.txt" anschauen und nutzen,
aber für einen ersten Einblick reicht das schon:
Sub Kopfzeilen
Dim AAM as Integer ' Anzahl Arrayelemente Maximum
Dim ASM as Integer ' Anzahl Seiten Maximum
Dim AFGR as String ' Absatz Formatierung Gerade Rechtsbündig
Dim AFUL as String ' Absatz Formatierung Ungerade Linksbündig
Dim DAC as String ' Datei Art CALC
Dim DAW as String ' Datei Art WRITER
Dim DC as String ' Document CALC: "" =
interaktive Dateiauswahl
' "/'pfad'/'datei'" = keine
ineraktive Dateiauswahl
Dim DF as String ' Dialog Form: "B" = Betriebssystem
' "O" = Office
Dim DTC as String ' Dialog Text CALC
Dim DTW as String ' Dialog Text WRITER
Dim DW as String ' Document WRITER: "" =
interaktive Dateiauswahl
' "/'pfad'/'datei'" = keine
ineraktive Dateiauswahl
AAM = 10
ASM = 240
AFGR = "_Gl_Text-8_pt_Kopf_Gerade_Rechts bündig"
AFUL = "_Gl_Text-8_pt Kopf_Ungerade_Links bündig"
DAC = "ods"
DAW = "odt"
DC = ""
DF = "O"
DTC = "Bitte die Datei ""CALC.ods"" auswählen ..."
DTW = "Bitte die Datei ""WRITER.odt"" auswählen ..."
DW = ""
Dim oDC as Object ' [object] Document CALC
Dim oDW as Object ' [object] Document WRITER
Dim oCC as Object ' [object] Current Controller
Dim oVC as Object ' [object] View Cursor
Dim aKTLS ' [array] Kopfzeilen Texte Linke Seite
Dim aKTRS ' [array] Kopfzeilen Texte Rechte Seite
Dim idxA as Integer ' [index] A
Dim idxB as Integer ' [index] B
Dim AAF as String ' Aktuelles Absatz Format
Dim BE as String ' Benutzer Eingabe
Dim KT as String ' Kopfzeilen Text
Dim aPVDW(0) as New com.sun.star.beans.PropertyValue ' [array]
Property Value Document WRITER
Dim aPVDC(0) as New com.sun.star.beans.PropertyValue ' [array]
Property Value Document CALC
' Nur für Testzwecke zur interaktiven Festlegung der
Dateiauswahl-Dialogform ============
BE = UCase(InputBox("B = Dateiauswahl-Dialogform Betriebssystem"
& Chr(10) &_
"O = Dateiauswahl-Dialogform Office"
& Chr(10) &_
" "
& Chr(10) &_
"Bitte Eingabe:"))
If ((BE = "B") Or (BE = "O")) Then
DF = BE
Else
MsgBox ("Die Dateiauswahl-Dialogform """ & BE & """ ist nicht
erlaubt." & Chr(10) &_
"Das Makro wird beendet.")
End
End If
'
=======================================================================================
BE = InputBox("1 = Kopfzeilen erstellen" & Chr(10) &_
"2 = Kopfzeilen löschen" & Chr(10) &_
"3 = Makro abbrechen" & Chr(10) &_
" " & Chr(10) &_
"Bitte Eingabe:")
Select Case BE
' Kopfzeilen bearbeiten:
Case "1","2"
' Dateiauswahl anzeigen, da kein Pfad/Datei wurde vorbelegt
(s.o.):
If (DW = "") Then
DW = DateiAuswahl(DTW,DAW,DF)
End If
aPVDW(0).name = "Hidden"
aPVDW(0).value = False
oDW =
StarDesktop.loadComponentFromURL(ConvertToURL(DW),"_blank",0,aPVDW())
oDW = ThisComponent
oCC = oDW.CurrentController
oVC = oCC.getViewCursor
oVC.jumpToPage(2)
' Kopfzeilen erstellen
If (BE = "1") Then
' Dateiauswahl anzeigen, da kein Pfad/Datei vorbelegt
Wurde (s.o.):
If (DC = "") Then
DC = DateiAuswahl(DTC,DAC,DF)
End If
aPVDC(0).name = "Hidden"
aPVDC(0).value = False
oDC =
StarDesktop.loadComponentFromURL(ConvertToURL(DC),"_blank",0,aPVDC())
aKTRS() =
oDC.Sheets().getByName("KopfZeilenTexte").getCellRangeByName("A1:B10").getDataArray()
aKTLS() =
oDC.Sheets().getByName("KopfZeilenTexte").getCellRangeByName("A11:B20").getDataArray()
oDC.Close(True)
For idxA = 0 To AAM-1 Step 1
For idxB = 0 to ASM/AAM Step 1
AAF = IIf(oVC.Page Mod 2 = 0,AFGR,AFUL)
KT = IIf(oVC.Page Mod 2 = 0,
aKTRS(idxA)(1),aKTLS(idxA)(1))
With oVC
.jumpToStartOfPage(False)
.ParaStyleName = AAF
.gotoEndOfLine(true)
.String = KT
.collapseToEnd
.collapseToStart
.jumpToNextPage
End With
Next idxB
Next idxA
' Kopfzeilen löschen:
Else
For idxA = 0 To AAM-1 Step 1
For idxB = 0 to ASM/AAM Step 1
AAF = IIf(oVC.Page Mod 2 = 0,AFGR,AFUL)
With oVC
.jumpToStartOfPage(False)
.ParaStyleName = AAF
.gotoEndOfLine(true)
.String = ""
.collapseToEnd
.collapseToStart
.jumpToNextPage
End With
Next idxB
Next idxA
End If
' Makro abbrechen:
Case "3"
End
' Nicht erlaubte Benutzereingabe:
Case Else
MsgBox("Die Eingabe """ & BE & """ ist nicht erlaubt." &
Chr(10) &_
"Das Makro wird beendet.")
End
End Select
End Sub
Function DateiAuswahl(DT as String,DA as String,DF as String) as String
' DT = Dialog Titel | beliebiger Text
' DA = Datei Art | "odt" = WRITER-Datei
' | "ods" = CALC -Datei
' DF = DialogForm | "B" = Betriebssystem [
"com.sun.star.ui.dialogs.FilePicker" ]
' | "O" = Office [
"com.sun.star.ui.dialogs.OfficeFilePicker" ]
Dim oFP as Object ' [object] File Picker
Dim aD() as String ' [array] Dateien
Dim US as String ' Uno Service
If (DF = "B") Then
US = "com.sun.star.ui.dialogs.FilePicker"
ElseIf (DF = "O") Then
US = "com.sun.star.ui.dialogs.OfficeFilePicker"
Else
MsgBox("Die Dialogart """ & DF & """ ist nicht erlaubt." &
Chr(10) &_
"Das Makro wird beendet.")
End
End If
oFP = createUnoService(US)
oFP.Title = DT
If (oFP.execute() = 1) Then
aD = oFP.getFiles()
DateiAuswahl = aD(0)
If (Mid(DateiAuswahl,Len(DateiAuswahl)-2,3) <> DA) Then
MsgBox("Sie haben keine Datei mit der Endung """ & DA & """
ausgewählt:" & Chr(10) &_
"Ausgewählte Datei: " &
DateiAuswahl & Chr(10) &_
"Das Makro wird beendet.")
End
End If
Else
MsgBox("Sie haben keine Datei ausgewählt." & Chr(10) &_
"Das Makro wird beendet.")
End
End If
End Function