Frage stellen
0

Makrofehler ab dem 2, Aufruf

gefragt 2016-10-21 16:06:35 +0200

Softwaredino Gravatar-Bild

Makrofehler ab dem 2. Aufruf

Hallo allerseits, habe eine Exceltabelle auf Libre Office Calc umgestellt. Nach einigen Schwierigkeiten habe ich noch ein Problem:

Über eine Schaltfläche in der Tabelle wird ein Makro aufgerufen, um Daten aus einer Datei in globalen Daten zu lesen und in der Tabelle abzulegen. Das Makro ist in VBA geschrieben und läuft.

Bei der ersten Betätigung der Schaltfläche nach dem Start läuft alles glatt ab, danach nicht mehr!

Ab der zweiten Betätigung der Schaltfläche kommt sofort eine Fehlermeldung von Libre Office: Basic Laufzeitfehler, '9', Index außerhalb des definierten Bereichs.

Nach Klick auf die Meldung läuft das Makro normal bis zum Schluß durch. Beim nächsten Anstoß kommt wieder zuerst diese Fehlermeldung.

Die Fehlermeldung erscheint sofort nach Betätigung der Schaltfläche. Ein Messageboxaufruf in der 1.Zeile erscheint erst nach der Fehlermeldung.

Es sieht so aus, als würde bei den Folgeanstößen jeweils zuerst ein erneuter Syntaxcheck durchgeführt, der einen Fehler findet, der beim Erstanstoß nicht vorlag bzw nicht gefunden wurde.

Wie kann sich der Code des Makro von einem Anstoß zum andern so verändern, daß der Syntaxcheck erst im 2. Aufruf zuschlägt, beim ersten Aufruf aber noch nicht?

Wenn ich den Makrocode intern kurz schließe, laufen beliebig viele Aufrufe hintereinander durch. Erst beim Verlassen des Makros und bei erneutem externen Anstoß über die Schaltfläche kommt der Fehler.

Habe den Code des Makros (liegt in einem Modul) auch mit Microsoft Visual Basic 6 auf Syntax gecheckt. Dabei wurden noch 6 Syntaxfehler (nicht definierte Werte, fehlende Klammer zu) gefunden, aber nichts wichtiges.

Ich bitte um Tipps und Ideen, vielen Dank

Allgemeine Daten: Laptop: Windows Vista. Libre Office: 5.1.5.2, Alc Makromodul mit 1600 Zeilen

Bearbeiten Tags ändern Melden schließen vereinen löschen

Kommentare

Hallo,

wenn das Makro erstmalig startet stehen alle Zählervariablen auf NULL.

Bei einem zweiten Durchlauf, scheint ein Rest einer Variablen noch im Speicher zu stehen. z.B. bei einer globalen Variablen. Damit ist nun zu prüfen welche Variable davon betroffen ist, damit sie an geeigneter Stelle im Code auf NULL gesetzt werden kann. Ich tippe auf eine Variable die für das Druchzählen eines Array's benutzt wird.

Gruß

Craig

Craig22 Gravatar-BildCraig22 ( 2016-10-21 16:57:51 +0200 )Bearbeiten

2 Antworten

0

geantwortet 2016-10-21 19:49:09 +0200

Toxitom Gravatar-Bild

Hallo Dino,

eine mögliche Lösung hat Dir ja Craig schon gegeben - es gibt aber auch noch andere Möglichkeiten.

LibreOffice kann keinen VBA Code ausführen. Sorry. Der Code basiert auf COM und NET Objekten, LibreOffice arbeitet mit UNO Objekten - zwei völlig verschiedene Welten. Auch nutzt VBA jede Menge vordefinierter Funktionen - die es so in LibreOffice auch nicht gibt. Um aber dennoch eine "Kompatibilität" herzustellen, wird VBA-Code durch eine "Übersetzungsebene" gejagt und auf UNO-Code umgeschrieben (zur Laufzeit). Eine solche Zwischenbibliothek ist immer eine Schwachstelle und kann auch nie vollständig sein. Es könnte also durchaus sein, dass auch dort Variable zwischengespeichert und im nächsten Durchlauf weiterverwendet werden. Und an die Schicht kommst Du gar nicht dran.

Ist das Makro wichtig und willst Du langfristig mit LibreOffice arbeiten, kann ich nur empfehlen, den Code komplett umzuschreiben - und keinen VBA Code zu verwenden. Die möglichen Probleme rechtfertigen den Einsatz nicht.

Viele Grüße Tom

Bearbeiten Melden löschen Link mehr
0

geantwortet 2016-10-25 18:43:41 +0200

Softwaredino Gravatar-Bild

updated 2016-10-25 18:47:08 +0200

Hallo Tom, Hallo Craig,

vielen Dank für Euer Antworten, sie waren für mein Verständnis sehr hilfsreich. . Konnte das Problem lösen. Es handelt sich um einen Effekt, wie bei Bug Nr. 35644, der eigentlich behoben sein sollte?.

Der Code hatte 2 globale Arrays of Records. Nachdem ich bei den 2 globalen Arraydeklarationen die Angabe des Recordtyps entfernt hatte, verschwand der Effekt:

Alte Deklaration:

Public Type MyRecordtype

  L1 As Long

  L2 As Long

End Type

Global Myarray(1 to 10) As Myrecordtype

Neue Deklaration (Myarray ohne Typangabe)

Global Myarray(1 to 10)

Nochmals danke für die Diskussion, Softwaredino.

Bearbeiten Melden löschen Link mehr
Registrieren oder einloggen, um zu antworten

Antwortwerkzeuge

1 Beobachter

Statistik

Gefragt: 2016-10-21 16:06:35 +0200

Angesehen: 138 Mal

Aktualisiert: Oct 25 '16