Macro für Füllwörter

Das Textverarbeitungsprogramm

Moderator: Moderatoren

Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Macro für Füllwörter

Beitrag von Stephan »

Hat zufällig jemand hier eine Idee, ob und wie sich sowas mit Macros realisieren lässt?

indem Du die Wörter per Makro suchst und einfärbst? (sonst verstehe ich die Frage nicht)

warum verwendest Du nicht einfach Auto-Ersetzung?


Gruß
Stephan
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Macro für Füllwörter

Beitrag von komma4 »

eine kleine Sonntags-Übung...
war gar nicht so schwer :-)

Code: Alles auswählen

REM  *****  BASIC  *****
' 20070909
' http://de.openoffice.info/viewtopic.php?f=1&t=13889
Private oDok as Object
Private oSuchBeschr as Object
Private iLogNr, iDateiNr


Sub writer_markierenFuellwort
sMakroName = "writer_markierenFüllwort"

' Konstante zur Angabe der FüllWortListe
cFWL = "/zentrale/2007/Füllwort.Liste"

' Konstante für Log
cFWLLOG = "/zentrale/2007/Füllwort.Liste.Log"

' Aufruf aus einem Writer-Dokument?
oDok = ThisComponent
if Not oDok.supportsService(_
      "com.sun.star.text.TextDocument" ) Then
	Msgbox "Dieses Makro muss von einem aus Writer-Dokument aufgerufen werden",, sMakroName
	exit sub
end if

' Liste der Füllworte vorhanden?
if Not FileExists( cFWL ) then 
	Msgbox "Füllwort.Liste nicht gefunden; erwartete Datei: " & cFWL ,, sMakroName
	exit sub
end if

' Ausgabe der Fundstellen in Log
iLogNr = FreeFile
Open cFWLLog For OUTPUT AS iLogNr

' Lesen der Textdatei
iDateiNr = FreeFile
Open cFWL For INPUT as iDateiNr

' init der Suche
initSuchBeschr

' Suchen-Schleife für jedes Wort
While Not EOF( #iDateiNr ) 
 Line Input #iDateiNr, sFW
 markFW( sFW ) 
Wend

Close #iDateiNr
Close #iLogNr

End Sub


Sub markFW( sFW as String ) 
oSuchBeschr.SearchString =  sFW
oAlleStellen = oDok.findAll( oSuchBeschr )

Print #iLogNr, sFW & ": " & oAlleStellen.getCount() 

For i = 0 to oAlleStellen.getCount() - 1
 oGefunden = oAlleStellen.getByIndex( i )
 oGefunden.CharColor = RGB( 255, 0, 0 )
 oGefunden.CharWeight = com.sun.star.awt.FontWeight.BOLD
Next 

End Sub

Sub initSuchBeschr
oSuchBeschr = oDok.createSearchDescriptor()
With oSuchBeschr
 .SearchRegularExpression = FALSE
 .SearchCaseSensitive = FALSE
End With

End Sub
Die Inhalte der Konstanten für die Wortliste und das Log müssen natürlich angepasst werden.
Hilft das?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Macro für Füllwörter

Beitrag von komma4 »

Im Code sind die beiden Konstanten (konstant=sie ändern sich nicht während des Programmablaufs) cFWL und cFWLLog mit den Namen meiner Testdateien gesetzt: die Inhalte musst Du auf Deine Dateien umschreiben.

Als Wortliste habe ich eine Textdatei, mit einem "Suchbegriff" pro Zeile erstellt (damit gehen auch zusammengesetzte Füllworte, wie "aber auch"). Deren Namen (Pfad und Dateinamen) kommt in cFWL

In der Datei, welche durch den Namen in der Konstanten cFWLLog bestimmt wird, schreibt das Makro die gesuchten Füllworte und deren Anzahl rein.

Kommst Du damit zurecht?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Macro für Füllwörter

Beitrag von komma4 »

Da eine solche Funktion vielleicht öfter gebraucht wird - habe ich das Ding auf die Website gestellt:
Füllwort-Liste

Kleinere Änderungen zur geposteten Version:

Dateinamen der untersuchten Datei und der Wortliste, sowie Datum und Uhrzeit der Untersuchung wird nun ins LOG geschrieben.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
majcho
Beiträge: 5
Registriert: Di, 11.09.2007 23:19

Re: Macro für Füllwörter

Beitrag von majcho »

Das Makro http://www.re-solutions.de/ooo/makros/g ... artOOO.odt funktioniert bestens. Habe leider auch nur bedingte Programmiertkenntnisse und könnte mir folgende Funktionserweiterung als sehr hilfreich vorstellen:

Wie könnte ein Füllwort durch ein anderes ersetzt werden?

aber = jedoch
nicht schlecht = gut
weißer Schimmel = Schimmel
nix = ""

So würde in der angegebenen Reihenfolge das Wort aber durch jedoch ersetzt. Folgt hinter dem = ein "" so wird das Wort gelöscht. Könnten Sie den Quellode ergänzen?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Macro für Füllwörter

Beitrag von komma4 »

majcho hat geschrieben:Das Makro http://www.re-solutions.de/ooo/makros/g ... artOOO.odt funktioniert bestens.
Das freut mich.
Ich hoffe, auch das Füllwort-Liste Makro funktioniert wie gewünscht.
majcho hat geschrieben:Habe leider auch nur bedingte Programmiertkenntnisse
Das kann doch schon reichen...
majcho hat geschrieben:folgende Funktionserweiterung
Das ist keine Erweiterung, sondern ein völlig neuer Zweck....

Lese die Textdatei in zwei Variable (vor und hinter einem Trennzeichen) und verwende den [url=file://opt/openoffice.org2.3_sdk/docs/DevelopersGuide/Text/Text.xhtml#1_3_3_3_Search_and_Replace]ReplaceDescriptor[/url] anstelle des SearchDescriptors

Hilft das?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
majcho
Beiträge: 5
Registriert: Di, 11.09.2007 23:19

Re: Macro für Füllwörter

Beitrag von majcho »

Das Füllwörter-Makro meinte ich. Den SearchDescriptor habe ich durch den ReplaceDescriptor ersetzt. Es gelingt mir jedoch kein anständigen Code hinzubekommen. Vor allem mit einer Schleife, mit dem bloßen aufzeichnen eines Makros ist das nicht möglich. Werde wohl eine Weile knobeln und dabei auch lernen.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Macro für Füllwörter

Beitrag von komma4 »

majcho,
wenn Du Probleme mit Deinem Code hast, dann solltest Du uns diesen zeigen (in einem neuen Posting im BASIC-Bereich des Forums, mit aussagekräftigem Betreff). An welcher Stelle tritt welches Fehlverhalten auf?

Deine ursprüngliche Aufgabenstellung war ein "automatische Ersetzung anhand einer Ersetzungsliste", right? Du hast die Eigenschaften des ReplaceDescriptors neu gesetzt und die Datei mit den Such-/Ersatzbergriffen korrekt ausgelesen und den Variablen zugewiesen?

Zum Lernen von BASIC siehe die
Informationen zur StarBasic-Programmierung

Bis später...
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
majcho
Beiträge: 5
Registriert: Di, 11.09.2007 23:19

Re: Macro für Füllwörter

Beitrag von majcho »

Sorry, wenn ich in diesen Thread den "Ersetzungsvorgang" für Füllwörter fortsetze, immerhin geht es noch um Füllwörter.

Mir ist zumindest der Ersetzungsvorgang durch "" (=Füllwort löschen) gelungen. Aber wie lese ich die zweite Variable aus der Textdatei hinter dem Trennzeichen (in dem Fall das Gleichheitszeichen "=" )?

Code: Alles auswählen

REM  *****  BASIC  *****

Private oDok as Object
Private oSuchBeschr as Object
Private oErsetzBeschr as Object
Private iDateiNr

Sub ocm_ersetzenFuellwort
sMakroName = "ocm_ersetzenFüllwort"
sMakroVersion = "1.0.0"
sMakroDatum = "2007-12-26"

' Konstante zur Angabe der FüllWortListe
cFWL = "Bereinigungsmakro/Füllworte.Liste"

' laden zum Nutzen von Standardfunktionen
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )

' Aufruf aus einem Writer-Dokument?
oDok = ThisComponent
if Not oDok.supportsService(_
  "com.sun.star.text.TextDocument" ) Then
   Msgbox "Dieses Makro muss von einem aus Writer-Dokument aufgerufen werden",, sMakroName
   exit sub
end if

' Liste der Füllworte vorhanden?
if Not FileExists( cFWL ) then
   Msgbox "Füllwort.Liste nicht gefunden; erwartete Datei: " & cFWL ,, sMakroName
   exit sub
end if

' Lesen der Textdatei
iDateiNr = FreeFile
Open cFWL For INPUT as iDateiNr

' init der Suche
FWL_initErsetzSuchBeschr

' Suchen-Schleife für jedes Wort
While Not EOF( #iDateiNr )
 Line Input #iDateiNr, sFW
 FWL_ersetzFW( sFW )
Wend

Close #iDateiNr

End Sub

Sub FWL_ersetzFW( sFW as String )

oSuchBeschr.SearchString =  sFW
oSuchBeschr.ReplaceString = ""
oDok.replaceAll( oSuchBeschr )

End Sub

Sub FWL_initErsetzSuchBeschr
oSuchBeschr = oDok.createReplaceDescriptor()
With oSuchBeschr
 .SearchRegularExpression = FALSE
 .SearchCaseSensitive = FALSE
End With

End Sub
P.S.: Ich bin immer noch OOo-Basic-Anfänger, sodass der Code nicht gänzlich optimal ist.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Macro für Füllwörter

Beitrag von komma4 »

Anfänger zu sein ist keine Schande.
Schau'n 'mer ma
aber = jedoch
nicht schlecht = gut
weißer Schimmel = Schimmel
nix = ""
Durch die Anweisung zum Einlesen einer Zeile erhälst Du Such- und Ersetzungsbegriff, durch das Trennzeichen getrennt.
( in der letzten Zeile lasse einfach die Anführungszeichen weg ).

Die Funktion SPLIT teilt Dir eine solche Zeile in Bestandteile; sie gibt ein Array zurück, das Du zuvor deklarierst:

Code: Alles auswählen

Dim aZeilenTeil( 0 to 1 ) as String
Zur Klarstellung verwendest Du eine neue Variable im Code:

Code: Alles auswählen

Line Input #iDateiNr, sZeile
und teilst anschliessend in 2 Bestandteile, und verteilst sie auf die Variablen für 'Füllwort' und 'Ersatzbegriff':

Code: Alles auswählen

aZeilenTeil() = SPLIT( sZeile, "=", 2 )
sFW = aZeilenTeil(0)
' Ersatzbegriff
sEB = aZeilenTeil(1)
FWL_ersetzFW( sFW , sEB )

' ....

' Ersetzen Füllwort Routine
' 
Sub FWL_ersetzFW( sSuch as String , Optional sErsetz as String )
oSuchBeschr.SearchString =  sSuch
if isMissing( sErsetz ) then
 oSuchBeschr.ReplaceString = ""
else
 oSuchBeschr.ReplaceString = sEreetz
end if
oDok.replaceAll( oSuchBeschr )

Bei Fragen zum Code: fragen!
Hilft das?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
majcho
Beiträge: 5
Registriert: Di, 11.09.2007 23:19

Re: Macro für Füllwörter

Beitrag von majcho »

komma4 hat geschrieben:
Durch die Anweisung zum Einlesen einer Zeile erhälst Du Such- und Ersetzungsbegriff, durch das Trennzeichen getrennt.
( in der letzten Zeile lasse einfach die Anführungszeichen weg ).

Die Funktion SPLIT teilt Dir eine solche Zeile in Bestandteile; sie gibt ein Array zurück, das Du zuvor deklarierst:

Code: Alles auswählen

Dim aZeilenTeil( 0 to 1 ) as String

Bei Fragen zum Code: fragen!
Hilft das?

Den Text einer Variable zu übergeben und einfach durch SPLIT() aufzuteilen ist genial einfach. Leider verhakte sich dann der Code an der Zeile

Code: Alles auswählen

sEB = aZeilenTeil(1)
und teilte mir mit
Unzulässiger Wert oder Datentyp.
Index außerhalb des definierten Bereichs
Ich vermute es hängt dan der Zahl 0, 1 oder 2 innerhalb der Schleife

hier der gesamte Code:

Code: Alles auswählen

REM  *****  BASIC  *****

Private oDok as Object
Private oSuchBeschr as Object
Private oErsetzBeschr as Object
Dim aZeilenTeil( 0 to 1 ) as String
Private iDateiNr


Sub ocm_ersetzenFuellwort
sMakroName = "ocm_ersetzenFüllwort"
sMakroVersion = "1.0.1"
sMakroDatum = "2007-12-28"

' Konstante zur Angabe der FüllWortListe
cFWL = "/Bereinigungsmakro/Füllworte.Liste"

' laden zum Nutzen von Standardfunktionen
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )


' Aufruf aus einem Writer-Dokument?
oDok = ThisComponent
if Not oDok.supportsService(_
  "com.sun.star.text.TextDocument" ) Then
   Msgbox "Dieses Makro muss von einem aus Writer-Dokument aufgerufen werden",, sMakroName
   exit sub
end if

' Liste der Füllworte vorhanden?
if Not FileExists( cFWL ) then
   Msgbox "Füllwort.Liste nicht gefunden; erwartete Datei: " & cFWL ,, sMakroName
   exit sub
end if



' Lesen der Textdatei
iDateiNr = FreeFile
Open cFWL For INPUT as iDateiNr

' init der Suche
FWL_initErsetzSuchBeschr

' Suchen-Schleife für jedes Wort
While Not EOF( #iDateiNr )
 Line Input #iDateiNr, sZeile
 aZeilenTeil() = SPLIT( sZeile, "=", 2 )
 sFW = aZeilenTeil(0)
' Ersatzbegriff
 sEB = aZeilenTeil(1)
 FWL_ersetzFW( sFW , sEB )
Wend

Close #iDateiNr


End Sub


' Ersetzen Füllwort Routine

Sub FWL_ersetzFW( sSuch as String , Optional sErsetz as String )
 oSuchBeschr.SearchString =  sSuch
if isMissing( sErsetz ) then
 oSuchBeschr.ReplaceString = ""
else
 oSuchBeschr.ReplaceString = sEretz
end if
 oDok.replaceAll( oSuchBeschr )
End Sub


Sub FWL_initErsetzSuchBeschr
oSuchBeschr = oDok.createReplaceDescriptor()
With oSuchBeschr
 .SearchRegularExpression = False
 .SearchCaseSensitive = True
End With


End Sub
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Macro für Füllwörter

Beitrag von komma4 »

nur kurz (mein Flieger geht in ein paar Stunden):

abgesehen vom Tippfehler
oSuchBeschr.ReplaceString = sEretz

habe ich die Dateischleife schonmal falsch aufgesetzt, korrekt wäre:

* Leseversuch

* Schleife: wenn nicht EOF, bearbeiten
* nächste Zeile lesen
* Ende der Schleife

Code: Alles auswählen

' erste Zeile ?
Line Input #iDateiNr, sZeile
' Suchen-Schleife für jedes Wort
While Not EOF( #iDateiNr )
  ' hier bearbeiten
  ' ...
  ' 
  ' dann weiter lesen
  Line Input #iDateiNr, sZeile
Wend
Die Fehlermeldung erhalte ich hier nur, wenn ich die Variablennamen falsch schreibe.
Du musst Deinen Code also debuggen (mit PRINT Anweisungen Variableninhalte ausgeben) um die Fehlerstelle zu finden...
Lasse Dir die sZeile anzeigen nach dem lesen...

Viel Erfolg - ich bin dann mal weg.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
Arran
***
Beiträge: 90
Registriert: Mi, 11.04.2007 19:06
Wohnort: Isle of Arran, Schottland
Kontaktdaten:

Re: Macro für Füllwörter

Beitrag von Arran »

Hallo Ihr Makrospezialisten.

Das ist ein Gebiet, von dem ich schon viel gehört, aber eigentlich noch nie bewusst angewendet habe. Somit besitze ich auch nicht die geringste Erfahrung mit Makros, nicht mal mit der Anwendung.

Das hier vorgestellte Makro wirklich bemerkenswert, das vor allem meine Frau auch anwenden sollte. Nun habe ich zwei Fragen:

1. Ist es egal, wo auf dem Computer diese beiden Füllwortlisten abgelegt sind? Oder gibt es bestimmte Ordner, wo solche Dateien hinein müssen?

2. Via Extras --> etc. komme ich dann auf den Makro. Dort wird mit im rechten Kasten drei Dateien angezigt. Welches ist die richtige, die angeklickt werden muss?

Vielen Dank für eine gelegentliche Antwort. Inzwiwschen Schöne Festtage!!!

Arran
Herzliche Grüsse von Schottlands schönster Ferieninsel

Betriebssystem: Linux Mint Debian Edition, Grafikkarte: Nvidia I-8400-GS, Monitor: HP LP2065, drehbar, Prozessor: Intel 3core. Abgesehen davon, zeimlich gesund.
majcho
Beiträge: 5
Registriert: Di, 11.09.2007 23:19

Re: Macro für Füllwörter

Beitrag von majcho »

Arran hat geschrieben: 1. Ist es egal, wo auf dem Computer diese beiden Füllwortlisten abgelegt sind? Oder gibt es bestimmte Ordner, wo solche Dateien hinein müssen?
Das ist völlig egal wo die Datei Füllwörter.Liste abgelegt ist. Die Datei kann auch Füllwörter.txt lauten. Jedoch ist die Schreibweise des Dateiortes im Code eine andere als unter Windows. Der Code dazu lautet z.B.:

Code: Alles auswählen

cFWL =  "c:/Dokumente/Füllwörter.txt"
Arran hat geschrieben: 2. Via Extras --> etc. komme ich dann auf den Makro. Dort wird mit im rechten Kasten drei Dateien angezigt. Welches ist die richtige, die angeklickt werden muss?
Die erste und obere der drei Dateien.
Antworten