Wir sind auf Ihre Unterstützung angewiesen!
💚 BITTE helfen Sie uns HEUTE mit einer SPENDE 💚
Helfen Sie das LibreOffice Forum zu erhalten!
> 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.
-
- Beiträge: 13
- Registriert: Fr 21. Jan 2022, 10:58
[GELÖST] BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
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
Mit was muss meine Funktion ergänzt werden um zu funktionieren?
Beim Aufruf von CALC-Datei tritt dieser Fehler auf (s. Untenstehender Screenshot).
LibreOffice Version 7.2.4.1 (x64) Windows 10.0 Build 1904
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.
Re: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
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:
If ist ein Basicbefehl und sollte nur in einer IF-Anweisung verwendet werden.
Also so:
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:
GEGEN:
Dann starte das Makro "Sub Mein Makro".
Und schwuppt die genannte Fehlermeldung erscheint und markiert die Zeile:
Der Fehler ist also nicht in der markierten Zeile, sondern es handelt sich um einen Schreibfehler in der Deklaration/ DIM-Anweisung.
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
Also so:
Code: Alles auswählen
If banane=0 then
... irgendetwas
End If
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
Code: Alles auswählen
Dim ooSheet1 as Object
Und schwuppt die genannte Fehlermeldung erscheint und markiert die Zeile:
Code: Alles auswählen
oSheet1=oDoc.getSheets().getByIndex(0)
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
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
-
- Beiträge: 13
- Registriert: Fr 21. Jan 2022, 10:58
Re: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
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
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
Re: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
Hallo Verstancla,
sorry, wenn ich Verwirrung gestiftet habe, dass war nicht meine Absicht.
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.
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:
Dies hat sich so weltweit eingebürgert.
OOME-Handbuch
Die Calc-Datei wird so deklariert und referenziert.
„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:
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:
Ich bin trotz meines Wissens weiter davon entfernt ein Profi zu sein.
Wenn noch etwas unklar, dann melde Dich bitte.
sorry, wenn ich Verwirrung gestiftet habe, dass war nicht meine Absicht.
Das ist richtig, ich wollte nur klarstellen, dass man keine Basicbefehle fürVerstancla hat geschrieben:Funktion nirgends ein If in einer Variablen verwendet.
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.
Ein Funktion ist wie der Name schon sagt eine Funktion, also so etwas wie eine Calc-Formel, für Berechnungen und Textfunktionen, etc.Verstancla hat geschrieben:Wieso braucht es noch ein Extra-Makro
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
Weil oSheet ein einzelnes Tabellenblatt darstellt und nicht die gesamte Calc-Datei.Verstancla hat geschrieben:wieso ist der Variablen-Name oSheet nicht Okay?
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
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")
Nun ja, es gibt solche und solche Programmierer.hat geschrieben:Die Funktion habe ich aus dem Forum kopiert, dessen Entwickler sie als funktionierend anpries.
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
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
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
Re: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
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.)
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
Free Project: LibreOffice Songbook Architect (LOSA)
http://struckkai.blogspot.de/2015/04/li ... itect.html
Re: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
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:
Damit wird der Fehler beim Aufruf der Datei vermieden. Allerdings wird nun auch die Funktion beim Start nicht neu berechnet.
Gibt man in eine Zelle ein, wird korrekt gerechnet. Mit
wird bei jeder Neuberechnung auch diese Zelle neu berechnet und die fehlende Neuberechnung beim Laden der Datei nachgeholt.
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
Gibt man
Code: Alles auswählen
=Changedon()
Code: Alles auswählen
=Changedon()+0*Jetzt()
Gruß,
mikele
mikele
-
- Beiträge: 13
- Registriert: Fr 21. Jan 2022, 10:58
Re: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
Hallo Craig
Leider funktionierts auch mit deinem Code nicht.
Gruss Verstancla
Leider funktionierts auch mit deinem Code nicht.
Gruss Verstancla
Re: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
Hallo Verstancla,
dann antworte ich mal mit eine Beispieldatei.
Weitere Beschreibungen in der Datei auf Tabelle1:
dann antworte ich mal mit eine Beispieldatei.
Weitere Beschreibungen in der Datei auf Tabelle1:
Gruß
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
Re: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
Hallo,
aber es funktioniert nicht als benutzerdefinierte Funktion.
aber es funktioniert nicht als benutzerdefinierte Funktion.
Gruß,
mikele
mikele
Re: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: DocumentProperties.
@mikele
Stimmt. Da habe ich was überlesen.
Ein neuer Anlauf auf dem zweiten Tabellenblatt:
Stimmt. Da habe ich was überlesen.
Ein neuer Anlauf auf dem zweiten Tabellenblatt:
Gruß
Craig
Nie die Sicherungskopie vergessen!
════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8
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 ❤️