Zelle auslesen innerhalb einer Function

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

Moderator: Moderatoren

Meister Propper
Beiträge: 6
Registriert: Sa, 21.03.2015 12:53

Zelle auslesen innerhalb einer Function

Beitrag von Meister Propper »

Guten Tag,

ich bin neu hier im Forum, und beschäftige mich grade mit der Programmierung eines Makros in Calc.
Das habe ich auch mit Hilfe meines alten Basic-Wissens und der Suchfunktion hier soweit hinbekommen.
Es geht um das auslesen von Zellen in einer Urlaubsdatei, um das Anfangs- und Enddatum in einer Übersicht anzuzeigen.
Innerhalb dieses Makros benutze ich für den Zellzugriff folgende Zeilen:

Code: Alles auswählen

		oDoc = ThisComponent							 				
		oSheet = oDoc.Sheets.getByName( "Uebersicht" )
		oSheetMitarbeiter = oDoc.Sheets.getByName( "Mitarbeiter" )
das Auslesen selber dann mit:

Code: Alles auswählen

	sDatumZuZweiGefunden = oSheet.getCellByPosition(iZaehlerSpalte , sDatumsFeld).Value
Beides funktioniert ohne Probleme, und auch das gesamte Makro macht das was ich möchte.


Nun hab ich versucht aus diesem Ganzen eine Function zu schreiben und nun kommt mein Problem:
in der Zeile

Code: Alles auswählen

Function xyz
		oSheet = oDoc.Sheets.getByName( "Uebersicht" )
kommt die Fehlermeldung:
Basic-Laufzeitfehler, Eigenschaft oder Methode nicht gefunden: Sheets

Auch bei "Activesheet" kommt die gleiche Meldung.

Hat jemand eine Idee warum das nicht geht?
Oder kann mir einen Tip geben, wie ich in einer Function eine Zelle auslesen kann?

Google und die Suchfunktion haben mir leider kein Ergebnis geliefert, oder ich hab die falsche Frage gestellt, auch das ist natürlich Möglich :-)

Meine Open Office ist:
ApacheOpenOfice 3.4.1

Moderation,4: CODE tags gesetzt
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Zelle auslesen innerhalb einer Function

Beitrag von komma4 »

Deine Funktion weiss nicht, was oDoc ist!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Meister Propper
Beiträge: 6
Registriert: Sa, 21.03.2015 12:53

Re: Zelle auslesen innerhalb einer Function

Beitrag von Meister Propper »

ok,
d.H. die Definition oDoc=ThisComponent hat keine Wirkung?

ein ändern der Zeile in
oSheet = ThisComponent.Sheets.getByName ( "Uebersicht" )

hat allerdings den gleichen Fehler zur folge :-(
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: Zelle auslesen innerhalb einer Function

Beitrag von Karolus »

Hallo

Versuchst du gerade eine Funktion zu schreiben die du in|aus einer Zelle aufrufen möchtest??

Ansonsten: Poste den ganzen Code und nicht nur Ausschnitte!
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Meister Propper
Beiträge: 6
Registriert: Sa, 21.03.2015 12:53

Re: Zelle auslesen innerhalb einer Function

Beitrag von Meister Propper »

@Karulus

ich möchte den Inhalt einer Zelle auslesen.
Den ganzen Code der Function Posten wird schwierig, da ich praktisch in der ersten Zeile schon hänge, da ich die Zellen nicht auslesen kann.
hier mal das Makro, das genau das macht, was ich möchte, und das ich in eine Function umschreiben möchte, um es für mehrere Mitarbeiter nicht jedes mal verändern zu müssen.


Ich habe mehrere Blätter, im ersten Blatt stehen in 2 unterschiedlichen Zeile "2"en, die einen Urlaubstag des Mitarbeiters anzeigen.
Die werden praktisch gezählt, und als jeweiliges Start und Enddatum in einer zweiten Tabelle eingetragen.
Nun Möchte ich das ganze aber als Function schreiben, eine für den Start, und eine für das Ende, dazu muss ich gezählte Werte übergeben und auch Zellen auslesen. Und wie gesagt gleich am Anfang, das auslesen der Zellen klappt bei mir innerhalb der Function schon nicht. Den Rest hab ich noch gar nicht geschrieben, da ich die Werteübergabe per Zelle ja schon nicht hinbekommen.

Hier der Code des Sub's:

REM ***** BASIC *****
Option Explicit
Private iZaehlerUni as Integer
Private iZaehlerSpalteGefunden as Integer
Private iOffset as Integer
Private iOffsetSpalte as integer
Private iOffsetZweiGefunden as Integer
Private Zellobjekt as string
Sub Urlaub1
Dim bZweiGefunden as Boolean 'ja / Nein ob eine Zwei gefunden wurde
Dim iZaehlerSpalte as Integer
Dim iZaehlerZeile as Integer
Dim iZwei as Integer
Dim oDoc as Object
Dim oCell as String
Dim oSheet as Object
Dim sDatumZuZweiGefunden as String
Dim oSheetMitarbeiter as Object
Dim sTest as String
Dim iZaehlerSpalteUrlaubEnde as Integer
Dim iZaehlerZeileUrlaubEnde as Integer
Dim bAbJuli as Boolean
Dim sDatumsFeld as String
Dim iMengeUrlaub as Integer
Dim iMitarbeiterDatumOffset as Integer
Dim I as Integer
oDoc = ThisComponent 'Diese Datei
oSheet = oDoc.Sheets.getByName( "Uebersicht" ) 'Uebrsichtsblatt definieren
oSheetMitarbeiter = oDoc.Sheets.getByName( "Mitarbeiter" ) 'Mitarbeiter definieren



bZweiGefunden = False 'noch keine Gefunden
iOffset = oSheetMitarbeiter.getCellByPosition(1 , 1).Value 'für Zeile bis 30.06.
iZaehlerZeile = iZaehlerZeile + iOffset 'StartZeile
iOffsetZweiGefunden = 2 'in Spalte C anfangen mit suchen
iZaehlerSpalte = iZaehlerSpalte + iOffsetZweiGefunden 'wurde schon eine gefunden?
iMengeUrlaub = 9 'Urlaubszähler
iMitarbeiterDatumOffset = oSheetMitarbeiter.getCellByPosition(3 , 1).Value 'Offsetholen fürs Datumsfeld
bAbJuli = False
For I = 1 to 15 step 1
While not bZweiGefunden
iZwei = oSheet.getCellByPosition(iZaehlerSpalte , iZaehlerZeile).value 'Inhalt holen
if iZwei="2" then 'prüfen ob 2
sDatumsFeld = izaehlerZeile - iMitarbeiterDatumOffset
sDatumZuZweiGefunden = oSheet.getCellByPosition(iZaehlerSpalte , sDatumsFeld).Value 'Datum holen
oSheetMitarbeiter.getCellByPosition(1 , imengeurlaub).Value = sDatumZuZweiGefunden 'Datum in Mitarbeiter speichern
iZaehlerSpalte = iZaehlerSpalte + 1
bZweiGefunden = True 'Schleife beenden
else
iZaehlerSpalte = iZaehlerSpalte + 1 'gleiche Zeile, nächste Zelle
if iZaehlerZeile<"33" then
if iZaehlerSpalte="184" then
iZaehlerSpalte = 2
bAbJuli = True
iZaehlerZeile = oSheetMitarbeiter.getCellByPosition(2 , 1).string
end if
end if
if iZaehlerSpalte="187" then
exit for
end if
end if
Wend


bZweigefunden = False

While not bZweiGefunden
iZwei = oSheet.getCellByPosition(iZaehlerSpalte , iZaehlerZeile).value
if iZwei="2" then
iZaehlerSpalte = iZaehlerSpalte + 1
if iZaehlerZeile<"33" then
if iZaehlerSpalte="184" then
iZaehlerSpalte = 2
iZaehlerZeile = oSheetMitarbeiter.getCellByPosition(2 , 1).string
end if
end if
if iZaehlerSpalte="187" then
exit for
end if
else
iZaehlerSpalteUrlaubEnde = iZaehlerSpalte - 1
sDatumsFeld = izaehlerZeile - 9
sDatumZuZweiGefunden = oSheet.getCellByPosition(iZaehlerSpalteUrlaubEnde , sDatumsFeld).value
oSheetMitarbeiter.getCellByPosition(2 , imengeurlaub).Value = sDatumZuZweiGefunden
bZweiGefunden = True
end if
Wend
bZweigefunden = False
iMengeUrlaub = iMengeUrlaub +1
Next

End Sub
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: Zelle auslesen innerhalb einer Function

Beitrag von Karolus »

Hallo

Wenn ich deinen Ausführungen folgen konnte musst du die Signatur der Sub ändern zu

Code: Alles auswählen

sub urlaub1( who )
überall da wo im Code der Mitarbeitername|Tabellenname hart codiert steht schreibst du dann who
aus anderen Subs kannst du dann

Code: Alles auswählen

urlaub1( "konkreter_name" ) 
benutzen.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Meister Propper
Beiträge: 6
Registriert: Sa, 21.03.2015 12:53

Re: Zelle auslesen innerhalb einer Function

Beitrag von Meister Propper »

@ Karulus

keine schlechte Idee, löst aber leider mein Problem nicht, da ich noch mehr Parameter übergeben müsste.

Deshalb die Idee, das in einer Function zu lösen.

Was mich verwirrt ist, das der Befehl Sheets bei mir in den Sub's funktioniert, in anderen Beiträgen dieser ebenfalls in Functionen benutzt wird, aber bei mir kommt da sofort eine Fehlermeldung.

Selbst wenn ich andere Functionen hier aus dem Forum teste kommt dieser Fehler.

Grundsätzlich sollte doch

oDoc = ThisComponent
oSheet = oDoc.Sheets(0)

auch innerhalb einer Function laufen, oder?
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: Zelle auslesen innerhalb einer Function

Beitrag von Karolus »

Hallo
... da ich noch mehr Parameter übergeben müsste.
unglaublich 8)
soll dir jemand jetzt vorkauen wie man mehrere Parameter übergibt??
Grundsätzlich sollte doch

oDoc = ThisComponent
oSheet = oDoc.Sheets(0)

auch innerhalb einer Function laufen, oder?
Ja.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Meister Propper
Beiträge: 6
Registriert: Sa, 21.03.2015 12:53

Re: Zelle auslesen innerhalb einer Function

Beitrag von Meister Propper »


unglaublich 8)
soll dir jemand jetzt vorkauen wie man mehrere Parameter übergibt??
Nein, natürlich nicht!
Ist mir nur an der Stelle zu Aufwändig, oder besser, eine Function würde mir da am ende viel Zeit sparen, da ich sie flexibler einsetzen kann ;-)


Ja.

und eben das geht nicht, also liegt das Problem bei mir Grundsätzlich woanders,
ich werde mal versuchen das mit einer anderen Version zu Testen.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Zelle auslesen innerhalb einer Function

Beitrag von Stephan »

ok,
d.H. die Definition oDoc=ThisComponent hat keine Wirkung?

ein ändern der Zeile in
oSheet = ThisComponent.Sheets.getByName ( "Uebersicht" )

hat allerdings den gleichen Fehler zur folge
dann verweist ThisComponent mutmaßlich auf das falsche Dokument-Objekt, z.B. auf eine (zusätzlich) geöffnete Textdatei

Für ThisComponent gilt allgemein:

"Mit thisComponent erfolgt der Zugriff auf das letzte aktive Dokument, aus der Sicht der IDE, oder das gerade aktuelle Dokument."

siehe:
http://www.starbasicfaq.de/Worinbesteht ... hisCo.html


Das Folgende liest per Function den Inhalt der Zelle A1 des Tabellenenblattes namens Tabelle1. Im Zweifel muss hierbei die Tabelle1 die am Bildschirm sichtbate/aktive Tabelle sein zum Zeitpunkt wo das Ganze gestartet wird:

Code: Alles auswählen

Dim oDoc

Sub Main
	oDoc = ThisComponent
	Msgbox zelle_lesen()
End Sub

Function zelle_lesen()
	zelle_lesen = oDoc.Sheets.getbyName("Tabelle1").getCellrangeByName("A1").String
End Function

Gruß
Stephan
Meister Propper
Beiträge: 6
Registriert: Sa, 21.03.2015 12:53

Re: Zelle auslesen innerhalb einer Function

Beitrag von Meister Propper »

Danke Stephan,
jetzt bin ich erst recht verwirrt. :-)

Wenn ich deinen Code genauso schreibe, meckert Calc beim Start zwar rum, bzgl. Sheets in der Funktion.
Die entsprechende Zelle im Tabellenblatt bleibt auch leer.

lösche ich die Zelle, und schreibe den Aufruf =zelle_lesen () noch mal rein, geht's allerdings ohne Fehlermeldung und mit dem richtigen Ergebnis.
Auch ein Start über das Sub Main liefert das richtige Ergebnis.

Und bzgl. aktiver Tabelle: ich hab in der ganzen Zeit nur dieses eine Dokument auf. Einen unterschied in den Fehlern, mit welchem aktiven Blatt der Tabelle ich das ganze Schließe kann ich nicht erkennen.

Ich versuche erst mal den Kopf wieder frei zu bekommen und dann fange ich noch mal von vorne an.
Habe durch Dich und Karolus ein paar gute Hinweise bekommen, wo ich noch suchen kann.

Gruß
Jens
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Zelle auslesen innerhalb einer Function

Beitrag von Stephan »

Wenn ich deinen Code genauso schreibe, meckert Calc beim Start zwar rum, bzgl. Sheets in der Funktion.
Die entsprechende Zelle im Tabellenblatt bleibt auch leer.

lösche ich die Zelle, und schreibe den Aufruf =zelle_lesen () noch mal rein, geht's allerdings ohne Fehlermeldung und mit dem richtigen Ergebnis.
Auch ein Start über das Sub Main liefert das richtige Ergebnis.
verständliches Verhalten von Calc, denn die Function weiß ja nichts davon welchen Inhalt oDoc hat wenn es nur im Makro steht.

Das ich das so sagen kann, beruht aber nur darauf weil ich aus Deinen jetzigen Ausführungen vermuten kann das du die Function in einer Tabellezelle aufrufst, denn die konkrete FRage dazu ob Du das tust ("Versuchst du gerade eine Funktion zu schreiben die du in|aus einer Zelle aufrufen möchtest??") hast Du ja nicht beantwortet.

verwende somit:

Code: Alles auswählen

Dim oDoc

Function zelle_lesen()
  oDoc = ThisComponent   
  zelle_lesen = oDoc.Sheets.getbyName("Tabelle1").getCellrangeByName("A1").String
End Function

wobei nunmehr wohl niemand versteht was das Ganze soll, denn der Aufruf:

=zelle_lesen()

macht ja das Gleiche wie ein Einfaches:

=A1

und ebenso wäre, sofern der Wert von A1 in der Function weiterverarbeitet werden soll, eine Function der Form:

Code: Alles auswählen

Function zelle_lesen(x)
  'x ist der Inhalt der übergebenen Zelle, tue etwas damit
End Function
und deren Aufruf mit:

=zelle_lesen(A1)

viel zweckmäßiger.

Allein hat das Karolus ja bereits angedeutet (sub urlaub1( who ) ist nämlich nichts Grundsätzlich Anderes als Function urlaub1(who)).


Gruß
Stephan
Antworten