Hallo Hans-Werner,
vielen Dank für das fertige Makro!
mit freundlichem Gruss
Martin
Am 23.10.2018 um 10:46 schrieb OoOHWHOoO:
Hallo Martin,
da hast Du natürlich Recht. Sorry, da hatte ich nicht genau das
Ergebnis kontrolliert.
Ich habe das Makro entsprechend angepasst ohne dabei Deine
Makro-Grundidee zu verändern:
+ Ich habe ein ARRAY "arrayText" unbekannter Größe angelegt.
+ Die FRAME-Inhalte werden jetzt fortlaufend in die einzelnen
ARRAY-Elemente von "arrayText" abgespeichert.
+ Abschließend werden die ARRAY-Element-Inhalte von "arrayText" in
einer rückwärts laufenden Schleife nach "sText" abgespeichert.
+ "sText" wird wie gewohnt ausgegeben.
Zum Test habe ich 3 Text-Rahmen angelegt:
"-1- Heute ist ein schöner Tag !"
"-2- Heute ist ein schöner Tag !"
"-3- Heute ist ein schöner Tag !"
Alle 3 Texte werden komplett in richtiger Reihenfolge ausgegeben.
Hier das modifizierte Makro:
Sub DeleteFrameSaveText
' GELÖSCHT: Dim oViewCursor as object
' GELÖSCHT: Dim oText As Object
Dim arrayText() ' NEU: ARRAY unbekannter Größe anlegen
oDoc =ThisComponent
oTF = oDoc.getTextFrames
c = oTF.Count - 1
' GELÖSCHT: sText = " "
' GELÖSCHT: For i = 0 to c
iText = -1 ' NEU: INDEX-Variable für ARRAY vorbelegen
For i = c to 0 Step -1
thisF = oTF.getByIndex(i)
iText = iText + 1 ' NEU: INDEX-Variable für ARRAY hochzählen
ReDim Preserve arrayText(iText) ' NEU: Neues ARRAY-Element indizieren !
arrayText(iText) = thisF.String & chr(10) & chr(10) ' NEU:
FRAME-Inhalt an neues ARRAY-Element zuweisen
' GELÖSCHT: sText = sText & thisF.String & chr(10) & chr(10)
thisF.dispose()
Next
sText = "" ' NEU: STRING-Variable vorbelegen
For iText = Ubound(arrayText) To 0 Step -1 ' NEU: Schleife rückwärts
über ARRAY-Elemente
sText = sText & arrayText(iText) ' NEU: Inhalt aktuelles ARRAY-Element
an STRING-Variable
Next iText
' GELÖSCHT: oDoc =
StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank",
0, Array())
oViewCursor= thisComponent.GetCurrentController.ViewCursor
If IsEmpty(oViewCursor.Cell) Then
oText=thiscomponent.text
Else
oText=oViewCursor.Cell.Text
End If
oText.insertString(oViewCursor,sText,false)
End Sub
Gruß
Hans-Werner ;-))
------ Originalnachricht ------
Von: "Martin Jenniges" <martinjenniges@skynet.be>
An: users@de.libreoffice.org
Gesendet: 23.10.2018 09:26:46
Betreff: Re: [de-users] mangelhaftes Writer-Makro bezüglich Textrahmen
verbessern
Hallo Hans-Werner,
bei deiner Lösung wird aber der Text "in falscher Richtung"
zusammengeführt; vom letzten Rahmen + vorletztem Rahmen +
vorvorletztem Rahmen...
das lässt sich natürlich richtig rum programmieren ;-)
ich habe nur wenig Erfahrung mit Makroprogrammierung, ich schnippele
die aus dem Internet zusammen
viele Grüsse
Martin
Am 22.10.2018 um 18:11 schrieb OoOHWHOoO:
Hallo Martin,
na klar, so kann man es auch machen. Indem bei Deinem Makro nichts
gelöscht wird, kann die Schleife "vorwärts" laufen, weil keine
"INDEX-Verschiebungen" passieren.
Wenn Du sie "rückwärts" laufen lässt, musst Du nicht extra ein neues
Dokument anlegen.
Die beiden "Dim"s kannst Du Dir sparen, da die anderen Variablen
auch nicht ge"Dim"t sind. Wenn Du allerdings "Option Explicit"
nutzt, was man immer machen sollte, dann müssen alle Variablen
ge"Dim"t sein.
Mit "& chr(10) & chr(10)" anstatt "& chr(13)" hättest Du dann immer
noch eine Leerzeile dazwischen.
Sub DeleteFrameSaveText
' KOMMENTIERT: Dim oViewCursor as object
' KOMMENTIERT: Dim oText As Object
oDoc =ThisComponent
oTF = oDoc.getTextFrames
c = oTF.Count - 1
sText = " "
' KOMMENTIERT: For i = 0 to c
For i = c to 0 Step -1
thisF = oTF.getByIndex(i)
sText = sText & thisF.String & chr(10) & chr(10)
thisF.dispose()
Next
' KOMMENTIERT: oDoc =
StarDesktop.loadComponentFromURL("private:factory/swriter",
"_blank", 0, Array())
oViewCursor= thisComponent.GetCurrentController.ViewCursor
If IsEmpty(oViewCursor.Cell) Then
oText=thiscomponent.text
Else
oText=oViewCursor.Cell.Text
End If
oText.insertString(oViewCursor,sText,false)
End Sub
Gruß
Hans-Werner ;-))
------ Originalnachricht ------
Von: "Martin Jenniges" <martinjenniges@skynet.be>
An: users@de.libreoffice.org
Gesendet: 22.10.2018 17:21:26
Betreff: Re: [de-users] mangelhaftes Writer-Makro bezüglich
Textrahmen verbessern
Hallo Hans-Werner,
auch ich habe mir gedacht, dass das Löschen den Fehler verursacht.
ich habe mir das Makro folgendermassen aus dem Internet
zusammengesnippelt
Sub DeleteFrameSaveText
Dim oViewCursor as object
dim oText As Object
oDoc =ThisComponent
oTF = oDoc.getTextFrames
c = oTF.Count - 1
sText = " "
For i = 0 to c
thisF = oTF.getByIndex(i)
sText = sText & thisF.String & chr(13)
Next
oDoc = StarDesktop.loadComponentFromURL("private:factory/swriter",
"_blank", 0, Array())
oViewCursor= thiscomponent.GetCurrentController.ViewCursor
If IsEmpty(oViewCursor.Cell) Then
oText=thiscomponent.text
Else
oText=oViewCursor.Cell.Text
End If
oText.insertString(oViewCursor, sText,false)
End Sub
Jetzt liest das Makro nacheinander den Text der Rahmen in die
Variabel sText, erzeugt ein neues Writer-Dokument und fügt den
Inhalt von sText ein. Das genügt mir
mit freundlichem Gruss
Martin
Am 22.10.2018 um 15:57 schrieb OoOHWHOoO:
Hallo Martin,
die Fehlermeldung
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.lang.IndexOutOfBoundsException
Message: .
besagt wohl, dass via "thisF = oTF.getByIndex(i)" ein Element
indiziert wird, dass es bezüglich des Index nicht (mehr) gibt.
Ich vermute mal, dass durch das FRAME-Löschen ( thisF.dispose() )
der letzte Index ( bezüglich "oTF.getByIndex(i)" ) immer um 1
vermindert wird, die Schleife aber "zu weit" zählt.
Entschuldige bitte die etwas "holprige" Erläuterung, aber
bezüglich "FRAMEs löschen" habe ich keinerlei Erfahrung.
Lässt man die Schleife rückwärts laufen ( For i = c to 0 Step -1 )
funktioniert das Makro. Ich hatte über [Einfügen]>[Rahmen]>[Rahmen
interaktiv] 3 Rahmen in eine WRITER-Dokument eingefügt und jeweils
mit Text gefüllt. Nach Makro-Ausführung waren die Rahmen weg und
der Text direkt nacheinander in mehreren Zeilen aufgelistet:
Sub DeleteFrameSaveText
oDoc =ThisComponent
oTF = oDoc.getTextFrames
c = oTF.Count - 1
For i = c to 0 Step -1
thisF = oTF.getByIndex(i)
s = thisF.String
otc = oDoc.Text.createTextCursorByRange(thisF.Anchor)
otc.setString(s)
thisF.dispose()
Next
End Sub
Gruß
Hans-Werner ;-))
-- Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme?
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails:
https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy
-- Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme?
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy
--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.