BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[GELÖST] BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.

Alles zur Programmierung im LibreOffice.
Verstancla
Beiträge: 13
Registriert: Fr 21. Jan 2022, 10:58

[GELÖST] BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.

Beitrag von Verstancla » Mi 26. Jan 2022, 12:47

Leider habe ich keine Ahnung von LibreOffice Makros und Funktionen und kann darum auch nichts mit der unten aufgeführten Meldung anfangen. Dieses Funktion steht in einem Tabellenfeld meines CALC-Dokuments und soll automatisch das Datum der letzten Änderung beim Aufruf des Dokuments enthalten.

Beim Aufruf von CALC-Datei tritt dieser Fehler auf (s. Untenstehender Screenshot).
LibreOffice Version 7.2.4.1 (x64) Windows 10.0 Build 1904
LibreOffice Macro.jpg
LibreOffice Macro.jpg (60.67 KiB) 2456 mal betrachtet
Mit was muss meine Funktion ergänzt werden um zu funktionieren?
Zuletzt geändert von Verstancla am Mo 7. Feb 2022, 16:02, insgesamt 1-mal geändert.

craig
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

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

Beitrag von craig » Mi 26. Jan 2022, 13:58

Hallo,

zur Referenzierung von Objekten benötigt man Objektvariable.
Dazu kann man nahezu jeden beliebigen Text verwenden.
Die Namen sollten sogewählt werden, dass diese keinem Basic.Befehl gleichen.
Falsch wäre folgende Deklaration und weitere Verwendung im Code:

Code: Alles auswählen

Dim If as Object
If ist ein Basicbefehl und sollte nur in einer IF-Anweisung verwendet werden.
Also so:

Code: Alles auswählen

If banane=0 then
	... irgendetwas
End If
Möchte man aber unbedingt ein If in der Variablen nutzen,
dann kann man ein Präfix voranstellen.
Siehe hier...
Daraus geht hervor, dass man für Objektvariablen idealerweise das kleine "o" verwenden kann.
Dies ist zwar kein MUSS, aber gerade als Anfänger und zwecks besserer Lesbarkeit des Codes eine gute Empfehlung.

Darüber hinaus empfiehlt es sich die "Option Explicit"-Anweisung an oberster Stelle im Code einzufügen. Dies führt dazu, das der Basic-Interpreter den Code auf korrekt deklarierte Variablen prüft und auch auf Schreibfehler bei den Variablen hinweist.
Im Fall eines Fehler erhält man dann eine Fehlermeldung:
BASIC-Laufzeitfehler
Variable nicht definiert.

Es wird einem dann die Zeile markiert, wo der Fehler sein soll.
Man prüft in diesm Fall die korrekte Schreibweise der Variablen.
Ist in dieser Zeile kein Fehler zufinden, dann muss die Deklaration der einzelnen Variablen
in der DIM-Anweisung auf Richtigkeit geprüft werden.
Test:
Tausche in meinem nachfolgenden Code diese Zeile aus:

Code: Alles auswählen

Dim oSheet1 as Object
GEGEN:

Code: Alles auswählen

Dim ooSheet1 as Object
Dann starte das Makro "Sub Mein Makro".
Und schwuppt die genannte Fehlermeldung erscheint und markiert die Zeile:

Code: Alles auswählen

		oSheet1=oDoc.getSheets().getByIndex(0)
Der Fehler ist also nicht in der markierten Zeile, sondern es handelt sich um einen Schreibfehler in der Deklaration/ DIM-Anweisung.

Code: Alles auswählen

REM  *****  BASIC  *****
Option Explicit

Sub meinMakro
Msgbox "Heutiges Datum = " & Changedon
End Sub

Function Changedon() as Date
Dim oDoc as Object
Dim oSheet1 as Object
Dim vChgDate as Variant
	
	'Referenziert das aktuelle Dokument
	oDoc=ThisComponent
		'Referenziert das gewünschte Tabellenblatt
		oSheet1=oDoc.getSheets().getByIndex(0)
REM ODER → → → :	oSheet1=oDoc.getSheets(),getByName("Tabelle1")

	vChgDate=oDoc.DocumentProperties.ModificationDate

	If vChgDate.Year=0 Then
		vChgDate=oDoc.DocumentProperties.CreationDate
	End If
	Changedon=Dateserial(vChgDate.Year, vChgDate.Month,  vChgDate.Day)

End Function
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

Verstancla
Beiträge: 13
Registriert: Fr 21. Jan 2022, 10:58

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

Beitrag von Verstancla » Mi 26. Jan 2022, 17:15

Hallo Craig
Danke für deine Antwort. Obwohl ich früher viele Assembler-Makros geschrieben habe, erschliesst sich mir hier die Logik nicht. Wie ich es sehe, habe ich in meiner Funktion nirgends ein If in einer Variablen verwendet. Wieso braucht es noch ein Extra-Makro und wieso ist der Variablen-Name oSheet nicht Okay? Mir kommt deine Beschreibung spanisch vor und ich kann deine Gedankengänge nicht nachvollziehen. Die Funktion habe ich aus dem Forum kopiert, dessen Entwickler sie als funktionierend anpries.
Gruss Verstancla

craig
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

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

Beitrag von craig » Mi 26. Jan 2022, 20:00

Hallo Verstancla,

sorry, wenn ich Verwirrung gestiftet habe, dass war nicht meine Absicht. :oops:
Verstancla hat geschrieben:Funktion nirgends ein If in einer Variablen verwendet.
Das ist richtig, ich wollte nur klarstellen, dass man keine Basicbefehle für
die Namensvergabe bei für die Variablen-Deklaration verwenden darf, da es sonst zu Konflikten
mit dem Basic-Interpreter kommt und dann entsprechende Fehler produziert werden.

Verstancla hat geschrieben:Wieso braucht es noch ein Extra-Makro
Ein Funktion ist wie der Name schon sagt eine Funktion, also so etwas wie eine Calc-Formel, für Berechnungen und Textfunktionen, etc.
Ausserdem gibt es Programmier-Umgebungen, wo eine Funktion alleine nicht abgerabeitet werden kann. Sie muss dort immer aus einer Sub-Routine oder anderen Routinen heraus aufgerufen werden.
Des Weiteren kann man an Funktionen Parameter binden, dann kommt es bei der Ausführung (auch in Starbasic) zu Laufzeit-Fehlern.

Die geforderten Übergabe-Parameter dieser Funktion sind im Funktionsnamen vorgegeben
Function FileNameoutofPath(ByVal Path as String, ...
Diese Funktion fordert den Parameter ByVal Path as String
Wenn ich die Funktion direkt ausführe, dann Laufzeit-Fehler.
Rufe ich die Funktion aus ein Sub-Routine aus und übergebe die geforderten Parameter, dann ist alles OK:

Für das Beispiel muss auf der Festpallte eine Datei namens Test.txt vorhanden
sein und sie muss im Ordner C:\temp gespeichert sein.
Beispiel:

Code: Alles auswählen

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

Sub MeinMakro
Dim sPath as String
	' Laden der Bibliothek "LibreOffice-Makros und -Dialoge/Tools"
	GlobalScope.basicLibraries.loadLibrary("Tools")
	' Funktionsaufruf:		FileNameoutofPath()
	' Parameter-Übergabe:	"C:\temp\Test.txt"
	sPath= FileNameoutofPath("C:\temp\Test.txt")

Msgbox  sPath
End Sub
Verstancla hat geschrieben:wieso ist der Variablen-Name oSheet nicht Okay?
Weil oSheet ein einzelnes Tabellenblatt darstellt und nicht die gesamte Calc-Datei.
Dies hat sich so weltweit eingebürgert.
OOME-Handbuch

Die Calc-Datei wird so deklariert und referenziert.

Code: Alles auswählen

Dim oDoc as Object
	oDoc=ThisComponent
„oDoc“ ist aber nicht das Objekt „ThisComponent“, sondern ein Zeiger auf das Objekt „ThisComponent“
Bildlich gesehen:
Ein Haus mit der Hausnummer 1.
Du stehst auf der anderen Straßenseite und sagst dem Basic-Interpreter mit zeigendem Finger:
"Ich möchte dieses Haus mit der Hausnummer 1 betreten."
Mehr ist oDoc oder oSheet, usw. nicht.

Warum deklariert man dann Objektvariable (oDoc uznd Co.)?
Wenn ich z.B. einen langen Code schreiben will, dann ist es ziemlich lästig, permanent „ThisComponent“ zu schreiben, „oDoc“ ist viel kürzer. Arbeitet mein Makro z.B. in zwei Calc-Dateien, dann benenne ich die Objektvariable z.T. auch so:
oDocCalc1
oDocCalc2

Daraus folgt für das Tabellenblatt diese Deklaration und Referenzierung, wobei
ich direkt angebe, ob ich in „Tabelle1“ oder in „Tabelle2“ arbeiten möchte:

Code: Alles auswählen

Dim oSheet1 as Object

        'Referenziert das gewünschte Tabellenblatt
         oSheet1=oDoc.getSheets().getByIndex(0)
REM ODER → → → :        oSheet1=oDoc.getSheets().getByName("Tabelle1")
hat geschrieben:Die Funktion habe ich aus dem Forum kopiert, dessen Entwickler sie als funktionierend anpries.
Nun ja, es gibt solche und solche Programmierer.
Das reicht von „Quick’n dirty“ über Unwissenheit bis peinlich genau. Jeder halt so wie er es mag.

Ich bin stets bemüht ;) etwas sauberer zu arbeiten, vorallem deshalb, weil es mir dann auch nach Jahren leichter fällt meine eigenen Codes zuverstehen. :)
Also versuche ich mich ein wenig an den gebräuchlichen Konventionen zu orientieren und die Codes auch so zu schreiben.

Und weil ich gerade eine so große Klappe habe, hier die verbesserte Version meines zuvor geposteten Codes:

Code: Alles auswählen

REM  *****  BASIC  *****
Option Explicit

Dim oDoc as Object
Dim oSheet1 as Object

Sub meinMakro
	
	'Referenziert das aktuelle Dokument
	oDoc=ThisComponent
		'Referenziert das gewünschte Tabellenblatt
		oSheet1=oDoc.getSheets().getByIndex(0)
REM ODER → → → :	oSheet1=oDoc.getSheets().getByName("Tabelle1")

	Msgbox "Heutiges Datum = " & Changedon
End Sub

Function Changedon() as Date
Dim vChgDate as Variant
	
	vChgDate=oDoc.DocumentProperties.ModificationDate

	If vChgDate.Year=0 Then
		vChgDate=oDoc.DocumentProperties.CreationDate
	End If
	Changedon=Dateserial(vChgDate.Year, vChgDate.Month,  vChgDate.Day)

End Function
Ich bin trotz meines Wissens weiter davon entfernt ein Profi zu sein.

Wenn noch etwas unklar, dann melde Dich bitte.
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

musikai
Beiträge: 262
Registriert: Do 14. Mai 2015, 17:53

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

Beitrag von musikai » Mi 26. Jan 2022, 21:41

Ich kann in dem Original Post keinen Programm-Fehler entdecken und es ohne Fehler ausführen.
Der angezeigte Basic-Laufzeit-Fehler erscheint aber immer, wenn Du ein Programm im Basic-Editor ausführst, das auf eine geöffnete Datei zugreifen möchte, aber gar keine Datei geöffnet ist. Also wenn Du z.B. das Calc-Dokumenten-Fenster geschlossen hast, aber immer noch den Basic-Editor geöffnet.

(Allerdings hat Craig recht, dass die Bezeichnung "oSheet" anstelle z.B. "oDoc" sozusagen "hässlich" weil irreführend ist.)
Win7 Pro, Sibelius 7.1.3, Lubuntu 15.10, LibO 4.4.7, OO 4.1.3
Free Project: LibreOffice Songbook Architect (LOSA)
http://struckkai.blogspot.de/2015/04/li ... itect.html

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

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

Beitrag von mikele » Mi 26. Jan 2022, 22:17

Hallo,
das Problem tritt auf, wenn die Funktion nicht in der Datei sondern unter Meine Makros & Dialoge gespeichert ist. Wird nun eine Datei geöffnet, die diese Funktion nutzt, dann existiert zum Zeitpunkt des Funktionsaufrufs ThisComponent noch gar nicht und das ganze bricht mit Fehlermeldung ab.
Ein Workaround:

Code: Alles auswählen

Function Changedon() as Date
Dim vChgDate as Variant

	oDoc=Thiscomponent
	if HasUnoInterfaces(odoc, "com.sun.star.uno.XInterface") then
	
		vChgDate=oDoc.DocumentProperties.ModificationDate
	
		If vChgDate.Year=0 Then
			vChgDate=oDoc.DocumentProperties.CreationDate
		End If
		Changedon=CDateFromUnoDateTime (vChgDate)
	end if
End Function
Damit wird der Fehler beim Aufruf der Datei vermieden. Allerdings wird nun auch die Funktion beim Start nicht neu berechnet.
Gibt man

Code: Alles auswählen

=Changedon()
in eine Zelle ein, wird korrekt gerechnet. Mit

Code: Alles auswählen

=Changedon()+0*Jetzt()
wird bei jeder Neuberechnung auch diese Zelle neu berechnet und die fehlende Neuberechnung beim Laden der Datei nachgeholt.
Gruß,
mikele

Verstancla
Beiträge: 13
Registriert: Fr 21. Jan 2022, 10:58

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

Beitrag von Verstancla » Do 27. Jan 2022, 17:46

Hallo Craig
Leider funktionierts auch mit deinem Code nicht.
LibreOffice Macro1.jpg
LibreOffice Macro1.jpg (63.46 KiB) 2353 mal betrachtet
Gruss Verstancla

craig
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

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

Beitrag von craig » Do 27. Jan 2022, 18:22

Hallo Verstancla,

dann antworte ich mal mit eine Beispieldatei.
Weitere Beschreibungen in der Datei auf Tabelle1:
Test_01.ods
(27.31 KiB) 100-mal heruntergeladen
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

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

Beitrag von mikele » Do 27. Jan 2022, 22:33

Hallo,
aber es funktioniert nicht als benutzerdefinierte Funktion.
Gruß,
mikele

craig
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

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

Beitrag von craig » Do 27. Jan 2022, 23:17

@mikele
Stimmt. Da habe ich was überlesen. :oops:
Ein neuer Anlauf auf dem zweiten Tabellenblatt:
Test_01.ods
(28.58 KiB) 112-mal heruntergeladen
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten