[GELÖST] Probleme beim importieren von VBA Programmen => Code muss nach "Standard" verschoben werden

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

Moderator: Moderatoren

Hardi
Beiträge: 7
Registriert: Sa, 13.04.2019 00:58
Wohnort: Mainz

[GELÖST] Probleme beim importieren von VBA Programmen => Code muss nach "Standard" verschoben werden

Beitrag von Hardi » Sa, 13.04.2019 02:01

Edit: Das Problem ist inzwischen mit Stephans Hilfe gelöst (Siehe unten)

Hallo Zusammen,

Ich habe ein ganz seltsames Problem:
Ein Makro funktioniert nach dem Öffnen der Datei erst wenn es im Basic Editor verändert oder wenn „Option VBASupport 1“ deaktiviert ist.

Ich möchte ein Excel Sheet in Libre Office konvertieren damit es auch von Leuten benutzt werden kann die kein Microsoft Office haben. Das Excel Sheet ließ sich mit einigen kleinen Änderungen problemlos konvertieren. Die darin verwendeten VBA Makros Funktionieren tadellos. Doch wenn man die Datei schließt und neu öffnet, dann Funktionieren sie nicht mehr ;-(
Dann muss man den Basic Editor öffnen, etwas im Makro ändern (Leerzeichen einfügen und wieder Löschen) und dann funktioniert das Makro ?!?

Zum Test habe ich ein minimales Beispiel erstellt an dem man das Problem nachvollziehen kann:

Es verwendet das Makro „mySum“ in Zelle B3 zur Berechnung der Summe aus B1 und B2. Ich weiß, dazu braucht man kein Makro, aber das ist ja nur ein Test an dem man das Problem reproduzieren kann.
Hier das Makro:

Code: Alles auswählen

REM  *****  BASIC  *****
Option VBASupport 1

Function  mySum(a as long, b as long) as long  
  mySum = a + b  
End Function
In der Tabelle (B3) wird das Makro so benutzt:
=MYSUM(B1;B2)

Hier die entsprechende Datei:
mySum.zip
"C:\Dat\Märklin\Arduino\LEDs_Eisenbahn\mySum.zip"
(7.59 KiB) 44-mal heruntergeladen

Wenn man die Datei mit aktivierten Makros öffnet, dann passiert folgendes:
  • Eine Änderung an Zelle B1 wird direkt in Zelle B3 angezeigt. Aber ohne Summierung. Wenn man 42 eingibt, dann wird 42 in B3 angezeigt ?!?
  • Änderungen an B2 haben keine Auswirkungen.
  • Erst wenn eine Änderung am Makro (Leerzeichen) im Basic Editor gemacht wird, dann funktioniert die Berechnung. Jetzt wird B1 und B2 korrekt summiert und in B3 ausgeben.
  • Wenn man im Makro die Zeile „Option VBASupport 1“ auskommentiert, das Programm speichert und neu öffnet, dann Funktioniert die Berechnung sofort ohne dass man etwas im Code ändern muss.
Dummerweise benötige ich die „Option VBASupport 1“ in meinem eigentlichen Makro damit die Excel Befehle verstanden werden. Ich möchte das Programm auch nicht neu schreiben, weil ich den Benutzern eine Excel und eine Libre Office Version zur Verfügung stellen möchte. Darum sollen die beiden Versionen möglichst gleich sein damit man Änderungen einfache einpflegen kann.

Hier ist das eigentliche Programm um das es geht:
Pattern_Configurator.zip
(36.01 KiB) 52-mal heruntergeladen

Es berechnet eine Konfigurationszeile für „Meine“ Eisenbahn Lichtsteuerung welche ich hier veröffentlicht habe: #250: https://www.stummiforum.de/viewtopic.ph ... 8#p1962758

Ich verwende Libre Office 6.1.5.2 (x64) auf einem Win10 Rechner.

Vielen Dank im Voraus für Eure Hilfe

Hardi
Zuletzt geändert von Hardi am So, 14.04.2019 12:56, insgesamt 1-mal geändert.

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

Re: Verwendung eines einfachen Makros in Tabelle geht nicht, wenn „Option VBASupport 1“ aktiv ist

Beitrag von Stephan » Sa, 13.04.2019 09:08

Die Datei mySum funktioniert problemlos in OpenOffice (gestestet mit AOO 4.1.6).

Ansonsten verstehe ich das Problem nicht, denn die Makros der zweiten Datei (Pattern_Configurator.ods) befinden sich in einer ganz anderen Bibliothek (VBAProject) als die Funktion, womit man "Option VBASupport 1" im Modul der Funktion (Module1 in Bibliothek "Standard") löschen kann.


Gruß
Stephan
Dateianhänge
Pattern_Configurator_mitFunktion.ods
(36.21 KiB) 48-mal heruntergeladen

Hardi
Beiträge: 7
Registriert: Sa, 13.04.2019 00:58
Wohnort: Mainz

Re: Verwendung eines einfachen Makros in Tabelle geht nicht, wenn „Option VBASupport 1“ aktiv ist

Beitrag von Hardi » Sa, 13.04.2019 12:08

Hallo Stephan,

ganz vielen Dank, dass Du Dir mein Problem so schnell angeschaut hast.

Ja, Du hast Recht. Unter OpenOffice (4.1.6) läuft das mySum Beispiel aber nicht unter LibreOffice. Damit habe ich nicht gerechnet. Ich dachte die beiden Pakete sind ähnlich.
Stephan hat geschrieben:
Sa, 13.04.2019 09:08
Ansonsten verstehe ich das Problem nicht, denn die Makros der zweiten Datei (Pattern_Configurator.ods) befinden sich in einer ganz anderen Bibliothek (VBAProject) als die Funktion, womit man "Option VBASupport 1" im Modul der Funktion (Module1 in Bibliothek "Standard") löschen kann.
Die Aussage verstehe ich nicht wiederrum nicht. In der von mir Hochgeladenen Datei gibt es nur ein Sheet „Main“. Das Sheet „Funktionstest“ und das entsprechende Makro „mySum“ stammt aus meiner Testdatei.

Das Problem tritt in der Datei Pattern_Configurator.zip auch mit OpenOffice auf ;-(
Hier kommen dummerweise mehrere Probleme zusammen.

Das Erste Problem entspricht dem Problem in mySum. Im Zelle K2 wird Testweise die Makro Funktion „=mybin2dec(K1)“ verwendet. Sie wandelt eine Binärzahl in eine Dezimalzahl um. Auch diese Funktion geht nach dem Laden der Datei nicht. Die Zelle zeigt „###“ = „#NAME?“. Wenn man den Basic Editor öffnet , etwas ändert (Leerzeichen) und anschließend Zelle K2 („=mybin2dec(K1)“) ändert, dann funktioniert das Makro. Das ist genau so wie bei der Testdatei.


Das zweite Problem ist eine „Unverträglichkeit“ in dem Makro „calculatepattern()“. Es wird in Zelle E32 benutzt: „=calculatepattern(E5;E6;E44:EV298)“. Wenn diese Zeile Editiert wird (Letzte Klammer löschen und wieder einfügen), dann meldet OpenOffice einen „BASIC-Laufzeitfehler. '91' Objektvariable nicht belegt“ in de Zeile „FirstRow = Rng.Row“ im Makro. Wenn man einen Breakpoint in die Zeile setzt, dann sieht man, das „Rng“ ein Variant(1 to 255, 1 to 148) ist. Aber hier funktioniert anscheinend der Zugriff auf die „.Row“ Eigenschaft nicht ;-( In LibreOffice geht das.
Wenn man diese Abfrage zu Testzwecken durch eine Konstante ersetzt („FirstRow = 44“) dann stolpert OpenOffice über die „For Each … In Rng …“ Zeilen. Auch das Funktioniert in LibreOffice.

Ich vermute, dass man das zweite Problem mit OpenOffice Befehlen lösen kann. Das eigentliche Problem ist immer noch, das VBA Makros erst dann funktionieren, wenn man eine Änderung im Basic Code gemacht hat. Die Makros werden nicht erkannt. Im Tabellenblatt wird „###“ = „#Name?“ angezeigt. Erst wenn der Basic Editor geöffnet wurde und man etwas geändert hat dann Kennt Calc die Makros. Vielleicht muss man dem guten Programm irgendwo sagen, dass es auch in VBA Makros schauen soll.

Ich will, wie im ersten Post gesagt, den Leuten da Draußen eine Möglichkeit geben das Programm ohne Microsoft zu nutzen. Welches freie Office Paket würdet Ihr dazu empfehlen? Momentan läuft das Programm unter Libre Office mit „Anschubsen“ (Basic Editor öffnen und Leerzeichen einfügen), unter Open Office hilft auch das nicht.

Vielleicht hat noch jemand eine Idee wie ich Calc dazu bringen kann, dass es sich die Namen meiner VBA Makros merkt.
Namensschilder wie in der Schule?
Bild

Hardi
Zuletzt geändert von Hardi am So, 14.04.2019 12:56, insgesamt 1-mal geändert.

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

Re: Verwendung eines einfachen Makros in Tabelle geht nicht, wenn „Option VBASupport 1“ aktiv ist

Beitrag von Stephan » Sa, 13.04.2019 15:21

Die Aussage verstehe ich nicht wiederrum nicht.
Du hast geschrieben das Du auf "Option VBASupport 1" nicht verzichten kannst weil dort noch andere Makros sind die das benötigen, obwohl es die Funktion "mySum" nicht benötigt.
Diese Aussge macht nun aber nur Sinn WENN Du beides, Makros und Funktion, in einer DAtei haben musst, also habe ich beides in eine Datei (Pattern_Configurator_mitFunktion.ods) gepackt, aber so das das "Option VBASupport 1" bei der Funktion nicht vorhanden ist und somit die Funktion funktioniert.

Ob die Makros funktionieren, habe ich mir nicht angesehen, weil bisher nicht die REde davon war das diese nicht funktioniert hätten (oder übersehe ich da etwas) und da die Makros in meiner Beispieldatei (Pattern_Configurator_mitFunktion.ods) völlig unverändert sind, sollten sie funktionieren WENN sie in der ursprünglichen Datei (Pattern_Configurator.zip) funktioniert haben.


Ansonsten zumindest Folgendes zum Verständnis:
Das AOO manche Dinge kann die LO nicht kann (und umgekehrt) IST so und nicht zu ändern.
Ebenso IST es ein Faktum das weder AOO noch LO jeglichen VBA-Code ausführen können, sondern es gibt Dinge die (auch bei gesetzter Option "Option VBASupport 1" ) nicht funktionieren werden.

Es kann nun sein das durch Zusammenwirken beider gerade benannten Sachverhalte es im Konkreten einfach nicht möglich ist den VBA-Code mit 100%ig kompletter Funktion, in entweder AOO oder LO, zum Laufen zu bekommen. Wenn das hier so wäre (das kann ich bisher nicht mit Sicherheit sagen) dann ist schlicht der Punkt erreicht wo Du die Makros auf Starbasic umschreiben musst. ES gibt dann keine anderen Weg.


Gruß
Stephan

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

Re: Verwendung eines einfachen Makros in Tabelle geht nicht, wenn „Option VBASupport 1“ aktiv ist

Beitrag von Stephan » Sa, 13.04.2019 15:39

Nachtrag:
Im Zelle K2 wird Testweise die Makro Funktion „=mybin2dec(K1)“ verwendet. Sie wandelt eine Binärzahl in eine Dezimalzahl um. Auch diese Funktion geht nach dem Laden der Datei nicht. Die Zelle zeigt „###“ = „#NAME?“. Wenn man den Basic Editor öffnet , etwas ändert (Leerzeichen) und anschließend Zelle K2 („=mybin2dec(K1)“) ändert, dann funktioniert das Makro. Das ist genau so wie bei der Testdatei.
Der Grund dafür ist IN DIESEM FALLE aber völlig klar, wenn das Problem mit AOO auftritt. Die Funktion "mybin2dec" befindet sich in der Bibliothek "VBAPoject" und dort wird sie von AOO nicht gefunden, weil AOO solche Funktionen aussschliesslich in der Bibliothek "Standard" erwartet.

Wenn es also darum geht diese Funktion in AOO lauffähig zu machen (ohne sie in die Bibliothek "Standard" zu verschieben, weil die Funktion die Makro-Option braucht die aber wiederum in "Standard" abgeschaltet sein muss wegen der anderen Funktion) könnte man höchstens versuchen diese Funktion nach "Standard" zu verlegen und dann aber den Funktionscode in der anderen Bibliothek zu belassen (Name der Funktion muss dann ein anderer sein) und diesen Code dort von der Funktion in "Standard" aus aufzurufen.
Müsste man testen ob das klappt, weiß ich nicht.


Gruß
Stephan

Hardi
Beiträge: 7
Registriert: Sa, 13.04.2019 00:58
Wohnort: Mainz

Re: Verwendung eines einfachen Makros in Tabelle geht nicht, wenn „Option VBASupport 1“ aktiv ist

Beitrag von Hardi » Sa, 13.04.2019 18:14

Hallo Stephan,

vielen Dank für Deine Unterstützung.

Das “mySum” Beispiel hatte ich nur kreiert um die Problematik zu zeigen. Im Programm benötige ich es nicht. Ich dachte mir, dass es gut ist, wenn man ein minimales Beispiel hat an dem die Problematik gezeigt werden kann bei Fragen in einem Forum. Das ich damit Verwirrung gestiftet habe wollte ich natürlich nicht.
Stephan hat geschrieben:
Sa, 13.04.2019 15:39
Der Grund dafür ist IN DIESEM FALLE aber völlig klar, wenn das Problem mit AOO auftritt. Die Funktion "mybin2dec" befindet sich in der Bibliothek "VBAPoject" und dort wird sie von AOO nicht gefunden, weil AOO solche Funktionen aussschliesslich in der Bibliothek "Standard" erwartet.
Das ist die Information die mir gefehlt hat!

Komisch ist aber, dass AOO und LO die Funktionen kennt, wenn man den Code im Basic Editor verändert hat. Die Hoffnung währe gewesen, dass es einen Trick gibt wie man das dem Programm beibringen kann ohne dass man den Basic Editor öffnen muss.
Vielleicht kann man dem Programm durch einen vorangestellten Modulnamen sagen wo es die Funktion suchen soll: „=vbaproject.main.mybin2dec(K1)“.
Das geht aber leider nicht. Vielleicht ein anderer Syntax?


Stephan hat geschrieben:
Sa, 13.04.2019 15:39
Wenn es also darum geht diese Funktion in AOO lauffähig zu machen (ohne sie in die Bibliothek "Standard" zu verschieben, weil die Funktion die Makro-Option braucht die aber wiederum in "Standard" abgeschaltet sein muss wegen der anderen Funktion) könnte man höchstens versuchen diese Funktion nach "Standard" zu verlegen und dann aber den Funktionscode in der anderen Bibliothek zu belassen (Name der Funktion muss dann ein anderer sein) und diesen Code dort von der Funktion in "Standard" aus aufzurufen.
Müsste man testen ob das klappt, weiß ich nicht.
Das habe ich schon probiert. Bin dann aber daran gescheitert, dass ich nicht wusste wie ich im Standard mit einem Range (Bereich mehrerer Zellen) umgehe. Ich habe mich bis eben noch nicht mit AOO und LO beschäftigt. Aber das finde ich heraus.

Ich werde mich daran versuchen…


Hardi
Zuletzt geändert von Hardi am So, 14.04.2019 12:57, insgesamt 1-mal geändert.

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

Re: Verwendung eines einfachen Makros in Tabelle geht nicht, wenn „Option VBASupport 1“ aktiv ist

Beitrag von Stephan » Sa, 13.04.2019 19:03

Komisch ist aber, dass AOO und LO die Funktionen kennt, wenn man den Code im Basic Editor verändert hat. Die Hoffnung währe gewesen, dass es einen Trick gibt wie man das dem Programm beibringen kann ohne dass man den Basic Editor öffnen muss.
Falls Du damit leise Zweifel anmelden möchtest, dann nur zur Sicherheit: AOO/LO kennen die dann deshalb weil Du durch das Ändern automatisch das Laden der Bibliothek auslöst.
Das Ganze ist bekannt und dieses Verhalten also nichts völlig Ungewöhnliches. Beim Zugriff per Makro auf nicht angemeldete Bibliotheken ist es sogar so das Programm das per Fehlermeldung bemängelt, im selben Moment aber die Bibliothek danach angemeldet ist.

Hier bei benutzerdefinierten Funktionen die im Tabellenblatt aufgerufen werden ist die Situation (erfahrungsgemäß) deshalb noch komplizierter weil der Zugriff Teil des Ladens der Datei ist und per Code noch nicht das gesamte Dokument (Dokument-Objekt) erreicht werden kann [1], weswegen ich auch pessimistisch bin das es über den Umweg über eine andere Bibliothek zu lösen wäre, jedoch ist es das Beste was mir einfällt.
Vielleicht ein anderer Syntax?
Nein, geht nicht.
Das habe ich schon probiert. Bin dann aber daran gescheitert, dass ich nicht wusste wie ich im Standard mit einem Range (Bereich mehrerer Zellen) umgehe.
Mein Vorschlag war doch nur von einer Funktion aus eine Andere aufzurufen. Also z.B. existiere bisher die Funktion:

Code: Alles auswählen

Function  mySum(a as long, b as long) as long  
  mySum = a + b  
End Function
dann sollst Du nichts weiter tun als:

Code: Alles auswählen

Function  mySum(a as long, b as long) as long  
  mySum = mySum_work(a, b)  
End Function

Function  mySum_work(a as long, b as long) as long  
  mySum_work = a + b  
End Function
Inzwischen ist das aber ohnehin hinfällig weil Du ja schreibst mySum sei nur ein Beispiel, woraus folgt Du kannst die Funktionen/Makros gleich alle in die Bibliothek "Standard" packen.


Offen gesagt würde ich mich, an Deiner Stelle, nun auch nicht allzulange damit beschäftigen es ohne Umschreiben des Code auf StarBasic lösen zu wollen, denn ob das im konkreten Fall klappt ist nicht sicher und u.U. stellst Du nach Stunden des Probierens fest das es nicht geht.
Ja, ich sehe wie der Code insgesamt beschaffen ist und das das Umschreiben etwas Arbeit machen wird, weshalb das Vorstehende nur ein Rat ist.


Gruß
Stephan


[1]
erläuterndes Beispiel für AOO:
in der angehängten Datei sind zwei benutzerdefinierte Funktionen:

Code: Alles auswählen

Function jms1()
jms1 = ThisComponent.URL
End Function

Function jms2()
jms2 = ThisComponent.getLocation
End Function
Beim Öffnen der Datei liefert aber nur eine Funktion die Dokumentadresse als Text. Wenn Du jedoch NACHDEM die Datei fertig geladen ist UMSCHALT+STRG+F9 drückst um die Zellwerte neu zu berechnen liefern plötzlich beide Funktionen ein Ergebnis.

Hardi
Beiträge: 7
Registriert: Sa, 13.04.2019 00:58
Wohnort: Mainz

Re: Verwendung eines einfachen Makros in Tabelle geht nicht, wenn „Option VBASupport 1“ aktiv ist

Beitrag von Hardi » Sa, 13.04.2019 23:10

Hallo Stephan,

ich habe die VBA Makros ein bisschen angepasst und wie Du vorgeschlagen hast einen Wrapper geschrieben der in einem Standard Modul liegt:

Code: Alles auswählen

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

Function CalculatePattern_Wrapper(ChannelsRange As Variant, BitLenRange As Variant) As String
  CalculatePattern_Wrapper = CalculatePattern(ChannelsRange, BitLenRange) 
End Function

Function Calculate_Goto_Wrapper(ChannelsRange As Variant, GotoModeRange As Variant, GotoTabRange As Variant) As String 
  Calculate_Goto_Wrapper = Calculate_Goto(ChannelsRange, GotoModeRange, GotoTabRange)
End Function
Damit funktioniert alles wie es soll, ABER wenn man die Datei schließt und wieder öffnet kennt LO die VBA Makros wieder nicht. Dann beginnt wieder das Spiel Basic Editor öffnen, Leerzeichen eingeben. Und schon geht es…

Open Office kennt die Makros in dem VBA Modul genau so wenig. Hier laufen aber die VBA Makros nicht, weil einige VBA-Befehle nicht unterstützt werden ;-(

Ich werde das ganze jetzt erst mal bei Seite legen und den Usern schreiben was gemacht werden muss damit die Makros funktionieren. Vielleicht findet sich mal einer der das Problem beheben kann.

Hier nochmal der letzte Stand:
Pattern_Configurator_mit_Wrapper.zip
(37.66 KiB) 41-mal heruntergeladen

Ganz vielen Dank für Deine Hilfe.


Hardi
Zuletzt geändert von Hardi am So, 14.04.2019 12:57, insgesamt 1-mal geändert.

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

Re: Verwendung eines einfachen Makros in Tabelle geht nicht, wenn „Option VBASupport 1“ aktiv ist

Beitrag von Stephan » So, 14.04.2019 10:03

Damit funktioniert alles wie es soll,
Wie denn?

Der Wrapper ist hinfällig, kann nichts bewirken, weil Dein Makro mySum nur ein Beispiel war, folglich die Aufteilung in 2 Bibliotheken überhaupt nicht nötig oder vorteilhaft ist. )was ich erst NACH meinem VBorschlag wusste, da Du erst zu dieserm Zeitpunkt schriebst:
Das “mySum” Beispiel hatte ich nur kreiert um die Problematik zu zeigen. Im Programm benötige ich es nicht.
ABER wenn man die Datei schließt und wieder öffnet kennt LO die VBA Makros wieder nicht.
Richtig. Genau das hast Du schon geschrieben und ich hatte die Gründe erklärt:
Falls Du damit leise Zweifel anmelden möchtest, dann nur zur Sicherheit: AOO/LO kennen die dann deshalb weil Du durch das Ändern automatisch das Laden der Bibliothek auslöst.
DEin Anpassen der Makros ist nun auch nichts Anderes und löst genauso das REgistrieren der Bibliothek aus, weshalb diese danach, bis zum nächsten Neuöffnen, funktioniert.
Open Office kennt die Makros in dem VBA Modul genau so wenig.
Das allerdings darf nicht sein. Hast Du dafür eine Beispieldatei? Wohlgemerkt die Makros müssen in "Standard" sein und das können sie deshalb problemlos weil Du die Funktion mySum nicht brauchst, dafür also auch keine separate Bibliothek brauchst und deshalb alle Makos aus "VBAProject" nur nach "Standard" verschieben musst.



Gruß
Stephan

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

Re: Verwendung eines einfachen Makros in Tabelle geht nicht, wenn „Option VBASupport 1“ aktiv ist

Beitrag von Stephan » So, 14.04.2019 10:53

Wie schon angenommen werden die Funktionen problemlos erkannt wenn sie sich in der Bibliothek "Standard" befinden.
Unter LibreOffice (getestet mit LO 6.0.3) funktioniert es dann ohne Fehlermeldung. Ob die Ergebnisse in E14 und E17 den Erwartungen entsprechen kann ich nicht sagen.


Gruß
Stephan
Dateianhänge
Pattern_Configurator_allesInStandard.ods
(39.46 KiB) 43-mal heruntergeladen

Hardi
Beiträge: 7
Registriert: Sa, 13.04.2019 00:58
Wohnort: Mainz

Probleme beim importieren von VBA Programmen (Gelöst)

Beitrag von Hardi » So, 14.04.2019 12:52

Hallo Stephan,

10000000000 Dank,

das war eine schwere Geburt. Ich finde es ganz toll, dass Du Dir so unendlich viel Zeit genommen hast.

Das Makro funktioniert perfekt!

Und ich habe Dich einfach nicht verstanden…

Edit: 14.04.19 18:07:
Offensichtlich habe ich es immer noch nicht verstanden ;-(, darum habe ich meine Zusammenfassung gelöscht.

Hardi
Zuletzt geändert von Hardi am So, 14.04.2019 18:07, insgesamt 1-mal geändert.

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

Re: [GELÖST] Probleme beim importieren von VBA Programmen => Code muss nach "Standard" verschoben werden

Beitrag von Stephan » So, 14.04.2019 13:39

Libre Office (und Open Office) führen Makros nur dann aus, wenn sie im Modul Standard sind:
Absolut falsch, weil das Gesagte ausschließlich zutrifft für Funktionen die gleichzeitig als benutzerdefinierte Funktionen in Tabellenformeln aufgerufen werden, hingegen nicht für gewöhnliche Funktionen und schon garnicht für Makros.


Gruß
Stephan

Toxitom
********
Beiträge: 3616
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: [GELÖST] Probleme beim importieren von VBA Programmen => Code muss nach "Standard" verschoben werden

Beitrag von Toxitom » So, 14.04.2019 16:57

Hallo Hardy,

hier gibst Du falsche Informationen weiter! Bitte nicht! Stephan hat schon widersprochen.

Ich will Dir noch eine kurze Erklärung dazu geben:

LibreOffice ( und OpenOffice) können und führen Makros nur dann aus, wenn die entsprechenden Bibliotheken (also die Container, in denen diese Makros stehen) vorher explizit geladen werden. Ansonsten existieren diese für das Programm nicht.

Einzige Ausnahme: Die Bibliothek Namens "Standard" wird immer automatisch geladen - sowohl aus dem Bereich "Meine Makros" als auch im Dokument. Aber auch nur diese!

Deswegen funktionieren benutzerdefinierte Funktionen in Calc typischerweise nur, wenn sie in der Bibliothek "Standard" stehen. Dort können Sie gefunden werden.

Du kannst natürlich problemlos ein Lademakro schreiben, das Deine (Code-)Bibliotheken und die benötigten Dialog-Bibliotheken z.B. so:

Code: Alles auswählen

sub myMakroInit
  if NOT BasicLibraries.isLibraryLoaded("VBAProject") then BasicLibraries.loadLibrary("VBAProject")
end sub
Das Makro kannst Du nun mit dem Event "Dokument öffnen" verknüpfen, dann ist Deine Bibliothek immer vorgeladen!

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic

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

Re: [GELÖST] Probleme beim importieren von VBA Programmen => Code muss nach "Standard" verschoben werden

Beitrag von Stephan » So, 14.04.2019 17:45

Du kannst natürlich problemlos ein Lademakro schreiben, das Deine (Code-)Bibliotheken und die benötigten Dialog-Bibliotheken z.B. so:
hier liegt die Besonderheit vor das eine Funktion mittels Formel in einer Calc-Zelle aufgerufen werden soll und dafür muss zumindest in OO [1] die Funktion auf jeden Fall in der Bibliothek namens "Standard" sein. Laden einer anderen Bibliothek durch ein Autostartmakro genügt nicht.

[1]
Bei LO war das, als ich meine ursprünglichen Antworten schrieb, bei einem kurzen Test nicht der Fall, weswegen ich auch da nur von AOO sprach. Das genaue Verhalten von LO habe ich aber nicht verifiziert und weiß auch nicht seit wann das anders ist.


Ein Beispiel hänge ich an. Das Autostartmakro ist das Deine (in Bibliothek "Standard" gespeichet):

Code: Alles auswählen

sub myMakroInit
  if NOT BasicLibraries.isLibraryLoaded("VBAProject") then BasicLibraries.loadLibrary("VBAProject")
end Sub
dieses Makro wird beim Öffnen des Dokuments per Ereignis gestartet.

Trotzdem dadurch die Bibliothek "VBAProject" geladen wird ist die dort befindliche Funktion:

Code: Alles auswählen

Function  mySum(a as long, b as long) as long  
  mySum = a + b  
End Function
nicht in einer Tabellenzelle aufrufbar (getestet AOO 4.1.6).
Das auch nicht deshalb weil vielleicht das Laden der Bibliothek zeitlich nach dem INitialisieren des Funktionsaufrufs in der Zelle erfolgen würde sondern generell, denn Du kannst nacvh vollständigem Laden der Datei STRG+UMSCHALT+F9 drücken und die Funktion funktioniert weiterhin nicht.

Hinweis für "Hardi": Natürlich würde die Funktion, unter gleichen Rahmenbedingungen, funktionieren, wenn sie (nach dem Öffnen der Datei) per Makro aufgerufen würde, nur der Fall liegt nicht vor.


Gruß
Stephan
Dateianhänge
mySum_mitLoadLibrary.ods
(13.84 KiB) 41-mal heruntergeladen

Hardi
Beiträge: 7
Registriert: Sa, 13.04.2019 00:58
Wohnort: Mainz

Re: [GELÖST] Probleme beim importieren von VBA Programmen => Code muss nach "Standard" verschoben werden

Beitrag von Hardi » So, 14.04.2019 18:31

Hallo Stephan, Hallo Tom,

ich habe Gestern oder war es vorgestern das erste Mal Kontakt mit Open Office und Libre Office gehabt. Darum Verzeiht mir meine falsche Zusammenfassung. Ich wollte es den anderen Lesern mit meinen Worten erklären. Das ist Meiner Meinung nach eine der Aufgaben eines Forums. Einem wird geholfen und viele andere profitieren davon. Natürlich wäre es fatal, wenn dann ein unwissender wie ich falsches Zeug veröffentlicht. Darum habe ich die Zusammenfassung gelöscht.

Eigentlich traue ich mich gar nicht noch mal nachzuhaken. Das Beispiel „mySum_mitLoadLibrary.ods“ von Stephan funktioniert bei mir wieder nicht so wie ich das erwartet hätte. Weder mit Open Office noch mit Libre Office. Wenn ich die Datei öffne, dann sehe ich folgendes:

Code: Alles auswählen

a:      4
b:      2
mySum:  #NAME?
Ich hatte Euch so verstanden, dass über den „loadLibrary“ Befehl das VBA Modul geladen wird und das der „mySum“ Befehl darum von Calc erkannt werden sollte.
Auch wenn ich STRG+UMSCHALT+F9 drücke kennt Calc den „mySum“ Befehl nicht und zeigt weiterhin „#Name?“. Erst wenn ich dann in Zelle B3 etwas ändere, dann wird der Befehl erkannt und Funktioniert von da an (Bis ich das Programm schließe).

Zur Prüfung ob der „loadLibrary“ Befehl aufgerufen wird habe ich zwei „MsgBox“ Befehle eingebaut:

Code: Alles auswählen

sub myMakroInit
  MsgBox("myMakroInit") 
  if NOT BasicLibraries.isLibraryLoaded("VBAProject") then 
     MsgBox("Loading VBAProject")
     BasicLibraries.loadLibrary("VBAProject")
  endif   
end sub
Bei einem Neustart des Programms werden beide Meldungen ausgegeben.

=> Ich muss noch viel lernen ;-(

Aber ich bin glücklich damit, dass Stephan mir geholfen hat das mein Programm jetzt auch unter Libre Office läuft.

Hardi

Antworten