alte Dokumente unlesbar (Codierung?)

Hallo Rainer,

anbei ein iterativer "in einem Rutsch"-Lösungsvorschlag für die "odt"-Dateien.

(A) TEST-BEISPIEL

[1] In dem Verzeichnis "E:/TMP/ODT/" sind die zu modifizierenden "odt"-Dateien "ODT_1.odt", "ODT_2.odt" und "ODT_3".

[2] Alle drei Dateien enthalten jeweils die Zeichenfolge "ÄÖÜäöüß".

[3] Das Makro "SearchAndReplace" (Thomas' Makro leicht modifiziert) befinde sich in "macro:///Standard.Module1.SearchAndReplace".

[4] Das PERL-Programm

[4.1] speichert alle Dateinamen im Verzeichnis "E:/TMP/ODT/" in ein Array.
[4.2] arbeitet in einer Schleife das Array ab und bearbeitet auf diese Weise jede "odt"-Datei mit dem Makro.

[5] Nach Beendigung des PERL-Programms enthalten alle drei Dateien jeweils die Zeichenfolge "AeOeUeaeoeuess" gemäß Such- ("aSearch") und Ersetzungsvorschrift ("aReplace") im Makro.

(B) ANWENDUNG

[1] Du musst lediglich in "aSearch" die zu suchenden und in "aReplace" die zu ersetzenden Zeichen eintragen und dann das PERL-Programm starten, wodurch ALLE "odt"-Dateien im Verzeichnis bearbeitet werden.

[2] Anschließend kannst Du dann mal schauen, ob es noch "falsche Zeichen" in den "odt"-Dateien gibt. Wenn ja, ergänzt Du einfach "aSearch" und "aReplace" entsprechen und startest das PERL-Programm erneut.

[3] Punkt [2] musst Du dann so oft ausführen, bis alle "odt"-Dateien bereinigt sind.

[4] Die Pfade im PERL-Programm musst Du entsprechen Deiner Systemumgebung anpassen.

[5] Alternativ kann man das PERL-Programm auch durch ein entsprechendes BASH-Skript ersetzen. Kann ich leider nicht anbieten, da meine Systemumgebung "Windows 10" ist.

Grüße
Hans-Werner ;-))

(C) MAKRO

Sub SearchAndReplace(ODT as String)

Dim aSearch()
Dim aReplace()
Dim oD as Object
Dim aD() as Variant

aSearch = array("Ä" ,"Ö" ,"Ü" ,"ä" ,"ö" ,"ü" ,"ß")
aReplace = array("Ae","Oe","Ue","ae","oe","ue","ss")

Dim aPV(0) as New com.sun.star.beans.PropertyValue
aPV(0).name = "Hidden"
aPV(0).value = True
oD = StarDesktop.loadComponentFromURL(ConvertToURL(ODT),"_blank",0,aPV())

For i = 0 to ubound(aSearch)

oReplace = oD.CreateReplaceDescriptor
With oReplace
.SetSearchString(aSearch(i))
.SetReplaceString(aReplace(i))
.SearchCaseSensitive = True
End With
oD.replaceAll(oReplace)

Next

oD.StoreAsURL(ConvertToURL(ODT),aD())
oD.Close(False)

End Sub

(D) PERL

use strict;
use warnings;
use File::Find;

my @A; # Array
my $D; # Directory
my $I; # Index
my $L; # LibreOffice
my $M; # Macro
my $S; # String

$D = "E:/TMP/ODT/";
$L = "C:/Program Files/LibreOffice/program/soffice.exe";
$S = "macro:///Standard.Module1.SearchAndReplace";

find(sub{push @A,$File::Find::name if -f },$D);

for ($I=0;$I <= $#A;$I++) {
$M = $S."(".$A[$I].")";
`"$L" --nologo "$M"`;
}

Hallo Hans-Werner,

wenn ich mir Deine Vorschläge und das hier ansehe:

https://wiki.ubuntuusers.de/Perl/

muss ich wohl passen. Übersteigt meine Kompetenz. Einzig das hier wäre
für mich vermutlich ein Weg:

[5] Alternativ kann man das PERL-Programm auch durch ein
entsprechendes BASH-Skript ersetzen. Kann ich leider nicht anbieten,
da meine Systemumgebung "Windows 10" ist.

Vielleicht weiß ein Linuxer hier, wie das Skript aussehen müsste
(eines, das sich für die Stapelverarbeitung idealerweise des nun
vorhandenen Makros bedient)?

Viele Grüße

Rainer

Hallo Rainer,

das kann ich schon verstehen. Es war eine schnelle Lösung mit PERL.

Ich habe jetzt mal Thomas' Marko-Idee aufgegriffen und so modifiziert, dass bei einmaligem Aufruf alle "odt"-Dateien im Verzeichnis bearbeitet werden.

[1] Ich habe Dir das Makro auch an Deine private Email-Adresse gesendet mit Dateianhang "SuchenUndErsetzenInAllenDateien.txt". In der eMail (hier) gehen immer die Leerzeichen-Einrückungen und somit auch die Struktur verloren. Kopiere das Makro aus der Datei "SuchenUndErsetzenInAllenDateien.txt"bei Dir nach "Module1".

[2] Lege ein Verzeichnis (beispielsweise ".../ODT/") an und trage den kompletten Pfad im Makro ein:

dODT = "E:\TMP\ODT\"
ersetzen durch
dODT = "deine vollständige pfadangabe"

[3] Zum Testen erstelle in Deinem Verzeichnis drei "odt"-Dateien (ODT_1.odt + ODT_2.odt + ODT_3.odt) mit jeweils dem Inhalt: ÄÖÜäöüß

[4] Öffne eine neue Datei mit WRITER und starte das Makro.

[5] Nach Ausführung des Makros sollte in den drei Dateien "ÄÖÜäöüß" ersetzt sein durch "AeOeUeaeoeuess".

[6] Wenn Du in dem Makro

aPV(0).value = True
ersetzt durch
aPV(0).value = False

wird die jeweils bearbeitete Datei für Dich sichtbar geöffnet und Du kannst, wenn Du ganz schnell schaust, die Ersetzungen beobachten. Kann man mal bei den obigen drei Test-Dateien machen, ist aber bei der Verarbeitung vieler Dateien nicht empfehlenswert - verlangsamt nur die Verarbeitungsgeschwindigkeit.

[8] 'aSearch' und 'aReplace' musst Du nur um die neuen 'aSearch'-Zeichen und die zugehörigen 'aReplace'-Zeichen erweitern. Vorherige Einträge müssen nicht gelöscht werden, außer natürlich diesen Einträgen für den Makro-Test, da Du ja die Umlaute und "ß" nicht ersetzen willst:

aSearch = array("Ä" ,"Ö" ,"Ü" ,"ä" ,"ö" ,"ü" ,"ß" )
aReplace = array("Ae","Oe","Ue","ae","oe","ue","ss")

[7] Arbeite bitte IMMER NUR MIT KOPIEN DEINER DATEIEN, wenn Du dieses Makro anwendest !!!

Gutes Gelingen,
Grüße
Hans-Werner ;-))

   Sub SuchenUndErsetzenInAllenDateien

' D E K L A R A T I O N E N

      Dim oDocument as Object
      Dim oReplace as Object ' object
      Dim aDummy() as Variant ' array
      Dim aReplace() as Variant ' array
      Dim aSearch() as Variant ' array
      Dim iSearch as Integer ' index
      Dim aODT() as Variant ' array
      Dim dODT as String ' directory
      Dim fODT as String ' file
      Dim iODT as Integer ' index

' V O R B E L E G U N G E N

      dODT = "E:\TMP\ODT\"

      aSearch = array("Ä" ,"Ö" ,"Ü" ,"ä" ,"ö" ,"ü" ,"ß" )
      aReplace = array("Ae","Oe","Ue","ae","oe","ue","ss")

      Dim aPV(0) as New com.sun.star.beans.PropertyValue
      aPV(0).name = "Hidden"
      aPV(0).value = True

' D A T E I N A M E N E I N L E S E N

' Ersten Dateinamen aus dem Verzeichnis 'dODT' in das Array 'aODT' einlesen:
      fODT = Dir(dODT & "*.odt",0)
      If (fODT = "") Then
         MsgBox ("Keine Dateien im Verzeichnis " & Chr(10) &_
                 dODT & Chr(10) &_
                 "gefunden !")
         End
      EndIf
      ReDim Preserve aODT(0)
      aODT(0) = Dir(dODT & "*.odt",0)
      iODT = 0
' Alle weiteren Dateinamen aus dem Verzeichnis 'dODT' in das Array 'aODT' einlesen:
      Do
         fODT = Dir
         If ( fODT = "" ) Then
            Exit Do
         EndIf
         iODT = iODT + 1
         ReDim Preserve aODT(iODT)
         aODT(iODT) = fODT
      Loop

' Z E I C H E N S U C H E N U N D E R S E T Z E N

' Über alle Dateinamen in dem Array 'aODT':
      For iODT = 0 To Ubound(aODT) Step 1

' Datei mit dem Pfad-/Dateinamen 'dODT & aODT(iODT)' öffnen:
         oDocument = StarDesktop.loadComponentFromURL(ConvertToURL(dODT & aODT(iODT)),"_blank",0,aPV())

' Über alle 'aSearch'-Zeichen:
         For iSearch = 0 to Ubound(aSearch) Step 1
' Das aktuell indizierte 'aSearch'-Zeichen in der aktuell indizierten Datei suchen und alle
' gefundenen 'aSearch'-Zeichen durch das zugehörige "aRepalce"-Zeichen ersetzen:
            oReplace = oDocument.CreateReplaceDescriptor
            With oReplace
               .SetSearchString(aSearch(iSearch))
               .SetReplaceString(aReplace(iSearch))
               .SearchCaseSensitive = True
            End With
            oDocument.replaceAll(oReplace)
         Next

' Das aktuell indizierte 'aODT'-Dokument speichern:
         oDocument.StoreAsURL(ConvertToURL(dODT & aODT(iODT)),aDummy())
' Das aktuell indizierte 'aODT'-Dokument schließen:
         oDocument.Close(False)

       Next

   End Sub

------ Originalnachricht ------

Hallo Hans- Werner,

Ich habe jetzt mal Thomas' Marko-Idee aufgegriffen und so
modifiziert, dass bei einmaligem Aufruf alle "odt"-Dateien im
Verzeichnis bearbeitet werden.

[1] Ich habe Dir das Makro auch an Deine private Email-Adresse
gesendet mit Dateianhang "SuchenUndErsetzenInAllenDateien.txt". In
der eMail (hier) gehen immer die Leerzeichen-Einrückungen und somit
auch die Struktur verloren. Kopiere das Makro aus der Datei
"SuchenUndErsetzenInAllenDateien.txt"bei Dir nach "Module1".

Das wird nicht gehen, denn die von Dir als PN übermittelte Textdatei
enthält einiges, was mir irgendwie bekannt vorkommt :wink: Beispiele:

- Datei mit dem Pfad-/Dateinamen 'dODT & aODT(iODT)' öffnen:
- Ãœber alle 'aSearch'-Zeichen:
- gefundenen 'aSearch'-Zeichen durch das zugehörige "aRepalce"-Zeichen
ersetzen
- Das aktuell indizierte 'aODT'-Dokument schließen:

[2] Lege ein Verzeichnis (beispielsweise ".../ODT/") an und trage den
kompletten Pfad im Makro ein:

dODT = "E:\TMP\ODT\"
ersetzen durch
dODT = "deine vollständige pfadangabe"

[3] Zum Testen erstelle in Deinem Verzeichnis drei "odt"-Dateien
(ODT_1.odt + ODT_2.odt + ODT_3.odt) mit jeweils dem Inhalt: ÄÖÜäöüß

[4] Öffne eine neue Datei mit WRITER und starte das Makro.

[5] Nach Ausführung des Makros sollte in den drei Dateien "ÄÖÜäöüß"
ersetzt sein durch "AeOeUeaeoeuess".

[6] Wenn Du in dem Makro

aPV(0).value = True
ersetzt durch
aPV(0).value = False

wird die jeweils bearbeitete Datei für Dich sichtbar geöffnet und Du
kannst, wenn Du ganz schnell schaust, die Ersetzungen beobachten.
Kann man mal bei den obigen drei Test-Dateien machen, ist aber bei
der Verarbeitung vieler Dateien nicht empfehlenswert - verlangsamt
nur die Verarbeitungsgeschwindigkeit.

[8] 'aSearch' und 'aReplace' musst Du nur um die neuen
'aSearch'-Zeichen und die zugehörigen 'aReplace'-Zeichen erweitern.
Vorherige Einträge müssen nicht gelöscht werden, außer natürlich
diesen Einträgen für den Makro-Test, da Du ja die Umlaute und "ß"
nicht ersetzen willst:

aSearch = array("Ä" ,"Ö" ,"Ü" ,"ä" ,"ö" ,"ü" ,"ß" )
aReplace = array("Ae","Oe","Ue","ae","oe","ue","ss")

[7] Arbeite bitte IMMER NUR MIT KOPIEN DEINER DATEIEN, wenn Du dieses
Makro anwendest !!!

Immer? Ich wäre davon ausgegangen, dass es genügt, bei einem
Testdurchlauf so zu verfahren. Wenn es funktioniert müsste doch alles
gut sein, oder?

Den nachfolgenden Abschnitt komplett so als Makro übernehmen, d.h. inkl.
der darin enthaltenen Kommentare?

   Sub SuchenUndErsetzenInAllenDateien

' D E K L A R A T I O N E N

      Dim oDocument as Object
      Dim oReplace as Object ' object
      Dim aDummy() as Variant ' array
      Dim aReplace() as Variant ' array
      Dim aSearch() as Variant ' array
      Dim iSearch as Integer ' index
      Dim aODT() as Variant ' array
      Dim dODT as String ' directory
      Dim fODT as String ' file
      Dim iODT as Integer ' index

' V O R B E L E G U N G E N

      dODT = "E:\TMP\ODT\"

      aSearch = array("Ä" ,"Ö" ,"Ü" ,"ä" ,"ö" ,"ü" ,"ß" )
      aReplace = array("Ae","Oe","Ue","ae","oe","ue","ss")

      Dim aPV(0) as New com.sun.star.beans.PropertyValue
      aPV(0).name = "Hidden"
      aPV(0).value = True

' D A T E I N A M E N E I N L E S E N

' Ersten Dateinamen aus dem Verzeichnis 'dODT' in das Array 'aODT'
einlesen:
      fODT = Dir(dODT & "*.odt",0)
      If (fODT = "") Then
         MsgBox ("Keine Dateien im Verzeichnis " & Chr(10) &_
                 dODT & Chr(10) &_
                 "gefunden !")
         End
      EndIf
      ReDim Preserve aODT(0)
      aODT(0) = Dir(dODT & "*.odt",0)
      iODT = 0
' Alle weiteren Dateinamen aus dem Verzeichnis 'dODT' in das Array
'aODT' einlesen:
      Do
         fODT = Dir
         If ( fODT = "" ) Then
            Exit Do
         EndIf
         iODT = iODT + 1
         ReDim Preserve aODT(iODT)
         aODT(iODT) = fODT
      Loop

' Z E I C H E N S U C H E N U N D E R S E T Z E N

' Über alle Dateinamen in dem Array 'aODT':
      For iODT = 0 To Ubound(aODT) Step 1

' Datei mit dem Pfad-/Dateinamen 'dODT & aODT(iODT)' öffnen:
         oDocument =
StarDesktop.loadComponentFromURL(ConvertToURL(dODT &
aODT(iODT)),"_blank",0,aPV())

' Über alle 'aSearch'-Zeichen:
         For iSearch = 0 to Ubound(aSearch) Step 1
' Das aktuell indizierte 'aSearch'-Zeichen in der aktuell
indizierten Datei suchen und alle
' gefundenen 'aSearch'-Zeichen durch das zugehörige
"aRepalce"-Zeichen ersetzen:
            oReplace = oDocument.CreateReplaceDescriptor
            With oReplace
               .SetSearchString(aSearch(iSearch))
               .SetReplaceString(aReplace(iSearch))
               .SearchCaseSensitive = True
            End With
            oDocument.replaceAll(oReplace)
         Next

' Das aktuell indizierte 'aODT'-Dokument speichern:
         oDocument.StoreAsURL(ConvertToURL(dODT &
aODT(iODT)),aDummy()) ' Das aktuell indizierte 'aODT'-Dokument
schließen: oDocument.Close(False)

       Next

   End Sub

Viele Grüße

Rainer

Hallo Rainer,

da hat wohl WINDOWS mit seinem Zeichensatz zugeschlagen :-o ...

Die falsch umgesetzten Zeichen kommen nur in den Kommentarzeilen vor, nicht aber im Makro-Code, von daher wird sich das nicht auswirken auf das Makro.

ABER: Die paar Umlaute und das "ß" in den Kommentarzeilen zu korrigieren ist ja schnell gemacht und dann ist alles fehlerfrei in der Darstellung.

ALTERNATIV: Das Makro aus meiner vorherigen Mail kopieren, ist aber wegen ABER nicht wirklich notwendig.

"[...] Immer ? Ich wäre davon ausgegangen, dass es genügt, bei einem Testdurchlauf so zu verfahren. Wenn es funktioniert müsste doch alles gut sein, oder ? [...]"

Erstelle einfach ein BACKUP der zu bearbeitenden Dateien in einem anderen Verzeichnis. Wenn dann doch was "schief" geht, ist nichts verloren. Alles andere wäre leichtsinnig und unprofessionell !

"[...] Den nachfolgenden Abschnitt komplett so als Makro übernehmen, d.h. inkl. der darin enthaltenen Kommentare ? [...]"

Ja, denn die Kommentare sind erlaubte BASIC-Makro-Kommentare. Alles, was auf ' folgt ist Kommentar.

Gruß
Hans-Werner

------ Originalnachricht ------

Hallo Hans-Werner,

"[...] Den nachfolgenden Abschnitt komplett so als Makro übernehmen,
d.h. inkl. der darin enthaltenen Kommentare ? [...]"

Ja, denn die Kommentare sind erlaubte BASIC-Makro-Kommentare. Alles,
was auf ' folgt ist Kommentar.

Funktioniert leider nicht. Bei Versuchen in einem Testverzeichnis mit 4
odt-Dateien erscheint folgende Meldung:

http://sambalada.de/Basic_Fehler.png

Bei einer Kontrolle zeigte sich anschließend, dass nur die Dateien B
und C bearbeitet waren, nicht aber A und D.

Viele Grüße

Rainer

Hallo Rainer,

diese Fehlermeldung sagt mir leider nicht wirklich viel, hat wohl was mit dem Speichern der Dateien zu tun.

Mich wundert es, dass es mit 2 Dateien funktioniert hat.

Waren alle 4 Dateien "Test_A.odt", "Test_B.odt", "Test_C.odt" und "Test_D.odt" geschlossen, als Du das Makro gestartet hast ?

Gruß
Hans-Werner

------ Originalnachricht ------

Was soll das ?

Ich habe keine Mails an "Peter Blechert" <blechert@arcion.de> gesendet, nur an users@de.libreoffice.org !!!

------ Originalnachricht ------

Hallo Hans-Werner,

diese Fehlermeldung sagt mir leider nicht wirklich viel, hat wohl was
mit dem Speichern der Dateien zu tun.

Mich wundert es, dass es mit 2 Dateien funktioniert hat.

Waren alle 4 Dateien "Test_A.odt", "Test_B.odt", "Test_C.odt" und
"Test_D.odt" geschlossen, als Du das Makro gestartet hast ?

Nein: Ich hatte eine geöffnet, um dort das Makro zu starten. Deine
Nachfrage hat mich jetzt erst darauf gebracht, dass es auf einem
anderen Wege funktionieren könnte - und das tut es: Leere Writer-Datei
gestartet und mit der das Makro. So funktioniert es offenbar.
(jedenfalls bei ersten Tests). Gewöhnungsbedürftig, aber Hautsache, es
geht.

Vielen Dank und viele Grüße

Rainer

Hallo Rainer,

da hattest Du wohl diese Zeile in einer meiner letzten eMails übersehen:

"[...] [4] Öffne eine neue Datei mit WRITER und starte das Makro. [...]"

Allerdings hatte ich da nicht explizit dazu geschrieben, dass die zu bearbeitenden "odt"-Dateien geschlossen sein müssen. SORRY ...

"[...] Gewöhnungsbedürftig, aber Hautsache, es geht. [...]"

Deswegen war mein erster Lösungsvorschlag der mit PERL, bei dem mit einem anderen Programm das LibreOffice-Makro extern gestartet wird, ohne dass man selbst was mit LibreOffice machen muss.

Ich erhalte Deine eMails IMMER doppelt. Gebe bitte meine eMail-Adresse nicht unter "CC:" an, ich erhalte ja Deine eMails automatisch von users@de.libreoffice.org !

Dann gutes Gelingen,
Grüße
Hans-Werner ;-))

------ Originalnachricht ------

Hallo Hans-Werner,

Ich habe keine Mails an "Peter Blechert" <blechert@arcion.de> gesendet,
nur an users@de.libreoffice.org !!!

Peter hat wohl nicht verstanden, was passiert, wenn er sich bei einer
Mailingliste anmeldet.

Peter: Schreibe eine leere Mail von dem Account aus, von dem Du Dich
angemeldet hast, an
users+unsubscribe@de.libreoffice.org

... Das steht auch unter jeder Mail.

Gruß

Robert

Hallo Hans-Werner,

da hattest Du wohl diese Zeile in einer meiner letzten eMails
übersehen:

"[...] [4] Öffne eine neue Datei mit WRITER und starte das Makro.
[...]"

Ja, ist mir irgendwie entgangen,

Allerdings hatte ich da nicht explizit dazu geschrieben, dass die zu
bearbeitenden "odt"-Dateien geschlossen sein müssen. SORRY ...

Bei dem Hinweis wäre ich wenigstens ins Grübeln gekommen, denn mit
einer der betroffenen Dateien das Makro loszuschicken und sie
gleichzeitig geschlossen zu lassen, ist ja nicht möglich :wink:

"[...] Gewöhnungsbedürftig, aber Hautsache, es geht. [...]"

Deswegen war mein erster Lösungsvorschlag der mit PERL, bei dem mit
einem anderen Programm das LibreOffice-Makro extern gestartet wird,
ohne dass man selbst was mit LibreOffice machen muss.

Naja, für mich wäre es in punkto Aufwand ja auf das gleiche
hinausgelaufen (1 Start von irgendwas und dann das Makro starten, bevor
eine Datei geöffnet wird).

Interessant wäre noch, ob es mit dem - evtl. modifizierten - Makro auch
einen Weg gibt, ein Verzeichnis mit Unterverzeichnissen auf mehreren
Ebenen in einem Rutsch zu bearbeiten.

Ich erhalte Deine eMails IMMER doppelt. Gebe bitte meine
eMail-Adresse nicht unter "CC:" an, ich erhalte ja Deine eMails
automatisch von users@de.libreoffice.org !

Ist mir schon klar, aber ich vermute die Ursache bei Dir. Alle Deine
Postings in diesem Thread hast Du als cc-Empfänger an Dich selbst
geschickt, und beim Antworten ignoriert es mein Mailprogramm nicht,
sondern übermittelt das Posting auch an die cc-Adresse. Bei dieser hier
lösche ich sie jetzt 'raus, aber vielleicht überprüfst Du Deine
Einstellungen.

Viele Grüße

Rainer

Das mit dem "users+unsubscribe@de.libreoffice.org" klappt aber (zumindest in meinem Fall) nicht.
Ich habe schon mehrfach dorthin gesendet und bekomme die Liste trotz Bestätigung der Abmeldung immer noch.

Vielleicht gibt es da ein Problem ...
Viele Grüße!
Bernhard

PS:
Die Liste ist aber interessant zu verfolgen, sonst hätte ich mich schon eher gemeldet.

Hallo Bernhard,

Das mit dem "users+unsubscribe@de.libreoffice.org" klappt aber (zumindest in meinem Fall) nicht.
Ich habe schon mehrfach dorthin gesendet und bekomme die Liste trotz Bestätigung der Abmeldung immer noch.

Du hast also eine Mail zurückerhalten, die Du anschließend auch noch
bestätigt hast?

Schau einmal hier:
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/

Gruß

Robert

Hallo Rainer,

"[...] Bei dem Hinweis wäre ich wenigstens ins Grübeln gekommen, denn mit einer der betroffenen Dateien das Makro loszuschicken und sie gleichzeitig geschlossen zu lassen, ist ja nicht möglich :wink: [...]"

Wenn man mit einem BasicMakro "Besonderes" (alle Dateien in einem Rutsch bearbeiten) tun will, muss man eben auch "besonders" vorgehen ;-)) ...

"[...] Interessant wäre noch, ob es mit dem - evtl. modifizierten - Makro auch einen Weg gibt, ein Verzeichnis mit Unterverzeichnissen auf mehreren Ebenen in einem Rutsch zu bearbeiten. [...]"

Natürlich gibt es einen Weg, BasicMakro-Programmierung ist ein mächtiges Werkzeug ( Siehe: https://www.uni-due.de/~abi070/files/OOo/OOME/OOME_3_0_deutsch.pdf ).

Mir persönlich ist bei manchen Problemstellungen BasicMakro einfach zu "aufwändig", wenn ich das selbe Problem mit PERL mit geeigneteren Sprach-Konstrukten lösen kann. Deshalb habe ich mir ja bei bestimmten Problemstellungen die Vorgehensweise angewöhnt, umfangreiche Vorarbeiten mit PERL zu erledigen und die LO-spezifischen mit einem (kleinen und übersichtlichen) BasicMakro, das dann von dem PERL-Programm extern aufgerufen und auf die jeweiligen LO-Dateien angewendet wird.

Hinzukommt, dass man bei "[...] ein Verzeichnis mit Unterverzeichnissen auf mehreren Ebenen in einem Rutsch zu bearbeiten. [...]" zusätzlich noch prüfen muss, dass nur "odt"- Dateien bearbeitet werden.

Aber das ist noch nicht alles:

Wenn man ein Programm auf ALLE Dateien eines Verzeichnisses mit Unterverzeichnissen "los lässt", dann sollte zuerst von diesem Verzeichnis automatisch ein BACKUP erzeugt werden. Ein Programmierfehler kann IMMER passieren. So schnell kannst Du gar nicht schauen, wie schnell - bei einem Programmierfehler - alle Deine Dateien zerstört und unbrauchbar sind.

Ist mir in "früheren Zeiten" im Beruf auch schon mal passiert. Ein kleines BASH-Skript auf ein Verzeichnis mit Unterverzeichnissen angewendet und "ratz fatz" waren alle Dateien (BASH-Skripte) gelöscht. Glücklicherweise hatte ich von diesen gelöschten BASH-Skripten Dokumentationen (Ausdrucke). Das war ein langes und arbeitsreiches Wochenende zu Hause: Alle Ausdrucke einscannen und daraus wieder die BASH-Skripte rekonstruieren :-o ...

Deshalb mein Rat:

Kopiere die Dateien, die Du mit dem Makro bearbeiten willst, in ein Arbeitsverzeichnis. Erstelle von diesem Arbeitsverzeichnis eine Arbeitsverzeichnis-Kopie (BACKUP). Wende das Makro auf das Arbeitsverzeichnis so lange an, bis alle "odt"-Dateien bereinigt sind. Wenn alles in Ordnung ist, kannst Du dann die Arbeitsverzeichnis-Kopie wieder löschen.

"[...] Ist mir schon klar, aber ich vermute die Ursache bei Dir. [...]"

Da hast Du natürlich Recht. Ich werde in Zukunft das "CC:" mit meiner eigenen eMail-Adresse bei diesen Forum-eMails weg lassen.

Viele Grüße
Hans-Werner ;-))

------ Originalnachricht ------

Hallo Hans-Werner,

"[...] Interessant wäre noch, ob es mit dem - evtl. modifizierten -
Makro auch einen Weg gibt, ein Verzeichnis mit Unterverzeichnissen
auf mehreren Ebenen in einem Rutsch zu bearbeiten. [...]"

Natürlich gibt es einen Weg, BasicMakro-Programmierung ist ein
mächtiges Werkzeug ( Siehe:
https://www.uni-due.de/~abi070/files/OOo/OOME/OOME_3_0_deutsch.pdf ).

Solch eine Einarbeitung in die Materie ist für mich leider
ausgeschlossen. Wenn niemand "mal eben" ein modifiziertes Makro posten
kann oder will, lebe ich halt mit jeweils einem Verzeichnis ohne
Unterverzeichnisse. Ist für mich gegenüber der Einzeldatei-Bearbeitung
auch schon eine erhebliche Erleichterung.

Hinzukommt, dass man bei "[...] ein Verzeichnis mit
Unterverzeichnissen auf mehreren Ebenen in einem Rutsch zu
bearbeiten. [...]" zusätzlich noch prüfen muss, dass nur "odt"-
Dateien bearbeitet werden.

Ich kann mir nicht vorstellen, dass die Prüfung nötig ist (außer
vielleicht Stichproben), denn das "odt" ist im Makro ja definiert.
Hatte es mit einem Schwung alter Word-Dateien ausprobiert, und da
läuft das Makro mit der Meldung ins Leere, "keine Dateien gefunden in
Verzeichnis X".

Aber das ist noch nicht alles:

[snip: abgesicherte Arbeitsweise]

Was Du zu diesem Thema schreibst entspricht ohnehin meiner
Arbeitsweise. Immer mit "Netz und doppeltem Boden".

Deshalb mein Rat:

Kopiere die Dateien, die Du mit dem Makro bearbeiten willst, in ein
Arbeitsverzeichnis. Erstelle von diesem Arbeitsverzeichnis eine
Arbeitsverzeichnis-Kopie (BACKUP).

Da ich ein Arbeitsverzeichnis für ausschließlich diesen Zweck erstellt
habe und mit dem nichts anderes stattfindet, als die
Suchen-Ersetzen-Aktionen, wäre es ein Overkill, auch von dem noch ein
Backup anzufertigen. Wenn hier Fehler passieren, sind die Originale ja
noch vorhanden.

"[...] Ist mir schon klar, aber ich vermute die Ursache bei Dir.
[...]"

Da hast Du natürlich Recht. Ich werde in Zukunft das "CC:" mit meiner
eigenen eMail-Adresse bei diesen Forum-eMails weg lassen.

Hast Du in diesem Fall wohl schon umgesetzt, aber stattdessen erscheint
Deine Adresse jetzt als "Reply-To" - siehe:

Hallo Rainer,

"[...] Ich kann mir nicht vorstellen, dass die Prüfung nötig ist (außer vielleicht Stichproben), denn das "odt" ist im Makro ja definiert. [...]"

Da hast Du natürlich Recht: An das > "*.odt" < in > aODT(0) = Dir(dODT & "*.odt",0) < hatte ich nicht mehr gedacht.

Dabei ist mir noch ein kleiner Schönheitsfehler aufgefallen:

' Ersten Dateinamen aus dem Verzeichnis 'dODT' in das Array 'aODT' einlesen:
fODT = Dir(dODT & "*.odt",0)
If (fODT = "") Then
MsgBox ("Keine Dateien im Verzeichnis " & Chr(10) &_
dODT & Chr(10) &_
"gefunden !")
End
EndIf
ReDim Preserve aODT(0)
aODT(0) = Dir(dODT & "*.odt",0)
iODT = 0

> aODT(0) = Dir(dODT & "*.odt",0) < kannst Du ersetzen mit > aODT(0) = fODT < , denn wenn die Bedingung > If (fODT = "") Then < NICHT erfüllt ist, dann steht in fODT ja bereits die erste gefundene "odt"-Datei.

"[...] Da ich ein Arbeitsverzeichnis für ausschließlich diesen Zweck erstellt habe und mit dem nichts anderes stattfindet, als die Suchen-Ersetzen-Aktionen, wäre es ein Overkill, auch von dem noch ein Backup anzufertigen. Wenn hier Fehler passieren, sind die Originale ja noch vorhanden. [...]"

Na klar, so kann man das auch machen, Hauptsache es gibt - wo auch immer - eine Kopie der zu bearbeitenden Dateien.

"[...] Hast Du in diesem Fall wohl schon umgesetzt, aber stattdessen erscheint Deine Adresse jetzt als "Reply-To" [...]"

Das hat mit mir aber nichts zu tun, da scheint sich Dein eMail-Client irgendwo etwas gemerkt zu haben ...

Gruß
Hans-Werner ;-))

------ Originalnachricht ------

Hallo Hans-Werner,

Dabei ist mir noch ein kleiner Schönheitsfehler aufgefallen:

' Ersten Dateinamen aus dem Verzeichnis 'dODT' in das Array 'aODT'
einlesen:
fODT = Dir(dODT & "*.odt",0)
If (fODT = "") Then
MsgBox ("Keine Dateien im Verzeichnis " & Chr(10) &_
dODT & Chr(10) &_
"gefunden !")
End
EndIf
ReDim Preserve aODT(0)
aODT(0) = Dir(dODT & "*.odt",0)
iODT = 0

> aODT(0) = Dir(dODT & "*.odt",0) < kannst Du ersetzen mit > aODT(0)
> =
fODT < , denn wenn die Bedingung > If (fODT = "") Then < NICHT
erfüllt ist, dann steht in fODT ja bereits die erste gefundene
"odt"-Datei.

Mir ist das Problem nicht klar: Der Status Quo funktioniert doch
einwandfrei... Oder siehst Du eine mögliche Fehlerquelle (bzw. hast sie
entdeckt)?

"[...] Hast Du in diesem Fall wohl schon umgesetzt, aber stattdessen
erscheint Deine Adresse jetzt als "Reply-To" [...]"

Das hat mit mir aber nichts zu tun, da scheint sich Dein eMail-Client
irgendwo etwas gemerkt zu haben ...

Kann ich mir nicht vorstellen: Soweit ich es mitbekommen habe, bist
Du der einzige, der in der Liste mit einer "Reply-To"-Zeile und -Adresse
postet, und die wird eigentlich vom Absender eingefügt. Ich mache jetzt
ausnahmsweise einen Test und füge meine eigene auf diese Weise ein.
Müsste dann eigentlich im Posting erscheinen und eine Antwort
automatisch auch an mich (individuell) übermittelt werden.

Viele Grüße

Rainer

Hallo Rainer,

"[...] Mir ist das Problem nicht klar: Der Status Quo funktioniert doch einwandfrei... Oder siehst Du eine mögliche Fehlerquelle (bzw. hast sie entdeckt) ? [...]"

Die Betonung liegt auf SCHÖNHEITSFEHLER ! Es ist, wie in meiner vorherigen Mail beschrieben, einfach nur UNNÖTIG nochmals > Dir(dODT & "*.odt",0) < in > aODT(0) = Dir(dODT & "*.odt",0) < zu kodieren, es ist aber auch KEIN FEHLER. Ein "ordentlicher Programmierer" behebt auch SCHÖNHEITSFEHLER. Warum ? Wenn ich in einem Jahr dieses Makro wieder anschaute, würde ich mich "am Kopf kratzen und wundern", warum ich 2 mal > Dir(dODT & "*.odt",0) < kodiert habe, wo doch 1 mal völlig gereicht hätte ;-)) ...

"[...] Kann ich mir nicht vorstellen: Soweit ich es mitbekommen habe, bist Du der einzige, der in der Liste mit einer "Reply-To"-Zeile und -Adresse postet, und die wird eigentlich vom Absender eingefügt. [...]"

Wirst Du wohl müssen, ich lasse das "CC:" mit meiner eigenen Mail-Adresse ja jetzt weg. Der LibreOffice-Mail-Server verarbeitet meine aktuellen Mails, ob da in früheren Mails ein "CC:" mit meiner privaten Mail-Adresse war, ist dem (sicherlich) einfach nur egal. Davon abgesehen: Ich bekomme bei den jetzt aktuellen Mails von mir ohne "CC:" mit meiner Mails-Adresse auch nicht automatisch ein "CC:" mit meiner Mail-Adresse angezeigt, wenn ich auf meine eigene vom LibreOffice-Mail-Server zugesandte Mail antwortete.

"[...] Ich mache jetzt ausnahmsweise einen Test und füge meine eigene auf diese Weise ein. Müsste dann eigentlich im Posting erscheinen und eine Antwort automatisch auch an mich (individuell) übermittelt werden. [...]"

In dieser eMail (von Dir) erscheint Deine private eMail-Adresse nicht im "CC:" (s.u.) !

Gruß
Hans-Werner ;-))

------ Originalnachricht ------

Hallo Hans-Werner,

Die Betonung liegt auf SCHÖNHEITSFEHLER ! Es ist, wie in meiner
vorherigen Mail beschrieben, einfach nur UNNÖTIG nochmals > Dir(dODT
& "*.odt",0) < in > aODT(0) = Dir(dODT & "*.odt",0) < zu kodieren, es
ist aber auch KEIN FEHLER.

Ok.

"[...] Kann ich mir nicht vorstellen: Soweit ich es mitbekommen habe,
bist Du der einzige, der in der Liste mit einer "Reply-To"-Zeile und
-Adresse postet, und die wird eigentlich vom Absender eingefügt.
[...]"

Wirst Du wohl müssen, ich lasse das "CC:" mit meiner eigenen
Mail-Adresse ja jetzt weg.

Ja, weiß ich. Vorher waren hier immer sowohl die cc-, als auch die
Reply-To-Adresse zu sehen.

Davon abgesehen: Ich bekomme bei den jetzt aktuellen Mails von mir
ohne "CC:" mit meiner Mails-Adresse auch nicht automatisch ein "CC:"
mit meiner Mail-Adresse angezeigt, wenn ich auf meine eigene vom
LibreOffice-Mail-Server zugesandte Mail antwortete.

Keine Ahnung, was der LO_Mail-Server da macht, aber mein Test hat genau
das gezeigt, was ich erwartet hatte:

"[...] Ich mache jetzt ausnahmsweise einen Test und füge meine eigene
auf diese Weise ein. Müsste dann eigentlich im Posting erscheinen und
eine Antwort automatisch auch an mich (individuell) übermittelt
werden. [...]"

In dieser eMail (von Dir) erscheint Deine private eMail-Adresse nicht
im "CC:" (s.u.) !

Bei meiner Mail, die von der Liste hier eingetroffen ist, war nun meine
Mailadresse als "Reply-To" zu sehen. Mit einem Klick auf "Antworten"
öffnete sich eine Antwort-Mail zur Bearbeitung mit der Listenadresse
und zusätzlich mit meiner als cc-Empfänger. Anders ausgedrückt: Ich
bzw. mein Mail-Client hat beim Senden dafür gesorgt, dass eine
Reply-To-Adresse verwendet wird und sie auch an die Liste übermittelt
- was beim Antworten hier den beschriebenen Effekt hat. Das "Reply-To"
kommt also vom Absender - wie immer es auch verursacht sein mag. Meine
Vermutung: Irgendeine Einstellung bei Dir, die fehlerhaft ist oder
übersehen wurde.

Das unterschiedliche Verhalten unserer beiden Mail-Clients beim Umgang
mit einer solchen Adresse (ob sie also bei Listenmails überhaupt
beachtet wird) steht IMO auf einem anderen Blatt.

Viele Grüße

Rainer