Seite 1 von 1
Tabellenfunction Objectvariable nicht belegt
Verfasst: Fr, 13.04.2007 21:25
von Frankvas
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
Verfasst: Sa, 14.04.2007 01:14
von Stephan
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 ?
Im Detail müßte ich darüber erstmal nachdenken - ich erspare mir das zunächst und frage:
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
Verfasst: Sa, 14.04.2007 08:58
von Frankvas
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?
In diesen Fall , ja .
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
Es folgendie drei Macro's für die Tabellenfunction
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
Die zwei folgenden Mcro's machen den rest
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
Das Macro "staus " wird von "zerl" aufgerufen und verursacht den Fehler .Dieses Macro greift auf eine andere Tabelle zu
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
gruß Frank
Verfasst: Mo, 16.04.2007 09:00
von Toxitom
Hey Frank,
sheet=doc.sheets.GetByName("kürzel") 'Hier dürfte die Fehlermeldung ausgelöst werden
Ist das so? Erkennst du doch daran, dass diese Zeile markiert (also schwarz hinterlegt) ist bei auftauchen der Fehlermeldung und die Basic-IDE aufgeht?
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
Verfasst: Fr, 20.04.2007 10:49
von Frankvas
Die Ide wird nicht angezeigt . Nach OK drücken bei der Fehlermeldung wird die Tabelle angezeigt .
das mit doc=thisComponent habe ich noch nicht ausprobiert , wenn es neues gibt , poste ich , kan aber ne woche dauern , arbeiten und so .
gruß frank
Verfasst: So, 22.04.2007 14:38
von Frankvas
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.
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
so richtig die lösung des eigentlichen problem ist das nicht .
gruß frank
Verfasst: Mo, 07.05.2007 14:28
von Frankvas
Nach einigen veränderungen im Code geht es doch , also
doc=thisComponent war richtig und hilfreich .
gruß frank