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. 🤗

Objektvariable nicht belegt

Komponentenübergreifende Themen zu Libreoffice
Antworten
Rob
Beiträge: 45
Registriert: Sa 1. Feb 2014, 20:15

Objektvariable nicht belegt

Beitrag von Rob » Mi 21. Nov 2018, 12:38

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

nikki
Beiträge: 1026
Registriert: Sa 18. Mär 2017, 22:25
Kontaktdaten:

Re: Objektvariable nicht belegt

Beitrag von nikki » Mi 21. Nov 2018, 15:30

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.
Gruß

---------------------------------------------------
Win.10 Prof. 64-bit, LO 6.3.4 (x64), LO 6.2.6 Portable, AOO 4.1.7

Rob
Beiträge: 45
Registriert: Sa 1. Feb 2014, 20:15

Re: Objektvariable nicht belegt

Beitrag von Rob » Mi 21. Nov 2018, 15:34

Ok, Danke.

Kann man das verschieben lassen ?
Will nicht zweimal das Gleiche fragen.

Danke

DavidG
Beiträge: 195
Registriert: Do 22. Mär 2018, 21:41

Re: Objektvariable nicht belegt

Beitrag von DavidG » Mi 21. Nov 2018, 15:42

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:

Code: Alles auswählen

Dim oDoc as Object
	oDoc= ThisComponent
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
Gruß

David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Objektvariable nicht belegt

Beitrag von balu » Mi 21. Nov 2018, 16:36

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

Rob
Beiträge: 45
Registriert: Sa 1. Feb 2014, 20:15

Re: Objektvariable nicht belegt

Beitrag von Rob » Mi 21. Nov 2018, 17:29

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.

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Objektvariable nicht belegt

Beitrag von balu » Mi 21. Nov 2018, 19:07

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

Rob
Beiträge: 45
Registriert: Sa 1. Feb 2014, 20:15

Re: Objektvariable nicht belegt

Beitrag von Rob » Mi 21. Nov 2018, 19:38

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

Helmut_S
Beiträge: 692
Registriert: Di 9. Feb 2016, 19:27

Re: Objektvariable nicht belegt

Beitrag von Helmut_S » Do 22. Nov 2018, 14:01

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
MX-Linux KDE + Linux-Mint Cinnamon

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Objektvariable nicht belegt

Beitrag von balu » Fr 23. Nov 2018, 15:37

Rob hat geschrieben: Es funktioniert mit "Ansicht wurde erzeugt" wieder!
Das freut mich echt zu hören :-D

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.

Code: Alles auswählen

"YYYYMMDD-hhmmss"
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

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