Tabellenfunction Objectvariable nicht belegt
Moderator: Moderatoren
Tabellenfunction Objectvariable nicht belegt
folgendes Verhalten ist mir aufgefallen .
In der Tabelle habe ich eine selbstentworfende Function , die eine andere zelle auswertet . in der Referenzierten zelle darf ein Buchstabe stehen . Die Function greift auf eine zweite tabelle zu , um die Bedeutung des Buchstaben auszuwerten .
Bisher ist alles gut .
Wenn ich die Tabelle speichere und wieder öffne bekomme ich noch bevor die Tabelle angezeigt wird die Fehlermeldung " object- Variable nicht belegt" . In der Tabellenzelle in der die Function steht wird nicht der wert angezeigt der dort vor dem speichern stand .
Ein Macro das "doc=stardesktop.currentcomponent" definiert wird beim öffnen der Mappe ausgeführt .
Bevor ich hier noch das gesammte listning ausbreite , hier zwei grundlegende Fragen .
Wie läuft das öffnen einen mappe ab , welche aktionen werden ausgeführt ?
Werden die Tabellenfunctionen schon ausgefürt noch bevor das ereigniss " Dokument öffnen " ein Macro starten kann ?
gruß frank
In der Tabelle habe ich eine selbstentworfende Function , die eine andere zelle auswertet . in der Referenzierten zelle darf ein Buchstabe stehen . Die Function greift auf eine zweite tabelle zu , um die Bedeutung des Buchstaben auszuwerten .
Bisher ist alles gut .
Wenn ich die Tabelle speichere und wieder öffne bekomme ich noch bevor die Tabelle angezeigt wird die Fehlermeldung " object- Variable nicht belegt" . In der Tabellenzelle in der die Function steht wird nicht der wert angezeigt der dort vor dem speichern stand .
Ein Macro das "doc=stardesktop.currentcomponent" definiert wird beim öffnen der Mappe ausgeführt .
Bevor ich hier noch das gesammte listning ausbreite , hier zwei grundlegende Fragen .
Wie läuft das öffnen einen mappe ab , welche aktionen werden ausgeführt ?
Werden die Tabellenfunctionen schon ausgefürt noch bevor das ereigniss " Dokument öffnen " ein Macro starten kann ?
gruß frank
Im Detail müßte ich darüber erstmal nachdenken - ich erspare mir das zunächst und frage:Wie läuft das öffnen einen mappe ab , welche aktionen werden ausgeführt ?
Werden die Tabellenfunctionen schon ausgefürt noch bevor das ereigniss "Dokument öffnen" ein Macro starten kann ?
Gibt es tatsächlich eine benutzerdefinierte Funktion die in einber Tabellenzelle aufgerufen wird, und ein Makro oder ist hier Funktion und Makro frei formuliert und eigentlich ein- und dasselbe?
Falls es sich doch um zweierlei handelt wäre mir aus Sicht des Makros nicht erklärlich wenn die Fehlermeldung "Objektvariable nicht belegt" an dieser Stelle "doc=stardesktop.currentcomponent" erschiene, wenn die Datei normal geöffnet wird. An anderen Stellen ggf. schon, nur dazu müßte man das Makro (ggf. und Funktion) kennen.
generelle Vermutung:
liegt eine benutzerdefinierte Funktion vor wäre der Fehler typisch wenn diese nicht im Dokument selbst oder in der Bibliothek "Standard" der OOo-Bibliotheken (und nur in dieser) gespeichert ist.
Gruß
Stephan
In diesen Fall , ja .Gibt es tatsächlich eine benutzerdefinierte Funktion die in einber Tabellenzelle aufgerufen wird, und ein Makro oder ist hier Funktion und Makro frei formuliert und eigentlich ein- und dasselbe?
Die Macro's sind im Dokument selbst gespeichert .
Hier die beteidigten Marco's
Code: Alles auswählen
Sub Main
'bei öffnen der mappe starten
doc=stardesktop.currentcomponent
myView = doc.CurrentController
.
.
.
.
End Sub
Dieses Mrcro steht in der Tabelle
=autoh(E11;E7)
Code: Alles auswählen
function autoh(bem as string,dat as integer)
'dat aus der zeile datum funtion nur ausführen wenn dat eine zahl ist
'function für die zeile Gearbeitet
'autoh=gearbeitet
'bem aus zeile Bemerkung/eingabe
if isNumeric(dat) and (dat <> 0) then 'datum if not leer
'msgbox dat
autoh=zerl(bem,1)
else
autoh=0
endif
end function
das Marco" Zerl" wird von "autoh" aufgerufen
Code: Alles auswählen
function zerl(bem1 as string,spalte as integer) as single
'zerlegt die eingabe>>>
'bem1 = zeile eingabe
'spalte = [1fürGearbeitet 2fürNachtstunden ] zurückgeben
'zerl =stunden
'InStr (SearchString, MyString)
dim p as integer
'on error goto fehler1
'leere bem1 ?????
if bem1="" then
zerl=0
else
if IsNumeric(Left(bem1, 1)) then 'zahl
p=InStr (bem1, "#")
if p=0 then
if isNumeric(bem1) and spalte=1 then 'nur eine zahl ;spalte gearbeitet
zerl=bem1
else
zerl=0
endif
else
if spalte=1 then
'Gearbeitet
zerl=left(bem1,p-1)
else
'nachtstunden
zerl=right(bem1,len(bem1)-p)
endif
endif
else
'kürzel
zerl=staus(spalte,bem1)
endif
endif
on error goto 0
exit function
fehler1:
msgbox "Eingabe Fehler "
zerl=0
on error goto 0
end function
Code: Alles auswählen
function staus (spalte1 as integer,kuerzel as string) as single
'zur auswertung der tabelle kürzel
'spalte1 = aus welcher spalte die stunden zurückgegeben werden 1fürGearbeitet 2fürNachtstunden
'kuerzel = das zu suchende kürzel
'staus = stunden 0 bei nicht gefunden
'urbaubsstunden?`!?!=?!?!?!
dim cell as object,sheet as object
dim count as integer,ex as integer
dim kv as string
count=1
ex=0
'on error goto fehler2
sheet=doc.sheets.GetByName("kürzel") 'Hier dürfte die Fehlermeldung ausgelöst werden
do
cell=sheet.GetCellByPosition(0,count)
kv=cell.string
' msgbox "kv="+kv+"kürzel"+kuerzel
if kv=kuerzel then
'gefunden
cell=sheet.getcellbyposition(spalte1,count)
'urlaubsstunden ????????!!!!!!!!
'wenn cell.value <0 ist kein wert zurückgeben !!!! funst net
' if cell.value>=0 then
staus=cell.value
' msgbox "gefunden"+staus
' endif
ex=1
else
if cell.string="" then
ex=1
msgbox " Unbekantes Kürzel" 'nichts gefunden
staus=0
endif
endif
count=count+1
loop until ex=1 'gefunden or leer
on error goto 0
exit function
fehler2:
msgbox " Fehler in Tabelle Kürzel"
staus=0
on error goto 0
end function
Hey Frank,
Dann kannst du doch den Fehler evt. eingrenzen:
Ist doc global definiert? Bezeiht sich "doc" auf das aktuelle Dokument, das auch das Makro in sich trägt? Wenn ja, nutze mal in der entsprechenden Zeile statt:
besser:
Da das Makro ja wahrscheinlich mit dem Starten des Dokumentes aufgerufen wird, übernimmt er möglicherweise noch das bisherige Objekt eines vorhandenen "currentComponent".
Gruss
Thomas
Ist das so? Erkennst du doch daran, dass diese Zeile markiert (also schwarz hinterlegt) ist bei auftauchen der Fehlermeldung und die Basic-IDE aufgeht?sheet=doc.sheets.GetByName("kürzel") 'Hier dürfte die Fehlermeldung ausgelöst werden
Dann kannst du doch den Fehler evt. eingrenzen:
Ist doc global definiert? Bezeiht sich "doc" auf das aktuelle Dokument, das auch das Makro in sich trägt? Wenn ja, nutze mal in der entsprechenden Zeile statt:
Code: Alles auswählen
doc=stardesktop.currentcomponent
Code: Alles auswählen
doc=thisComponent
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
so , ich habe jetzt doc=thisComponent stehen . dafür gibt es jetzt eine andere Fehlermeldung.
"Falscher wert für eigenschaft " dieser Fehler wird angezeigt noch bevor die Tabelle im Fenster zusehen ist . das IDE wird nicht aufgerufen .
in die function staus habe ich noch die zeile "msgbox doc,0,"doc" eingefügt , für die variable doc wird nichts angezeigt.
so richtig die lösung des eigentlichen problem ist das nicht .
gruß frank
"Falscher wert für eigenschaft " dieser Fehler wird angezeigt noch bevor die Tabelle im Fenster zusehen ist . das IDE wird nicht aufgerufen .
in die function staus habe ich noch die zeile "msgbox doc,0,"doc" eingefügt , für die variable doc wird nichts angezeigt.
Code: Alles auswählen
function staus (spalte1 as integer,kuerzel as string) as single
'zur auswertung der tabelle kürzel
'spalte1 = aus welcher spalte die stunden zurückgegeben werden 1fürGearbeitet 2fürNachtstunden
'kuerzel = das zu suchende kürzel
'staus = stunden 0 bei nicht gefunden
'urbaubsstunden?`!?!=?!?!?!
dim cell as object,sheet as object
dim count as integer,ex as integer
dim kv as string
count=1
ex=0
on error goto fehler2
restart:
doc=thisComponent
msgbox doc,0,"doc"
sheet=doc.sheets.GetByName("kürzel")
on error goto 0
do
cell=sheet.GetCellByPosition(0,count)
kv=cell.string
' msgbox "kv="+kv+"kürzel"+kuerzel
if kv=kuerzel then
'gefunden
cell=sheet.getcellbyposition(spalte1,count)
'urlaubsstunden ????????!!!!!!!!
'wenn cell.value <0 ist kein wert zurückgeben !!!! funst net
' if cell.value>=0 then
staus=cell.value
' msgbox "gefunden"+staus
' endif
ex=1
else
if cell.string="" then
ex=1
msgbox " Unbekantes Kürzel" 'nichts gefunden
staus=0
endif
endif
count=count+1
loop until ex=1 'gefunden or leer
on error goto 0
exit function
fehler2:
'msgbox " Fehler in Tabelle Kürzel"
'opject variable nicht belegt doc
msgbox error$
doc=stardesktop.currentcomponent
goTo restart
staus=0
on error goto 0
end function
gruß frank