Seite 1 von 1

(gelöst) Laufzeitfehler bei funktionierendem Makro

Verfasst: Di 6. Mai 2014, 19:00
von Freischreiber
Hallo,

bei meinem geliebten Textfield-Makro http://www.libreoffice-forum.de/viewtop ... =10#p27919 bekomme ich, nachdem ich an dem Pfad zu meinen Makros etwas umbenannt habe, eine Fehlermeldung und das Makro wird nicht mehr ausgeführt.

Weiß jemand, wie ich das wieder beheben kann?

Danke und Gruß
Freischreiber

Re: Laufzeitfehler bei funktionierendem Makro

Verfasst: Di 6. Mai 2014, 20:28
von RobertG
Hallo Freischreiber,

wenn so eine Meldung bereits in der ersten Zeile erfolgt, dann kann ich mir nur vorstellen, dass irgendwo "Option Explicit" steht. Du hast nämlich die Variable nicht vorher deklariert. Leider machen das viele Leute nicht:
DIM oDoc AS OBJECT
Wenn das davor steht, dann müsste das Makro in der nächsten Zeile stoppen.
dann hilft
DIM oForm AS OBJECT
usw.

Gruß

Robert

Re: Laufzeitfehler bei funktionierendem Makro

Verfasst: Mi 7. Mai 2014, 08:27
von Freischreiber
Hallo Robert,

"usw." würde heißen, alle vorkommenden Variablen oben im Code erst einmal zu deklarieren mit DIM?

Aber das Makro stammt von F3K Total und hat immer reibungslos funktioniert.

Jetzt habe ich etwas entdeckt: In einem anderen Makro desselben Moduls, weiter unten, kommt tatsächlich "Option Explicit" vor. Nachdem ich dieses andere Makro entfernt habe, ist der Fehler weg! Kann es sein, daß dieses "Option Explicit" in einem anderen Makro, das gar nicht ausgeführt wird, das weiter oben stehende Textfield-Makro beeinflußt?

Rätselnd,
Freischreiber

Re: Laufzeitfehler bei funktionierendem Makro

Verfasst: Mi 7. Mai 2014, 20:00
von RobertG
Hallo Freischreiber,

ich bin davon ausgegangen, dass "Option Explicit" sich nur auf das Makro bezieht, in dem es selbst steht. Vor allem nicht auf Zeilen, die vorher geschrieben wurden. Wenn es zu Beginn eines Moduls außerhalb von SUB oder FUNCTION steht, dann wird es sicher für das ganze Modul stehen.

Vielleicht ist da mit der Zeit für zusätzliche Sicherheit gesorgt worden? Bin ich überfragt.

Ich bemühe mich jedenfalls immer, die Variablen am Beginn des Makros zu definieren - oder sogar übergreifend für alle Module.

Gruß

Robert

Re: Laufzeitfehler bei funktionierendem Makro

Verfasst: Do 8. Mai 2014, 00:00
von Acco
Hallo Freischreiber, hallo Robert,

hier ein Link zu Option Explicit: https://help.libreoffice.org/3.3/Basic/ ... Runtime/de
Ich habe mir angewöhnt es in jedem Modul als erste Zeile einzufügen. Sie gilt für alle Subs und Functions in einem Modul.

Macht mir zwar Arbeit, die Variablen zu deklarieren, aber die Fehlersuche wird gerade in längeren Makros einfacher, weil falsch geschriebene oder nicht definierte Variablen automatisch reklamiert werden.

Da mir auch mal Schreibfehler unterlaufen, ist das für mich eine feine Sache.

Gruß

acco

Re: Laufzeitfehler bei funktionierendem Makro

Verfasst: Do 8. Mai 2014, 18:52
von Freischreiber
Hallo Acco,

tatsächlich, dann war das das... aber "Diese Anweisung muss in einem Modul vor dem ausführbaren Programmcode stehen." kann ich nicht bestätigen, stand bei mir drei Makros weiter unten.

Aber warum nutzt man das? Ist doch einfacher, wenn LO die Variablen selbst definiert, oder?

Gruß
Freischreiber

Re: Laufzeitfehler bei funktionierendem Makro

Verfasst: Do 8. Mai 2014, 19:45
von Acco
Hallo Freischreiber,

Aus dem Werk Andrew Pitonyak "OpenOffice.org-Makros Erklärt" hier erhältlich: http://www.pitonyak.org/OOME_3_0.pdf
Obwohl es ganz praktisch ist, Variablen ohne Deklarierung zu verwenden, so ist das doch fehleranfällig. Wenn Sie sich bei einem Variablennamen verschreiben, entsteht daraus eine neue Variable statt einer Fehlermeldung. Wenn Sie daher wollen, dass OOo Basic nicht deklarierte Variablen als Laufzeitfehler behandelt, dann stellen Sie die Schlüsselwörter „Option Explicit“ ganz an den Anfang, vor den ausführbaren Code. Vor Option Explicit dürfen allenfalls noch Kommentare stehen, weil sie nicht ausführbar sind. Es wäre sicher besser, wenn OOo Basic solche Fehler zur Kompilierungszeit fände, tatsächlich aber werden werden alle Variablen und Routinen erst zur Laufzeit aufgelöst.

Tipp: Verwenden Sie „Option Explicit“ ganz am Anfang eines jeden Moduls, das Sie schreiben. Sie werden damit viel Zeit bei der Fehlersuche in Ihrem Code sparen. Wenn ich gebeten werde, ein Makro zu debuggen, füge ich zuallererst „Option Explicit“ an den Anfang jedes Moduls.
Das hat mir schon viel Zeit gespart. Einmal habe ich Robert und F3K Total im Forum völlig unnötig beschäftigt (http://www.libreoffice-forum.de/viewtop ... 971#p26971), weil ich in einem Makro einen winzigen Schreibfehler in einer Variable hatte. Ein Buchstabe zuviel hatte schon allein mich über 2 Stunden Fehlersuche gekostet. Ich hätte nie gedacht, das mir das passieren kann. Seitdem nutze ich Option Explicit.

Zum anderen definiert Base keine Variablen, das macht der Mensch. Base erkennt jedoch das hier eine Variable gewünscht wird und setzt eine ein. Allerdings immer mit dem Typ "variant", d.h. diese Variable kann alles aufnehmen, Text, Zahl, Datum, usw. Man kann im Laufe eines Makros dieser Variablen also verschiedene Typen zuweisen, bis man selber nicht mehr weiß, welchen Typ sie gerade hat.

Der größte Nachteil ist bei umfangreichen Makros die Geschwindigkeit, Variant-Variablen sind die langsamsten, heißt es. Ob wir das bei kleinen Anwendungen merken? Ich probiere es erst gar nicht aus.

Bei diesem Thema gehen die Ansichten halt auseinander, für mich habe ich entschieden, ich nutze Option Explizit und definiere meine Variablen mit dem richtigen Typ.

Gruß

acco

Re: Laufzeitfehler bei funktionierendem Makro

Verfasst: Fr 9. Mai 2014, 12:47
von Acco
...

ach so,
Freischreiber hat geschrieben:tatsächlich, dann war das das... aber "Diese Anweisung muss in einem Modul vor dem ausführbaren Programmcode stehen." kann ich nicht bestätigen, stand bei mir drei Makros weiter unten.
Option Explicit funktioniert auch in einem Makro. Sie "muss" aber am Anfang des Moduls stehen, weil Du Dir sonst möglicherweise den Wolf suchst, bevor Du die Ursache der entsprechenden Fehlermeldung findest. Es ist also eher eine Übereinkunft für guten Programmierstil, als die Behauptung das Option Explicit nirgends anders funktioniert. In Deinem konkreten Fall wäre es auch einfacher gewesen, wenn die Option am Anfang gestanden hätte.

Gruß

acco