Tabellenfunction Objectvariable nicht belegt

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Frankvas
**
Beiträge: 20
Registriert: Mi, 19.05.2004 18:15
Wohnort: landkeis HE

Tabellenfunction Objectvariable nicht belegt

Beitrag 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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag 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
Frankvas
**
Beiträge: 20
Registriert: Mi, 19.05.2004 18:15
Wohnort: landkeis HE

Beitrag 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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag 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:

Code: Alles auswählen

doc=stardesktop.currentcomponent 
besser:

Code: Alles auswählen

doc=thisComponent
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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Frankvas
**
Beiträge: 20
Registriert: Mi, 19.05.2004 18:15
Wohnort: landkeis HE

Beitrag 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
Frankvas
**
Beiträge: 20
Registriert: Mi, 19.05.2004 18:15
Wohnort: landkeis HE

Beitrag 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
Frankvas
**
Beiträge: 20
Registriert: Mi, 19.05.2004 18:15
Wohnort: landkeis HE

Beitrag von Frankvas »

Nach einigen veränderungen im Code geht es doch , also
doc=thisComponent war richtig und hilfreich .

gruß frank
Antworten