Rätsel bei Löschen per Makro

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Rätsel bei Löschen per Makro

Beitrag von sven-my »

Hallo Experten,

es geht um folgendes Teil in einem größerem Makro.
Dieses Teilmakro soll in einer Writer-Dokument-Vorlage in einer Tabelle, nach Einfügen einer Adresse, unter bestimmten Bedingungen, den Inhalt einer Zelle löschen, bzw. in einer anderen Tabelle ein Flag setzen.

Code: Alles auswählen

rem --- gegebenenfalls Inhalt Tabelle "eMail" löschen	---								geändert 25.05.10
sub clearTab
oDoc = ThisComponent
Title = oDoc.DocumentInfo.Title
if mid(Title,1,3) = "Fax" or mid(title,1,5) = "Notiz" or mid(title,1,9) ="Bewerbung" then exit sub
ausl = oDoc.getTextTables().getByName("eMail").getCellByPosition(0,0).string
ausl = ausl+"xxxx"
ausT = left(ausl,3)	'ergibt entweder "- p" oder "Ein" oder "xxx"
wait 200
if ausT = "- p" then oDoc.getTextTables().getByName("Tabelle2").getCellByPosition(1,2).setString("x") 'Unterschrift-Flag
wait 100
if ausT <> "- p" then oDoc.getTextTables().getByName("eMail").getCellByPosition(1,0).setString("")	'mail-adresse löschen	
end sub
Was für mich rätselhaft ist, ist die Tatsache, daß ich für eine 100%iges Funktion unbedingt die beiden >wait< -Befehle einfügen muß.
Ohne die beiden >wait< wird mal gelöscht, mal nicht (bei gleicher Vorlage, und sonst gleichen Bedingungen)

Ich nutze OO 3.2.0 unter winXP prof --- auf einem Alt-Rechner mit 1GHz Taktfrequenz.

Hat jemand eine Idee, wie ich das besser schreiben kann, daß es auch ohne >wait< funktioniert?

gruß
sven-my
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Rätsel bei Löschen per Makro

Beitrag von marcel_at_work »

Hallo Sven,

also, ich glaube, ich kann das Problem auch nicht so ganz nachvollziehen, aber die If-Anweisungen im letzten Teil deines Codes würde ich grundsätzlich in einer einzigen Prozedur formulieren. Ich hab mit sowas in der Vergangenheit schon so einige Probleme gehabt:

Code: Alles auswählen

If ausT = "- p" then
    oDoc.getTextTables().getByName("Tabelle2").getCellByPosition(1,2).setString("x") 'Unterschrift-Flag
Else
    oDoc.getTextTables().getByName("eMail").getCellByPosition(1,0).setString("")   'mail-adresse löschen
End If
Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Re: Rätsel bei Löschen per Makro

Beitrag von sven-my »

Hallo Marci,

danke für Deine Antwort --- manchmal sieht man den Wald vor Bäumen nicht.

Meine unsaubere Konstruktion (ohne ELSE) ist aus dem Vorgänger-Code übrig geblieben, bei dem für jedes mögliche Ergebnis (Inhalt von 'ausT') eine andere Reaktion erfolgen sollte.

Leider funktioniert die saubere Programmierung (mit ELSE) auch nicht.

Die Anweisung nach ELSE

Code: Alles auswählen

oDoc.getTextTables().getByName("eMail").getCellByPosition(1,0).setString("")
wird einfach nicht ausgeführt.

Der Code zum Ausprobieren sieht so aus:

Code: Alles auswählen

rem --- gegebenenfalls Inhalt Tabelle "eMail" löschen	---								neu 18.06.10
sub clearTab
oDoc = ThisComponent
Title = oDoc.DocumentInfo.Title
if mid(Title,1,3) = "Fax" or mid(title,1,5) = "Notiz" or mid(title,1,9) ="Bewerbung" then exit sub
ausl = oDoc.getTextTables().getByName("eMail").getCellByPosition(0,0).string
ausl = ausl+"xxxx"
ausT = left(ausl,3)	'ergibt entweder "- p" oder "Ein" oder "xxx"
'wait 200
if ausT = "- p" then
	oDoc.getTextTables().getByName("Tabelle2").getCellByPosition(1,2).setString("x") 'Unterschrift-Flag
'wait 100
else
'if ausT <> "- p" then 
	oDoc.getTextTables().getByName("eMail").getCellByPosition(1,0).setString("")	  'mail-adresse löschen
end if	
end sub
gruß
sven-my
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Rätsel bei Löschen per Makro

Beitrag von marcel_at_work »

Hmmmm... i komm grad von der Nachtschicht und hab einige Probleme, mitzukommen. Kannst du vl. mal die Datei posten?

Was steht denn eigentlich in "oDoc.getTextTables().getByName("eMail").getCellByPosition(0,0).string"?

Lg, Marci

EDIT:

Hab die Funktion jetzt mal etwas verändert unter Calc laufen lassen. Ähm... ich weiß ja nicht, was für ein Script VOR deiner Problem-Funktion läuft, aber da die Sub so einfach aufgebaut ist, kann das Problem eigentlich nur daran liegen, das die Variable ständig mit "- p" belegt ist. Das mit der Wait-Anweisung ist mir jetzt sogar noch unverständlicher. ;-) :shock:
Zuletzt geändert von marcel_at_work am Fr, 18.06.2010 13:00, insgesamt 1-mal geändert.
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Re: Rätsel bei Löschen per Makro

Beitrag von sven-my »

Hallo Marci,

:? welche Datei ?
Das Makro ist Teil eines Größeren, welche nur bei mir funktioniert, weil ich dabei auf ein Programm zugreife, daß nicht jeder auf seinem Rechner hat, und die Vorlage, aus denen ich meine Schreiben erstelle, ist auf das Programm zugeschnitten.

A Detail: Das Makro stellt eine Verbindung zwischen Adreß-PrG und den verschiedenen Brief-Vorlagen (*.ott) dar.
Die Tabelle, die mit "eMail" bezeichnet ist, ist eine 2spaltige, 1zeilige Tabelle über dem Adreß-Feld, in der in der ertsen Spalte die Versandart (eMail, Einschreiben, per Boten) verzeichnet wird, und in der Spalte 2 steht die eMail-Adresse, die soll aber nur stehen bleiben, wenn der Brief per Mail (*.pdf) verschickt wird.

Die Tabelle2 dient der Aufname von Datum, Betreff, Bezug und "Ihr Schreiben vom ....", "mein Schreiben vom ..." und hat eine ansonsten ungenutzte Zelle, in die ich einfach ein "x" (Flag) per Makro einschreibe, um dann bei Fax und eMail ein Unterschrift-Faximilie unter den Gruß setze.

http://yfrog.com/83screenshot14920100618j

gruß
sven-my
Zuletzt geändert von sven-my am Fr, 18.06.2010 13:12, insgesamt 1-mal geändert.
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Rätsel bei Löschen per Makro

Beitrag von marcel_at_work »

Hmmm... scheint ja eigentlich ganz simple zu sein.

Aber IRGENDWIE wird die Variable "ausT" stets mit "- p" belegt.

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Re: Rätsel bei Löschen per Makro

Beitrag von sven-my »

Hallo Marci,

die variablen "ausT" ist der Inhalt der Tabelle "eMail, Spalte 0, Zeile 0" und dieser Inhalt ist entweder:

1. leer + xxxx ergibt 'xxxx' --- davon left(ausl,3) ergibt "xxx"
2. - per eMail - + xxxx ergibt '- per eMail -xxx' --- davon left(ausl,3) ergibt "- p"
3. Einschreiben + xxxx ergibt 'Einschreibenxxxx' --- davon left(ausl,3) ergibt "Ein"
4. per Boten + xxxx ergibt "per Botenxxxx" --- davon left(ausl,3) ergibt "per"

die addition mit "xxxx", damit ich keine Fehlermeldung bekomme, wenn die Variable leer ist, und ich die linken drei Zeichen auswerten will.

Schau mal weiter oben, ich habe einen link nachträglich eingesetzt, da ist ein Teil der Vorlage (*.ott) zu sehen.


gruß
sven-my
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Rätsel bei Löschen per Makro

Beitrag von marcel_at_work »

Naja... um mit einer leeren Variable weiterzuarbeiten, könnte man auch die "On Error Resume Next"-Methode wählen.

Jepp, hab ich angeschaut und jetzt auch begriffen. ;-)

Setz doch mal "msgbox ausT" vor und nach das "wait" und schau mal, welchen Wert sie hat. Ansonsten bin ich mit meinem Latein leider am Ende.

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Re: Rätsel bei Löschen per Makro

Beitrag von sven-my »

Hallo Marci,

durch die msgbox bin ich ja erst auf das "wait" gekommen --- bevor ich das zweite "wait" eingebaut hatte, habe ich mit der msgbox prüfen wollen, weshalb der Inhalt nicht gelöscht wird, aber das Abarbeiten der msgbox hat wohl soviel Zeit gekostet, daß das Löschen immer klappte, wenn die msgbox da war; hatte ich sie auskommentiert, wurde wieder nicht gelöscht.

Daher kam ich auf die Idee den "wait"-Befehl einzubauen, und habe dann von 10 ab immer weiter um 10 erhöht, bis es fehlerfrei klappte.

Zu "On Error Resume Next" : Dafür reicht mein Wissen absolut nicht aus !

gruß
sven-my
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Rätsel bei Löschen per Makro

Beitrag von marcel_at_work »

Das wußte ich natürlich nicht. Aber das du dir die Mühe mit dem Timer-Experiment gemacht hast... man man man... Respekt. ;-)

Na, UND???????? WAS kommt denn nun raus? Ist der Wert der Variablen VOR der wait-Anweisung "- p"???????????

Dann erklär ich es mal kurz... es ist einfacher als den Fernsehr einzuschalten: ;-)

Wenn man eine Codezeile hat, bei der ein Fehler auftreten könnte, wird durch die "On Error"-Methode (VOR dieser Zeile) die Möglichkeit gegeben, diesen Fehler auf versch. Arten zu "behandeln".

Z.B. kann man durch "On Error Resume Next" den Fehler einfach überspringen, d.h. es wird einfach die nächste Codezeile, nach dem Fehler, abgearbeitet:

Bsp.:
sheet1 = ... gibt es nicht!

Code: Alles auswählen

...
oDoc.sheets().getbyName("sheet1").getcellbyposition(0,0).string = "1" 'hier würde nun ein Fehler auftreten und OOo stoppen
... aber so:

Code: Alles auswählen

...
On Error Resume Next
oDoc.sheets().getbyName("sheet1").getcellbyposition(0,0).string = "1" 'OOo registriert zwar dennoch diesen Fehler, aber er (also DIESE Zeile) wird durch die "On Error"-Methode einfach übersprungen
msgbox "haha, NIX is mit Fehler, denn alles is Paletti ;-)"
Diese Funktion ist zwar simple, hat aber ein gewaltiges Potenzial, da man sich dadurch zum einen Programmieraufwand und zum anderen auch viel Nerven einsparen kann. ;-)

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Re: Rätsel bei Löschen per Makro

Beitrag von sven-my »

Hallo Marci,

also : Nein, "ausT" ist nicht immer "- p", sondern das läuft so, wie paar Treats weiter oben unter 1.,2., 3., und 4. beschrieben;
es hängt eben davon ab, was in dem entsprechenden Feld des Adreß-Programms steht, und dann in diese Tabelle eingetragen wird.

Mit "On Error Resume Next" müßte es also so aussehen (???) :

Code: Alles auswählen

ausl = oDoc.getTextTables().getByName("eMail").getCellByPosition(0,0).string
rem  ausl = ausl+"xxxx"
On Error Resume Next
ausT = left(ausl,3)   'ergibt entweder "- p" oder "Ein" oder "per"
wait 200
if ausT = "- p" then oDoc.getTextTables().getByName("Tabelle2").getCellByPosition(1,2).setString("x") 'Unterschrift-Flag
wait 100
if ausT <> "- p" then oDoc.getTextTables().getByName("eMail").getCellByPosition(1,0).setString("")   'mail-adresse löschen   
end sub
Habe die Addition auskommentiert, damit man den Ursprung noch sieht.

Habe ich das richtig verstanden : "On Error Resume Next" muß immer vor der Zeile stehen, in der Fehler auftreten könnte ?

gruß
sven-my
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Rätsel bei Löschen per Makro

Beitrag von marcel_at_work »

Jepp, genau. Einfach "On Error Resume Next" davor, und es klappt wieder mit dem Nachbarn. ;-)

Eine andere Methode wäre dann z.b. noch die "On Error Goto..."-Anweisung:

Code: Alles auswählen

...
    On Error Goto Fehlerbehandlung
    oDoc.sheets().getbyName("sheet1").getcellbyposition(0,0).string = "1" 'das Programm wird bei einem Fehler, durch "On Error Goto...", an die bezeichnete "Fußnote" (hier: "Fehlerbehandlung") gesetzt und weitergeführt
    Exit Sub

    Fehlerbehandlung: 'der Doppelpunkt ist übrigens für die Standard-Deklaration einer "Fußnote" in Code zuständig (genauso könnte man in irgendeiner Funktion "Goto irgendwas" schreiben und dann wird das Programm bei "irgendwas:" weitergeführt)
    msgbox "haha, NIX is mit Fehler, denn alles is Paletti ;-)"
End Sub
Das mit der Funktion von "ausT" hab ich schon verstanden! Ich habe dies explizit nochmal nachgefragt, weil ich mir den Fehler AUSSCHLIEßLICH so erklären kann, dass die Variable STETS DEN WERT hat, mit dem er durch die erste "IF-Anweisung" kommt. Denn die IF-Überprüfung ist KORREKT und sie MUß bei einem anderen Wert als "- p" ein FALSE (die zweite Anweisung ausführen) ausgeben. Ich versteh es einfach nicht. :(

Hm... wie wäre es denn so: (mal ein bisschen aufgeräumter und optimiert;-) )

Code: Alles auswählen

Sub xxx()
    ausT = oDoc.getTextTables().getByName("eMail").getCellByPosition(0,0).string
    On Error Resume Next
    if left(ausT,3) = "- p" then
        oDoc.getTextTables().getByName("Tabelle2").getCellByPosition(1,2).setString("x") 'Unterschrift-Flag
    else
        oDoc.getTextTables().getByName("eMail").getCellByPosition(1,0).setString("")   'mail-adresse löschen
    End if
end sub

lg, Marci
Zuletzt geändert von marcel_at_work am Fr, 18.06.2010 14:58, insgesamt 1-mal geändert.
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: Rätsel bei Löschen per Makro

Beitrag von Karolus »

Hallo
Habe ich das richtig verstanden : "On Error Resume Next" muß immer vor der Zeile stehen, in der Fehler auftreten könnte ?
Ja, - aber benutze das nur wenn du genau weisst was du tust - damit werden auch alle nachfolgenden Fehler im Code der Sub stillschweigend übergangen - was in den meisten Fällen nicht so gewünscht ist.

btw. Treat != Thread

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Rätsel bei Löschen per Makro

Beitrag von marcel_at_work »

Jepp, hab´ich fast vergessen... da gab´s ja noch etwas, was dazu gesagt werden sollte. ;-)

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Rätsel bei Löschen per Makro

Beitrag von marcel_at_work »

Ps.: Hey Karo...

Du kannst nicht stillschweigend über ein Thema rauschen, um dann nur die Rechtschreibfehler zu kommentieren! :lol:
Ich denke, zumindest ein kleiner Lösungsansatz wäre schon zumutbar... ;-)

Lg
Zuletzt geändert von marcel_at_work am Fr, 18.06.2010 15:07, insgesamt 2-mal geändert.
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Antworten