Calc: Makro-Laufzeitfehler

Hallo,
um das Speicherdatum automatisiert in eine Zelle zu bekommen, habe ich
folgendes Makro (nicht von mir, sondern gefunden gekriegt) in mein
Calc-Dokument eingebaut:

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

Function ChangedOn() As Date

  Dim oSheet As Object
  Dim ChgDate As Variant
  
  oSheet = ThisComponent()
  
  ChgDate = oSheet.DocumentProperties.ModificationDate

' ChgDate ist leer, wenn das Dokument noch nie gespeichert wurde. In diesem Fall CreationDate nutzen

  If ChgDate.Year = 0 Then
    ChgDate = oSheet.DocumentProperties.CreationDate
  End If
  
  ChangedOn = DateSerial(ChgDate.Year, ChgDate.Month, ChgDate.Day)
  
End Function

Dieses Makro nutze ich, indem ich es in der gewünschten Zelle mit
=CHANGEDON()
aufrufe.

Beim Öffnen des Tabellendokuments begegnet mir die Meldung:

BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: DocumentProperties.

Nach manuellem Aktualisieren mit [Strg]+[Shift]+[F9] ist allerdings das
Speicherdatum in der Zelle korrekt. Für die Funktion scheint es nicht
direkt schädlich zu sein, aber es stört natürlich, wenn man erst einmal
zwei Fenster (die Meldung und das Makro-Fenster) schließen muss, bevor
man arbeiten kann, und es macht keinen guten Eindruck, wenn man die
Tabelle weiterreicht.

Was bedeutet diese Meldung?
Wie lässt sich das abstellen?

Hallo Boris,

ich kann das nicht nachvollziehen, bei mir läuft das ohne Fehler. Abgesehen davon, dass oSheet kein guter Variablenname ist, weil die Variable ja nicht das Blatt bezeichnet, sondern das ganze Dokument, halte ich das Makro auch vom Lesen her für korrekt.
Wenn es möglich ist, dein Dokument in der Cloud zur Verfügung zu stellen, könnte man da noch weiter schauen.

Viele Grüße
Gerhard

Hallo Boris,

Beim Öffnen des Tabellendokuments begegnet mir die Meldung:

BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: DocumentProperties.

Das bedeutet doch, dass Du das Makro automatisch mit dem Start Deines
Dokumentes starten willst. Mit welcher Eigenschaft des zu öffnenden
Dokumentes ist das ganze denn verbunden?

Gruß

Robert

Hei Boris,

bau mal ne wait() Funktion ins Makro ein. Benutzerdefinierte Funktionen werden sehr früh aufgelöst, kann sein, dass manche Dokumentobjekte zu dem Zeitpunkt noch nicht verfügbar sind.

Ich würde mal mit   wait(1000)  nach der Zeile    oSheet = ThisComponent()  beginnen und austesten, evt. dann den Wert reduzieren.

VG

Thomas

Hallo Boris,

vermutlich hast du deine Funktion im Anwendungs-Bibliothekscontainer stehen. Verschiebe sie in den Dokumentcontainer und alles wird gut sein.

Schöne Grüße
Volker

Hallo,

ich kann das nicht nachvollziehen, bei mir läuft das ohne Fehler.

Es tritt auch nicht bei jedem Öffnen auf, oder nicht bei jedem Dokument.
Eine Regelmäßigkeit dafür habe ich bislang noch nicht entdecken können.

Abgesehen davon, dass oSheet kein guter Variablenname ist, weil die
Variable ja nicht das Blatt bezeichnet, sondern das ganze Dokument,
halte ich das Makro auch vom Lesen her für korrekt.

Soweit ich das verstehe, geht es um das Dokument als Ganzes, da man ein
einzelnes Blatt nicht speichert, sondern das Dokument als Ganzes. Oder
verstehe ich Dich miss?

Wenn es möglich ist, dein Dokument in der Cloud zur Verfügung zu
stellen, könnte man da noch weiter schauen.

Da muss ich erst eine Erlaubnis einholen.

Hallo,

Hallo Boris,

Beim Öffnen des Tabellendokuments begegnet mir die Meldung:

BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: DocumentProperties.

Das bedeutet doch, dass Du das Makro automatisch mit dem Start Deines
Dokumentes starten willst. Mit welcher Eigenschaft des zu öffnenden
Dokumentes ist das ganze denn verbunden?

da weiß ich nicht mehr, als ich mir beim Lesen des Makros zusammenreimen
kann: es ist das Datum der letzten Änderung, und falls dieses nicht
verfügbar ist, das Datum der Erzeugung. Wie gesagt: ich bin mit Makros
und Basic nicht vertraut...

Hallo,

Hei Boris,

bau mal ne wait() Funktion ins Makro ein. Benutzerdefinierte Funktionen
werden sehr früh aufgelöst, kann sein, dass manche Dokumentobjekte zu
dem Zeitpunkt noch nicht verfügbar sind.

Ich würde mal mit   wait(1000)  nach der Zeile    oSheet =
ThisComponent()  beginnen und austesten, evt. dann den Wert reduzieren.

Danke, habe ich gemacht.
Leider ohne Erfolg: die Fehlermeldung erscheint weiterhin, und das Datum
wird wie bisher zunächst auf den 31.12.1899 gesetzt und erst nach
[Strg]+[Shift]+[F9] auf das letzte Speicherdatum. Neu ist jetzt, dass
nach dem Drücken der Tastenkombination für die unbedingte Neuberechnung
etwa eine Sekunde vergeht, bis auf das Speicherdatum gewechselt wird.

Hallo,

Hallo Boris,

vermutlich hast du deine Funktion im Anwendungs-Bibliothekscontainer
stehen. Verschiebe sie in den Dokumentcontainer und alles wird gut sein.

fast alles: richtig ist, dass die Fehlermeldung nicht mehr erscheint.
Dafür funktioniert es nur, wenn ich die Makrosicherheit herabsetze und
dafür dann entweder eine andere Meldung bestätigen muss oder gar alle
Makros ohne Rückfrage zulasse. Es sei denn, ich signiere das Makro -wie
das geht, weiß ich aber nicht.

Hallo Boris,

vermutlich hast du deine Funktion im Anwendungs-Bibliothekscontainer
stehen. Verschiebe sie in den Dokumentcontainer und alles wird gut sein.

fast alles: richtig ist, dass die Fehlermeldung nicht mehr erscheint.
Dafür funktioniert es nur, wenn ich die Makrosicherheit herabsetze und
dafür dann entweder eine andere Meldung bestätigen muss oder gar alle
Makros ohne Rückfrage zulasse. Es sei denn, ich signiere das Makro -wie
das geht, weiß ich aber nicht.

Ich habe bei mir die Makrosicherheit auf "Mittel" eingestellt und vertrauenswürdige Speicherorte eingetragen.

Du willst das Makro ja mit anderen teilen. Dafür musst du aber den anderen erläutern, wie sie die Funktion in die "Standard"-Bibliothek unter "Meine Makros & Dialoge" einfügen. Es mag einfacher sein, ihnen nahezulegen, ein vertrauenswürdiges Verzeichnis auszuwählen und die betreffende Datei dort zu speichern.

Schöne Grüße
Volker

Hallo,

Ich habe bei mir die Makrosicherheit auf "Mittel" eingestellt und
vertrauenswürdige Speicherorte eingetragen.

das hatte ich auch im trüben Gedächtnis, aber wie/wo man das tut, habe
ich nicht gefunden. Wobei die Dateien, die aus diesen Vorlagen erstellt
werden, vieldutzendfach an verschiedenen Ästen und Zweigen eines
Verzeichnisbaums abgelegt werden, die von den anderen Nutzern im Büro
auch noch an anderen Stellen eingehängt werden (Win7, Win10, Linux,
NAS...). Da müsste ich wohl erst noch empirisch ermitteln, ob und wie
das verlässlich funktioniert.

Du willst das Makro ja mit anderen teilen. Dafür musst du aber den
anderen erläutern, wie sie die Funktion in die "Standard"-Bibliothek
unter "Meine Makros & Dialoge" einfügen. Es mag einfacher sein, ihnen
nahezulegen, ein vertrauenswürdiges Verzeichnis auszuwählen und die
betreffende Datei dort zu speichern.

Andere haben andere Pfade auf ihren Rechnern. Ob man da dann weit kommt?

Zwischenzeitlich habe ich etwas mit Signierung herumprobiert, aber das
hat nicht recht geklappt. Vor allem erspart es keinen Abfragedialog beim
Öffnen, auch nicht, wenn man
[_] Makros aus dieser Quelle immer vertrauen
aktiviert; offenbar merkt LO sich das nicht.

Irgendwie ist es manchmal ziemlich aufwendig, sich die Arbeit zu
vereinfachen... :wink:

Hallo Boris,

Einstellung der Makrosicherheit:
Extras/Optionen...
LibreOffice/Sicherheit: Klick auf Makrosicherheit
Tab Sicherheitslevel: Mittel
Tab Vertrauenswürdige Quellen: Vertrauenswürdige Speicherorte

Dort kann man einen ganzen Verzeichnisbaum eintragen (oder mehrere).

Sicherheit hat seinen Preis :-/

Schöne Grüße
Volker

Hallo,

Einstellung der Makrosicherheit:
Extras/Optionen...
LibreOffice/Sicherheit: Klick auf Makrosicherheit

da scheine ich mir einiges verbogen zu haben, denn ich muss ganze
achtmal ein Meldungsfenster schließen:

Makro-Sicherheitsproblem!

Fehlerhafte Zertifikatsdaten: mQGNBGC537sBDADo8nsRaW3FHBkZC9Bnbz9XVRL+DjTnRTRCOXAZeEXUTRAZr+pentBqxI/73salBTDYjA2hWkt4dTot5 [...]

Mist... Keine Ahnung, woran das nun wieder liegt. Das war jedenfalls
nicht von Anfang an so.

Sicherheit hat seinen Preis :-/

Lieber wäre mir, es würde mit Signierung funktionieren. Dann würde nur
dieses eine vertrauenswürdige Makro funktionieren, und nicht alle, die
es irgendwie in das Verzeichnis geschafft haben. Immerhin landen da auch
alle Dateien, die Kunden und Behörden usw. uns zusenden. Da könnte man
die Makrosicherheit auch gleich ganz abschalten...

Was ich gemacht habe: Mit kleopatra (Linux) einen neuen lokalen
Schlüssel erstellt und damit das Makro signiert. Dabei auch schon einmal
doppelt, das doppelte wieder gelöscht... Naja, was man so macht beim
Ausprobieren. Dabei ist mir nicht gelungen, die Abfragedialoge komplett
zu umgehen; das gelingt hier bisher nur mit so einem Pfadeintrag oder
dem Abschalten der Makrosicherheit. Wenn ich nur wüsste, was ich falsch
mache -es sieht doch alles so harmlos aus... :wink:

Hallo Boris,

ich hab' mal im WEB recherchiert und eine sehr einfache Lösung gefunden und auch ausprobiert, die auch das machen sollte, was Du möchtest:

Sub ZeitStempel

' WEB: http://www.oooforum.de/viewtopic.php?t=47792
' Makro aktivieren wenn: CALC [Extras] [Anpassen] [Ereignisse] "Dokument speichern"
' Sheets(0) = 1. Tabellenblatt von links nach rechts gezählt
' getCellByPosition(0,0) = (x,y) = Spalte "A" (x) und Zeile "1" (y)
' now = aktuelles Datum und aktuelle Uhrzeit im Moment des "Ereignisses", hier "Dokument speichern"

ThisComponent.Sheets(0).getCellByPosition(0,0).Formula = Format(now(),"dd.mm.yy-hh:mm:ss")

End Sub

Dieses "Ein-Zeilen-Makro" wird direkt in der CALC-Datei "ZeitStempel.ods" gespeichert und mit dem Ereignis "Dokument speichern" verknüpft.

Von meiner CLOUD ( https://www.magentacloud.de/share/fg7ncichfq#$/ ) kannst Du Dir diese CALC-Datei herunter laden zum Ausprobvieren.

Vielleicht hilft Dir das ja weiter ...

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

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

Hallo Boris,

Hallo,

Einstellung der Makrosicherheit:
Extras/Optionen...
LibreOffice/Sicherheit: Klick auf Makrosicherheit

da scheine ich mir einiges verbogen zu haben, denn ich muss ganze
achtmal ein Meldungsfenster schließen:

Makro-Sicherheitsproblem!

Fehlerhafte Zertifikatsdaten: mQGNBGC537sBDADo8nsRaW3FHBkZC9Bnbz9XVRL+DjTnRTRCOXAZeEXUTRAZr+pentBqxI/73salBTDYjA2hWkt4dTot5 [...]

Mist... Keine Ahnung, woran das nun wieder liegt. Das war jedenfalls
nicht von Anfang an so.

Sicherheit hat seinen Preis :-/

Das war der ruhrdeutsche Genitiv :slight_smile: : unser Omma sein Häusken ...

Lieber wäre mir, es würde mit Signierung funktionieren. Dann würde nur
dieses eine vertrauenswürdige Makro funktionieren, und nicht alle, die
es irgendwie in das Verzeichnis geschafft haben. Immerhin landen da auch
alle Dateien, die Kunden und Behörden usw. uns zusenden. Da könnte man
die Makrosicherheit auch gleich ganz abschalten...

Was ich gemacht habe: Mit kleopatra (Linux) einen neuen lokalen
Schlüssel erstellt und damit das Makro signiert. Dabei auch schon einmal
doppelt, das doppelte wieder gelöscht... Naja, was man so macht beim
Ausprobieren. Dabei ist mir nicht gelungen, die Abfragedialoge komplett
zu umgehen; das gelingt hier bisher nur mit so einem Pfadeintrag oder
dem Abschalten der Makrosicherheit. Wenn ich nur wüsste, was ich falsch
mache -es sieht doch alles so harmlos aus... :wink:

Da kann ich dir mangels Erfahrung leider nicht helfen. Viel Erfolg dennoch.

Schöne Grüße
Volker

Natürlich anonymisiert, mit Beispieldatensätzen o.ä.

Oder ein neues, kurzes LO-Dokument, aus dem das Problem genau so hervor
geht wie im Originaldokument.

- --

MfG Richi

Hallo

Hallo,

Hei Boris,

bau mal ne wait() Funktion ins Makro ein. Benutzerdefinierte Funktionen
werden sehr früh aufgelöst, kann sein, dass manche Dokumentobjekte zu
dem Zeitpunkt noch nicht verfügbar sind.

Ich würde mal mit   wait(1000)  nach der Zeile    oSheet =
ThisComponent()  beginnen und austesten, evt. dann den Wert reduzieren.

Danke, habe ich gemacht.
Leider ohne Erfolg: die Fehlermeldung erscheint weiterhin, und das Datum
wird wie bisher zunächst auf den 31.12.1899 gesetzt und erst nach
[Strg]+[Shift]+[F9] auf das letzte Speicherdatum. Neu ist jetzt, dass
nach dem Drücken der Tastenkombination für die unbedingte Neuberechnung
etwa eine Sekunde vergeht, bis auf das Speicherdatum gewechselt wird.

Das pauschale `wait(…)` ist keine gute Idee, wie wärs mit:


Function ChangedOn() As Variant

      Dim oSheet As Object
      Dim ChgDate As Object

      On Error resume Next 'hier wird die Fehlermeldung abgefangen.

      doc = ThisComponent()

      ChgDate = doc.DocumentProperties.ModificationDate

  '    ChgDate ist leer, wenn das Dokument noch nie gespeichert wurde. In diesem Fall CreationDate nutzen

      If ChgDate.Year = 0 Then
          ChgDate = oSheet.DocumentProperties.CreationDate
      End If
      With ChgDate
          ChangedOn = dateSerial( .Year, .Month, .Day) + TimeSerial( .Hours, .Minutes, .Seconds)
      End With

End Function

trotzdem musst du ggf. die Neuberechnung nach dem Öffnen mit `strg+shift+enter` erzwingen.

nb: ich hab das noch ergänzt auf die Anzeige des vollen Datum-Zeitstempels, passe daher das Zellformat entsprechend an.

Hallo Boris,

ich halte Hans-Werners Vorschlag für besser, das Datum jeweils nur beim Speichern des Dokuments in eine Zelle zu schrieben, anstatt es bei jedem Öffnen neu zu holen. Abgesehen davon dürfte der Fehler (von dem wir ja offenbar noch nicht recht wissen, wodurch er ausgelöst wird) ja dann wohl nicht mehr auftauchen, es ist ja dann eine ganz andere Situation.
Der wait-Befehl, den Thomas vorschlug, bedeutet, dass das Programm 1000 Millisekunden warte, bevor es weiterläuft; das macht man, um länger dauernde parallele Prozesse abzuwarten. Daher musstest du nun 1 Sekunde länger warten. In meiner Praxis hat da übrigens immer wait(100) ausgereicht, was man normalerweise nicht mehr bemerkt, die Rechner sind ja jetzt schneller als früher.

Gruß
Gerhard

Hallo Boris und Alle,

Hallo,
um das Speicherdatum automatisiert in eine Zelle zu bekommen, habe ich
folgendes Makro (nicht von mir, sondern gefunden gekriegt) in mein

Mir ist schleierhaft, was das ganze Makro-Gedöns (ich schreib das jetzt mal
so, ist aber nicht negativ gemeint) soll. So um Makroprogrammierung zu lernen
oder zu üben: OK.

Calc hat doch die Möglichkeit in der Kopf- und/oder Fußzeile jeder Seite ein
Datum und die Uhrzeit auszugeben. Das ist, so wie ich es verstehe, das
aktuelle (Rechner-)Datum und die aktuelle (Rechner-)Uhrzeit. Reicht das nicht?

Soll dadurch eine gewisse "Steuer- oder Gerichtsfestigkeit" erreicht werden,
reicht ein Makro imho nicht aus. Denn das kann jederzeit geändert werden.

Hallo Matthias,

es geht eben nicht um das aktuelle Datum, sondern um das Datum des letzten Speicherns, also den Stand der Daten im Dokument.
Und auch nicht um Gerichtsfestigkeit, diese Info ist ja bereits durch LibreOffice gespeichert (also müsste ggf. diese Info auf Sicherheit geprüft werden), sondern darum, diese Angabe auf den ersten Blick im Datenblatt sichtbar zu machen.
Das Datum in der Kopf- und Fußzeile sieht man meines Wissens auch nur im Druck.

Gruß
Gerhard