Calc: Makro-Laufzeitfehler

Hallo Boris,

ich habe jetzt einmal ein wenig herumgespielt und festgestellt, dass die Funktion - unter der Annahme, dass sie in der Standard-Bibliothek der Anwendung gespeichert ist - ohne Fehler durchläuft, wenn die Datei aus einer schon bestehenden LO-Umgebung geöffnet wird, egal ob aus der Liste der zuletzt verwendeten Dokument oder über den Öffnen-Dialog oder durch Doppelklick auf den Dateinamen im OS-Dateimanager.

Der Fehler tritt nur auf, wenn die Datei im LO-Startfenster als zuletzt verwendetes Dokument oder LO erst durch Doppelklick auf den Dateinamen im OS-Dateimanager gestartet wird. Das liegt wohl daran, dass der Stardesktop zu diesem Zeitpunkt noch keine Komponente enthält, außer der IDE, die für die Fehlermeldung geöffnet wurde.

Wie man das Problem lösen kann, weiß ich allerdings nicht.

Schöne Grüße
Volker

Sorry, da wurde ich Opfer eines Schreibfehlers in meinem Test-Skript.

Die einzige geöffnete Komponente trägt den Namen com.sun.star.comp.sfx2.BackingComp.

Was das ist, muss ich noch herausfinden.

sgv

Offensichtlich ist die BackingComp-Komponente das LO-Startfenster. Denn wenn LO zugleich mit einem Doppelklick im Dateimanager auf die Calc-Datei gestartet wird, ist zu dem Zeitpunkt der Fehlermeldung noch gar keine Komponente geöffnet.

Keine Ahnung, wie man das Problem lösen könnte.

Schöne Grüße
Volker

Nachdem ich noch einmal genauer hingeschaut habe, wird mir klar, dass die Funktion niemals funktioniert. Denn LO führt das Makro offenbar aus, bevor die Komponente geladen wird.

Meine scheinbar positiven Tests haben die DocumentProperties aus einer schon vorher geöffneten Datei bezogen, die mit ThisDocument referenziert wurde. Ich habe mich täuschen lassen.

Es geht wohl wirklich nur, wenn das Makro in der Standard-Bibliothek des Dokuments gespeichert ist.

Schöne Grüße
Volker

Hallo Boris,

das freut mich, dass das Problem damit in Deinem Sinne gelöst ist.

Warum das Makro ohne Nachfrage funktioniert, kann ich Dir nicht wirklich erklären. Aber ich vermute mal, weil es Bestandteil dieser CALC-Datei ist. Aber da gibt es hier im Forum sicherlich jemanden, der das etwas fundierter erklären kann.

Bitte Antworten immer an users@de.libreoffice.org, damit die anderen Foren-Mitglieder auch über den aktuellen Stand informiert sind.

Viele Grüße
Hans-Werner :-)) --- Ist doch gar nicht so unaussprechlich ;-))

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

Hallo Boris,

OoOHWHOoO ist eine Kombination aus

OoO "Auge-Nase-Auge" = https://de.wikipedia.org/wiki/Kilroy_was_here
HansWernerHerold
OoO "Auge-Nase-Auge" = https://de.wikipedia.org/wiki/Kilroy_was_here

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

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

Hallo Boris,

das Problem bleibt mir dasselbe. Das Makro ist im Dokument gespeichert und wird bei hoher Makrosicherheit beim Öffnen erkannt, und es resultiert eine Sicherheitsabfrage.

Schöne Grüße
Volker

Hallo Volker und Co.
Wenn du ein Dokument mit Makros öffnen willst und es bei dir auf dem Rechner hast, sollte dies auch mit hohem Makrosicherheitslevel möglich sein.
Du musst dabei so vorgehen:
1. Öffne als erstes Writer - nur das Programm und kein Dokument.
2. In Writer selbst gehe auf Extras --> Optionen. Öffne dort den Punkt LibreOffice --> Sicherheit und klicke dort auf Makrosicherheit.
3. Bei der Makrosicherheit klicke auf den Reiter "Vertrauenswürdige Quellen" und im Bereich Vertrauenswürdige Speicherorte auf "Hinzufügen ...".
4. Suche nun das Verzeichnis, in dem das fragliche Dokument ist und klicke "OK".
5. Spätestens, wenn du jetzt das Programm einmal schließt und wieder öffnest, sollte LibreOffice alle Dateien aus dem fraglichen Verzeichnis durch die "Sichheitskontrolle" lassen, ohne sich zu beschweren.
Hoffe, ich konnte dir helfen.
GrußDaniel

Hallo Boris,

das Problem bleibt mir dasselbe. Das Makro ist im Dokument gespeichert
und wird bei hoher Makrosicherheit beim Öffnen erkannt, und es
resultiert eine Sicherheitsabfrage.

Schöne Grüße
Volker

Hallo Daniel,

danke, aber genau das wollte Boris nicht. Es ist in der Firma offenbar nicht praktikabel. Er verfolgt momentan den Ansatz eines Sicherheitszertifikats.

Schöne Grüße
Volker

Hallo Boris,

für den Fall, dass du immer noch Schwierigkeiten mit dem Sicherheitszertifikat hast, kann ich dir eine nicht wirklich elegante, aber m.E. funktionierende Lösung auch mit hoher Makrosicherheit vorstellen.

1. Du löscht alle Makros in der Standard-Bibliothek des Dokuments, am besten durch Löschung der existierenden Module.

2. Du verwendest, wie von Werner Tietz vorgeschlagen, die Error-Behandlung, gespeichert in Meine Makros & Dialoge/Standard:

Function ChangedOn() As Date
   Dim oDoc
   Dim ChgDate
   On Error Resume Next
   oDoc = ThisComponent
   ChgDate = oDoc.DocumentProperties.ModificationDate
   'ChgDate ist leer, wenn das Dokument noch nie gespeichert wurde. In diesem Fall CreationDate nutzen
   If ChgDate.Year = 0 Then
     ChgDate = oDoc.DocumentProperties.CreationDate
   End If
   ChangedOn = DateSerial(ChgDate.Year, ChgDate.Month, ChgDate.Day)
End Function

3. Du erstellst ein Makro zur Neuberechnung aller Tabellen und speicherst es genau wie "ChangedOn" in Meine Makros ...:

Sub CalculateAll()
   ThisComponent.calculateAll()
End Sub

4. Du öffnest die Datei und verknüpfst über Extras/Anpassen/Ereignisse - Achtung: in der Zeile unter der Liste die Datei auswählen, nicht LibreOffice! - die Ereignisse "Ansicht wurde erzeugt" sowie "Dokument wurde gespeichert" jeweils mit dem Makro CalculateAll.

Wenn du die Datei öffnest, wird ChangedOn entweder leer sein oder aus einer anderen geöffneten Datei stammen. Es wird aber kein Fehler angezeigt. Wenn aber einen Augenblick später die Ansicht erzeugt ist, wird ThisComponent dann endlich diese Datei referenzieren, und alles wird sofort neu berechnet, woraufhin ChangedOn den korrekten Wert erhält. Den zwischenzeitlich falschen Wert wirst du nicht bemerken. Außerdem wird ChangedOn auch nach jedem Speichern aktualisiert.

Probier es einmal aus. Bei mir funktioniert es.

Schöne Grüße
Volker

Kleine Schusseligkeit in Punkt 4:
Es muss heißen: ... - Achtung: in der Zeile unter der Liste LibreOffice auswählen, nicht die Datei - ...

Schöne Grüße
Volker

Eine Klarstellung, die nach einem Einwand nötig ist:

Meine Idee zur Nutzung eines Makros zur Neuberechnung betrifft natürlich *alle* LO-Dokumente. Daher bedarf es einer Anpassung des Makros. Am einfachsten ist auch hier wieder die Fehlerbehandlung mit Resume Next, so dass bei z.B. Writer-Dokumenten keine Fehlermeldung kommt.

Wenn nur bestimmte Calc-Dokumente betroffen sein sollen, kann man z.B. eine benutzerdefinierte Dokumenteigenschaft einsetzen, sagen wir "Neuberechnen per Makro" mit booleschem Wert.

Dann könnte das Makro so aussehen:

Sub CalculateAll()
   Dim oDoc
   Dim oUDP 'Alle benutzerdefinierten Eigenschaften
   On Error Resume Next 'Kann ja nicht schaden
   oDoc = ThisComponent
   oUDP = oDoc.DocumentProperties.UserDefinedProperties
   If oUDP.PropertySetInfo.hasPropertyByName("Neuberechnen per Makro") Then
     If oUDP.getPropertyValue("Neuberechnen per Makro") Then
       oDoc.calculateAll()
     End If
   End If
End Sub

Ist alles ziemlich aufwändig. Der Weg, die ChangedOn-Funktion unter Verwendung der mittleren Makrosicherheit im Dokument zu speichern, ist auch im Hinblick auf die Verwendung in einem komplexen Firmennetz sicher erheblich einfacher.

Man sieht aber auch, wie flexibel LO eingesetzt werden kann.

Schöne Grüße
Volker