Seite 1 von 1
felder per Makro in Text umwandeln
Verfasst: Fr, 15.09.2017 09:51
von chrischii
Hallo,
ich habe einen recht ungewöhnliches Problem, wo ich nicht weiterkomme.
Ich erstelle ein Dokument automatisiert, indem ich den Inhalt einer mysql in Felder schreibe (Einfügen-Feldbefehl-weiterer Feldbefehl).
Ich nutze den Inhalt der Felder auch für einiges, z.B. Dateinamenerzeugung beim Speichern,...
Nun würde ich gerne ein Makro schreiben, welches alle Felder löscht, deren Inhalt aber im Dokument als Text lässt. Händisch kann ich ja ein Feld markieren, kopieren, als unformatierter Text einfügen. Geht das auch irgendwie per Makro oder über eine Funktion für alle Felder gleichzeitig?
vg
christian
Re: felder per Makro in Text umwandeln
Verfasst: Fr, 15.09.2017 10:36
von Stephan
Geht das auch irgendwie per Makro oder über eine Funktion für alle Felder gleichzeitig?
Ja, aber nur wenn man weiß um was für Feldtypen es sich GANZ GENAU handelt.
Sollte es nur um Seriendruckfelder gehen, sollte Folgendes reichen:
Code: Alles auswählen
Sub Main
oEnum = ThisComponent.getTextFields().createEnumeration()
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
tmp = oField.CurrentPresentation
oField.getAnchor.String = tmp
Loop
End Sub
Gruß
Stephan
Re: felder per Makro in Text umwandeln
Verfasst: Mi, 20.09.2017 08:39
von chrischii
Hallo Stephan,
vielen Dank für die Antwort. Der Codeschnipsel tut nicht, wahrscheinlich falsche Feldtypen.
Ich nutze Datumsfelder, Bedingte Textfelder (Datenbankinhalt a führt zu Text b) und direkte Ausgabe der Datenbankinhalte (zB Adresse).
Wie kann ich denn den Feldtypen abfragen/herausfinden?
VG
Christian
Re: felder per Makro in Text umwandeln
Verfasst: Mi, 20.09.2017 09:02
von Stephan
Wie kann ich denn den Feldtypen abfragen/herausfinden?
lass sie Dir anzeigen mit:
Code: Alles auswählen
Sub Main
Dim alle()
oEnum = ThisComponent.getTextFields().createEnumeration()
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
If UBOUND(alle()) = -1 Then
Redim alle(0)
alle(0) = oField.SupportedServiceNames(0)
Else
gefunden = 0
For i = 0 To UBOUND(alle())
If alle(i) = oField.SupportedServiceNames(0) Then
gefunden = 1
Exit For
End If
Next i
If gefunden = 0 Then
tmp = UBOUND(alle())
Redim Preserve alle(tmp+1)
alle(tmp+1) = oField.SupportedServiceNames(0)
End If
End If
Loop
For i = 0 to UBOUND(alle())
k = k & alle(i) & CHR(13)
Next i
Msgbox k
End Sub
Gruß
Stephan
Re: felder per Makro in Text umwandeln
Verfasst: Mi, 20.09.2017 09:33
von chrischii
Hallo Stephan,
ein weiterer Dank.
Habe anscheinend doch mehr als gedacht
com.sun.star.text.TextField.DateTime
com.sun.star.text.TextField.PageNumber
com.sun.star.text.TextField.ConditionalText
com.sun.star.text.TextField.PageCount
com.sun.star.text.TextField.ExtendedUser
com.sun.star.text.TextField.Database
com.sun.star.text.TextField.User
Aber alles TextField. Somit sollte doch Dein Codeschnipsel tun, oder?
vg
Re: felder per Makro in Text umwandeln
Verfasst: Mi, 20.09.2017 09:42
von Stephan
Aber alles TextField. Somit sollte doch Dein Codeschnipsel tun, oder?
Nein, die Felder werden nicht alle gleich behandelt.
Das hier wandelt spezifisch nur die Datenbank-Felder in Text um (darum geht es Dir doch weiterhin?):
Code: Alles auswählen
Sub Main2()
oEnum = ThisComponent.getTextFields().createEnumeration()
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
If oField.supportsService("com.sun.star.text.TextField.Database") Then
tmp = oField.CurrentPresentation
oField.getAnchor.String = tmp
End If
Loop
End Sub
Gruß
Stephan
Re: felder per Makro in Text umwandeln
Verfasst: Mi, 20.09.2017 10:04
von chrischii
hmmm, nun kommt
BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: CurrentPresentation"
Re: felder per Makro in Text umwandeln
Verfasst: Mi, 20.09.2017 10:21
von Stephan
CurrentPresentation ist der aktuell im Datenbank-Feld sichtbare Text. Ich habe nicht die geringste Ahnung weshalb da jetzt eine Fehlermeldung kommt.
1.
nenne Deine genaue OpenOffice- oder LibreOffice-Programmversion
2.
Lade einen Screenshot dieses Meldungsfensters hoch:
Code: Alles auswählen
Sub Main2()
oEnum = ThisComponent.getTextFields().createEnumeration()
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
If oField.supportsService("com.sun.star.text.TextField.Database") Then
Msgbox oField.dbg_properties
Exit Sub
End If
Loop
End Sub
Gruß
Stephan
Re: felder per Makro in Text umwandeln
Verfasst: Mi, 20.09.2017 11:35
von chrischii
vielen Dank für Deine Mühen, das meine ich wirklich so.
hier der Output
Properties of object "SwXTextField":
SbxBOOL IsVisible;
SbxLONG AnchorType;
SbxLONG TextWrap;
SbxARRAY AnchorTypes;
SbxLONG NumberFormat;
SbxSTRING Content;
SbxSTRING CurrentPresentation;
SbxBOOL DataBaseFormat;
SbxSTRING FieldCode;
SbxINTEGER IsFieldDisplayed;
SbxSINGLE IsFieldUsed;
SbxOBJECT Anchor;
SbxOBJECT TextFieldMaster;
SbxSTRING ImplementationName;
SbxARRAY SupportedServiceNames;
SbxOBJECT PropertySetInfo;
SbxARRAY Types;
SbxARRAY ImplementationId;
SbxSTRING Dbg_SupportedInterfaces;
SbxSTRING Dbg_Properties;
SbxSTRING Dbg_Methods
LibreOffice Version: 5.3.6.1
Build-ID: 686f202eff87ef707079aeb7f485847613344eb7
CPU-Threads: 8; BS-Version: Windows 6.2; UI-Render: Standard; Layout-Engine: neu;
Gebietsschema: de-DE (de_DE); Calc: group
Re: felder per Makro in Text umwandeln
Verfasst: Mi, 20.09.2017 11:49
von Stephan
LibreOffice
das war zu ahnen
hier der Output
naja, dann ist es "Content"
(wieder mal 'tolle' Leistung von LO, Motto: "Raider ... äh "CurrentPresentation" heißt jetzt "Content", sonst ändert sich nix" - genauer gesagt, gibt es beide Eigenschaften schon immer, nur offensichtlich ist plötzlich die Funktion anders und man fragt sich warum. Offiziell dokumentiert ist nichts für LO 5.3.x und in LO 5.1.x funktioniert CurrentPresentation noch, siehe: https://api.libreoffice.org/docs/idl/re ... f749e5daf9 (wie auch bei OpenOffice (alle Versionen) siehe: https://www.openoffice.org/api/docs/com ... esentation))
Es sollte somit funktionieren:
Code: Alles auswählen
Sub Main2()
oEnum = ThisComponent.getTextFields().createEnumeration()
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
If oField.supportsService("com.sun.star.text.TextField.Database") Then
tmp = oField.Content
oField.getAnchor.String = tmp
End If
Loop
End Sub
Gruß
Stephan
Re: felder per Makro in Text umwandeln
Verfasst: Mi, 20.09.2017 12:34
von chrischii
vielen Dank, nun tut es