Seite 1 von 1
Objektvariable nicht belegt
Verfasst: Mi 21. Nov 2018, 12:38
von Rob
Hallo,
trotz Suche hier im Forum habe ich bis jetzt keine Erklärung für mein Problem gefunden.
Ich benutze einen Macro um beim Aufruf einer LibreOffice Datei eine Kopie vom aktuellen
Stand herzustellen.
Das hat eigentlich immer funktioniert. Jetzt tritt aber (anderer PC) eine Fehler-
meldung auf:
Fehler-Nr.91:Objektvariable nicht belegt.
Die zugehöreige Zeile im Macro ist (siehe >>):
Code: Alles auswählen
...
' get active component
oComp = StarDesktop.CurrentComponent
' macro run from blank Desktop
>> If oComp.supportsService(_
"com.sun.star.frame.StartModule" ) Then
' exit without action
Exit Sub
End If
....
Kann mir da bitte jemand helfen ?
Danke sehr
Re: Objektvariable nicht belegt
Verfasst: Mi 21. Nov 2018, 15:30
von nikki
Hallo,
Dein Anliegen wäre im Forumsbereich LibreOffice Programmierung Alles zur Programmierung im LibreOffice besser aufgehoben, denn Forumsteilnehmer die sich damit auskennen sind nun mal dort vertreten.
Re: Objektvariable nicht belegt
Verfasst: Mi 21. Nov 2018, 15:34
von Rob
Ok, Danke.
Kann man das verschieben lassen ?
Will nicht zweimal das Gleiche fragen.
Danke
Re: Objektvariable nicht belegt
Verfasst: Mi 21. Nov 2018, 15:42
von DavidG
Hallo,
die Objektvariable
oComp wird nicht erkannt.
Ich bin kein super guter Programmierer, deshalb erschließ sich mir Dein Vorgehen, bzw. Ziel nicht.
Ich refenreziere ein Dokument wie folgt:
Das Makro führt den Code, dann im vordergründigen Dokument aus.
Wenn mehrere Dokumente geöffnet sind und das Makro mal in dem einen und dann in einem anderen
Dokument aktiv werden soll, dann muss die Referenzierung expliziter sein.
Code: Alles auswählen
' Eine Möglichkeit
Stardesktop.Frames.getByIndex(0)
' Oder über eine Schleife über alle Indizes mit Abfrage des Dokuments-Titles
For i = 0 To Stardesktop.Frames.Count
if Stardesktop.Frames.getByIndex(i).Title = "Unbenannt 1 - LibreOffice Calc" Then ...
Next i
Re: Objektvariable nicht belegt
Verfasst: Mi 21. Nov 2018, 16:36
von balu
Hallo Roib,
Ich benutze einen Macro um beim Aufruf einer LibreOffice Datei eine Kopie vom aktuellen
Stand herzustellen.
Das hat eigentlich immer funktioniert.
Interessant.
Jetzt tritt aber (anderer PC) eine Fehler-
meldung auf:
Auch interessant.
Aber die wirklich wichtigen Infos verschweigst Du uns. Einerseits fehlen die Angaben zu den verwendeten Betriebssystemen und den Officen inklusive der Versionsnummern. Und anderseits ist es uns Rätselhaft wie und wann Du das Makro ausführst beziehungsweise es ausgeführt wird. Die äxtrem vielen Kote-Zeilen sind natürlich dabei überhaupt nicht wirklich hilfreich.
Nun gut, ich kann auch anders, als nur rummosern.
Das eine Objektvariable mal nicht belegt sein kann, kann unter Umständen verschiedene Ursachen haben. Besonders dann, wenn auf eine andere Datei zugegriffen wird.
Nehmen wir mal folgendes Beispiel.
Du hast ein Makro erstellt, welches beim Starten vom Office ausgeführt werden soll. Dieses Makro hast Du beispielsweise dem Ereignis "Programmstart" zugeordnet. Jetzt kann es aber durchaus vorkommen, das in den vorangegangenen tests alles super lief, aber nach der Zuordnung und beenden vom Office und anschließendem erneuten starten vom Office, das Makro komplett versagt.
Wie ist das möglich?
Nun, das Office ist wohl "rein optisch" gestartet, aber es ist noch längst nicht alles vom Office initialisiert. Und dadurch kann es vorkommen das gewisse Zugriffe auf bestimmte Dinge noch nicht möglich sind, weil sie noch nicht zur Verfügung stehen.
Das war jetzt mal eine ganz grobe Erklärung wie es zu so einem Problem kommen kann. Um dir aber effektiv weiterhelfen zu können brauchen wir mehr Infos (wie wird das Makro ausgeführt?) und am besten eine Beispieldatei, und keinen Code-Schnippsel.
Gruß
balu
Re: Objektvariable nicht belegt
Verfasst: Mi 21. Nov 2018, 17:29
von Rob
Ist ok und gut "gemosert".
Dachte mein Hinweis reicht. Also jetzt mehr dazu.
LO-Version: 6.1.2.1 (x64)
Windows 8.1 Prof (x64)
Hier das ganze Script das bei einem LO Progammaufruf das aufgerufene File
in ein Verzeichnis sichert mit Datum und Uhrzeit:
Code: Alles auswählen
REM ***** BASIC *****
Sub Main
End Sub
'Copyright (c) 2006 Winfried Rohr, re-Solutions Software Test Engineering
'mailto: ooo@re-solutions.de Untere Zahlbacher Strasse 18, D-55131 Mainz
'This program is free software; you can redistribute it and/or modify it under
'the terms of the GNU General Public License as published by the Free Software
'Foundation; either version 2 of the License, or (at your option) any later
'version.
'This program is distributed in the hope that it will be useful, but WITHOUT
'ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
'FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
'You should have received a copy of the GNU General Public License along with
'this program; if not, write to the Free Software Foundation, Inc., 59 Temple
'Place, Suite 330, Boston, MA 02111-1307 USA
' ========================================================================
' make a copy of actual loaded document
' append date and time string to filename
' and store in same location
' notice if already exists
' =====
' Texte fuer Nachrichten
'
' Nachricht1
CONST cDokGefunden = "Dokument ist bereits vorhanden:"
'CONST cDokGefunden = "Document found at location"
CONST cNoNewCopy = "Es wurde keine Kopie erzeugt!"
'CONST cNoNewCopy = "No new copy was made!"
'Nachricht2
CONST cNoLoc = "Dokument noch nicht gespeichert (keine URL gefunden)"
'CONST cNoLoc = "Document was not saved yet (could not find an URL)"
CONST cSaveAndRerun = "Erst sichern, dann Makro eventl. erneut abrufen"
'CONST cSaveAndRerun = "Save first, then run this macro again to make a copy"
'Nachricht3
CONST cRunInBase = "Keine Funktion in OOo BASE"
'CONST cRunInBase = "No function in OOo BASE"
CONST cDontWork = "Makro beendet"
' CONST cDontWork = "Macro finished"
'Nachrichten des ErrHandlers
CONST cErrInLine = "Fehler in Zeile: "
'CONST cErrInLine = "Error in line: "
CONST cErrNo = "Fehler-Nr. "
'CONST cErrNo = "Error-No. "
CONST cErrMod = "Fehler in Makro"
'CONST cErrMod = "Error in macro"
' =====
Sub makeCopy()
sMakroName = "makeCopy "
' sMakroVersion = "2006-05-20"
If NOT Globalscope.BasicLibraries.IsLibraryLoaded("Tools") Then
Globalscope.BasicLibraries.LoadLibrary("Tools")
End If
' try to catch errors and display a message
On Local Error GoTo ErrHandler
' =====
' MAIN
' =====
' get active component
oComp = StarDesktop.CurrentComponent
' macro run from blank Desktop
If oComp.supportsService(_
"com.sun.star.frame.StartModule" ) Then
' exit without action
Exit Sub
End If
' macro run from Basic IDE
If oComp.supportsService(_
"com.sun.star.script.BasicIDE" ) Then
' exit without action
Exit Sub
End If
' macro run from Base main window
'Nachricht3
If oComp.supportsService(_
"com.sun.star.sdb.OfficeDatabaseDocument" ) Then
msgbox cRunInBase & chr(13) &_' cDontWork , 64 , sMakroName & sMakroVersion
Exit Sub
End If
oDok = ThisComponent
'XXX warning
'XXX code will fail on next statement, if no document is loaded
' check if file was stored
If oDok.hasLocation() then
' check if HELP window is in foreground
If Instr( oDok.getLocation() , "vnd.sun.star.help:" ) then
' msgbox "HELP window in foreground"
' exit without action
Exit Sub
End if
' yes, make a copy
' compose additional data to create alternative name for file
' here: datestamp in ISO format used (good for sorting)
xFile = "E:\LibreOffice-Backup\" & FileNameoutofPath(oDok.title,) & "_" & format(now(),"YYYYMMDD-hhmmss") & ".ods"
sFileURL=converttourl( xFile )
' sFileURL = oDok.getURL() & "_" & cDateToISO( Now() )
' check if such a file exist
if FileExists( sFileURL ) then
' yes there is one
' issue a message to inform user
msgbox cDokGefunden & chr(13) &_
sFileURL & chr(13) & _
cNoCopyMade ,_
64 ,sMakroName & sMakroVersion
else
' check if we have rights to save there under this name
' how ???
' can save with new name
'## note: no checking on length of filename
'## restricted on some platforms
'## untested _ not sure what will happen
oDok.StoreToURL( sFileURL , Array() )
end if
Else
' no filename by now - cannot do a thing
msgbox cNoLoc & chr(13) &_
cSaveAndRerun , 64 , sMakroName & sMakroVersion
End If
Exit sub
' =====
' =====
ErrHandler:
MsgBox _
cErrInLine & Erl & _
CHR(10) & cErrNo & Err & ": " & Error$ ,, _
cErrMod & sModulName & sModulVersion
End Sub
Das Script stammt nicht von mir, sondern ich habe es vor einiger Zeit gefunden
und für mich angepasst. Habe es öfters an verschiedenen PC im Einsatz, nur bei
einem geht es nicht.
Das Script ist zugewiesen zum Programmstart.
Fehlt noch was ?
Danke für die Hilfe.
Re: Objektvariable nicht belegt
Verfasst: Mi 21. Nov 2018, 19:07
von balu
Also bei der 6er LO-Version bin ich erstmal weitestgehend raus, da ich die nicht habe.
Das Script ist zugewiesen zum Programmstart.
Ich gehe jetzt mal davon aus das Du die "Sub makeCopy()" zugeordnet hast, und nicht die "Sub Main".
Da ich ja die 6er nicht habe, kann ich also nicht garantieren ob es dir helfen wird, wenn Du nicht "Programmstart" nimmst, sondern es vielleicht mal mit "Ansicht wurde erzeugt" probierst.
Gruß
balu
Re: Objektvariable nicht belegt
Verfasst: Mi 21. Nov 2018, 19:38
von Rob
Danke für den Tip.
Ja, ich habe Sub makeCopy() zugeordnet.
Es funktioniert mit "Ansicht wurde erzeugt" wieder!
Danke sehr nochmals für die Hilfe.
Gruß
rob
Re: Objektvariable nicht belegt
Verfasst: Do 22. Nov 2018, 14:01
von Helmut_S
Hallo Rob, es kann natürlich sein, dass du gute Gründe für dein Vorgehen hast, ich orientiere mich an deinem Satz:
Ich benutze einen Macro um beim Aufruf einer LibreOffice Datei eine Kopie vom aktuellen
Stand herzustellen.
Wenn du unter den Optionen einstellst, dass LO beim Schließen/Speichern immer eine Sicherheitskopie erstellt, scheint mir das Gleiche zu bewirken als eine Kopie beim Starten?
Dann brauchst gar kein Makro und hast immer eine Sicherheitskopie?
MfG Helmut
Re: Objektvariable nicht belegt
Verfasst: Fr 23. Nov 2018, 15:37
von balu
Rob hat geschrieben:
Es funktioniert mit "Ansicht wurde erzeugt" wieder!
Das freut mich echt zu hören
Rob hat geschrieben:
Interessieren würde mich trotzdem warum das so ist.
Auch was ist der Unterschied zwischen "Programmstart" und "Ansicht wurde erzeugt"?
Tja, wie soll man das am einfachsten erklären?
Habe ja auch nicht so sehr die Ahnung. Dennoch versuch ich es mal.
Also bei Programmstart können gewisse Dinge wohl geladen werden, die aber mehr "unter der Motorhaube" greifen. Also optische angelegenheiten sind noch nicht möglich. Und eine Datei öffnen ist ja auch mit dem optischem Teil verbunden.
Bei "Ansicht wurde erzeugt" stehen nun alle möglichkeiten zur Verfügung, so auch der optische Teil.
Helmut_S hat geschrieben:
Wenn du unter den Optionen einstellst, dass LO beim Schließen/Speichern immer eine Sicherheitskopie erstellt, scheint mir das Gleiche zu bewirken als eine Kopie beim Starten?
Stimmt nicht.
Denn da gibt es immer nur EINE Kopie von der aktuellen Datei mit der Endung '.bak'.
Beispiel:
Aus BüroDatei1.ods wird BüroDatei1.bak
Das Makro jedoch ergänzt den vorhandenen Dateinamen um das aktuelle Datum UND Uhrzeit.
Beispiel:
Aus BüroDatei1.ods wird BüroDatei1_20181123-153850.ods
Der gravierende Unterschied und der Vorteil dürfte ja wohl ersichtlich sein.
Gruß
balu