Leere Zellen in Calc aus Oo-basic erkennen

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

Moderator: Moderatoren

marmue
Beiträge: 6
Registriert: Mo, 05.01.2009 11:14

Leere Zellen in Calc aus Oo-basic erkennen

Beitrag von marmue »

Sorry, wahrscheinlich eine newbie-Frage, aber die Suchfunktion hat mir nicht das geliefert, was ich zu finden hoffte.

Ich möchte gerne eine Funktion schreiben, der ein Zellbezug mitgeteilt wird und die dann etwas berechnet. Ist die angegebene Zelle jedoch leer, soll eine Sonderfallbehandlung angewendet werden.
Die folgenden Versuche, eine leere Zelle zu erkennen, waren erfolglos, d.h. die Variable testit bleibt leer, bei Aufruf z.B. mit =Testit(A1) (Funktionsaufruf in B1) und absolut leerer Zelle A1.

Code: Alles auswählen

Function Testit(z)

Testit="*"
If IsNull(z) Then
  Testit = "NULL_" 
End If

If IsEmpty(z) Then 
  Testit = Testit + "empty_" 
End If

If IsMissing(z) THEN ' ist eigentlich klar, dass dies die falsche Funktion ist
  Testit = Testit + "missing_" 
End If

If (z="") THEN
  Testit = Testit + "nix_" 
End If

Testit = Testit +"*"

End Function
Wie mache ich es richtig? Danke im Voraus!
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Leere Zellen in Calc aus Oo-basic erkennen

Beitrag von Charly »

Hallo Marmue!

Du verwendest den Funktionsnamen Testit zu häufig als Variable. Du solltest alle Veränderungen mit einer anderen Variablen machen und erst, wenn du das endgültige Ergebnis hast, dieses der Funktionsvariablen zuweisen.

Als weiteres kann in der Funktion nicht unterschieden werden, zwischen dem Wert "0" und einer leeren Zelle. Indem Moment, indem der Inhalt der Zelle der Variablen zugewiesen wird, steht diese auf Null und der Befehl IsEmpty (Z) greift nicht mehr.

Ich habe eine Lösung gefunden mit Hilfe einer Calcfunktion, die als zweiter Parameter mitgegeben werden muss.
Der Funktionsaufruf lautet dabei : =Testit(A1;Istleer(A1))

Der Code dafür ist:

Code: Alles auswählen

Function Testit(z, KZ)

If KZ = 1 then
Erg = "*" & "Empty" 
end if

IF z= 0 and KZ = 0 then
Erg = "*" & "Null"
end if

Erg = Erg & "*"

Testit = Erg
End Function
Gruß
Charly
marmue
Beiträge: 6
Registriert: Mo, 05.01.2009 11:14

Re: Leere Zellen in Calc aus Oo-basic erkennen

Beitrag von marmue »

Hallo Charly,

die Testit-Variable ist gar nicht wichtig, die habe ich nur benutzt um die Effekte der unterschiedlichen Funktionen in einem Rutsch zu testen.

Aber Deine Idee bringt mich erst einmal weiter, denn sie funktioniert! Besten Dank also!

Es mutet natürlich etwas merkwürdig an, wenn ein einfacher Funktionsaufruf Eigenschaften von als Parameter übergebenen Zellen ändert. Ein erwünschter Seiteneffekt kann das eigentlich nicht sein.

Viele Grüße

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

Re: Leere Zellen in Calc aus Oo-basic erkennen

Beitrag von Stephan »

Es mutet natürlich etwas merkwürdig an, wenn ein einfacher Funktionsaufruf Eigenschaften von als Parameter übergebenen Zellen ändert.
Und wo geschieht das? Im hier besprochenen Beispiel sicher nicht.


Gruß
Stephan
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Leere Zellen in Calc aus Oo-basic erkennen

Beitrag von Charly »

Hallo Mamue!

Eine empty Zelle hat nun mal den Wert Null. Gib mal die Funktion ein =wenn(A1=0;"Ja";"nein"), dann wirst du ja erhalten, egal ob in A1 der Wert Null steht oder ob die Zelle leer ist.
Der Inhalt der Zelle und die Eigenschaft "Empty" sind zwei verschiedene Sachen. Der Wert für die Variable "Z" ist also korrekt, wenn er bei einer Empty-Zelle auf Null steht.

Die Zelle ist ein Objekt. Aus einem Object können viele Informationen gewonnen werden. Leider kann man der Funktion, die Zelle nicht als Objekt mitgeben, wenn sie aus der Tabelle heraus aufgerufen wird. Das bedeutet jede gewünschte Information muss einzeln mitgegeben werden.


Gruß
Charly
Debugger
**
Beiträge: 27
Registriert: Do, 24.07.2008 14:20

Re: Leere Zellen in Calc aus Oo-basic erkennen

Beitrag von Debugger »

Das habe ich im StarBasic-Handbuch von Sun zum Inhalt einer Zelle gefunden:

(ungetestet, Rückmeldung wäre nett)

Code: Alles auswählen

Dim Doc As Object
Dim Sheet As Object
Dim Cell As Object
Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)
Cell = Sheet.getCellByPosition(1,1)
Cell.Value = 1000
Select Case Cell.Type
Case com.sun.star.table.CellContentType.EMPTY
   MsgBox "Content: Empty"
Case com.sun.star.table.CellContentType.VALUE
   MsgBox "Content: Value"
Case com.sun.star.table.CellContentType.TEXT
   MsgBox "Content: Text"
Case com.sun.star.table.CellContentType.FORMULA
   MsgBox "Content: Formula"
End Select

Debugger
**
Beiträge: 27
Registriert: Do, 24.07.2008 14:20

Re: Leere Zellen in Calc aus Oo-basic erkennen

Beitrag von Debugger »

Ich hab' es eben selber schnell gestetet. Das funktioniert prima.



Martin
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Leere Zellen in Calc aus Oo-basic erkennen

Beitrag von Charly »

Hallo Martin!

Die von dir gefundenen Befehle sind mir bekannt. Sie können aber nur verwendet werden, wenn dem Makro bekannt ist, welche Zelle er abfragen soll.
Mamue hat geschrieben: bei Aufruf z.B. mit =Testit(A1) (Funktionsaufruf in B1) und absolut leerer Zelle A1.
Mamue will die Funktion also aus der Tabelle heraus aufrufen. Das Makro kennt nur die mitgegebenen Parameter, nicht jedoch die Zelle, auf die sich die Daten beziehen. Die Variable, die den Inhalt der Zelle abfrägt, ist nun einmal nicht empty, da sie mit "Null" belegt ist.

Um die Zelle abfragen zu können, bräuchte das Makro noch den "Namen oder Index der Tabelle" und "den Namen oder Index(=Spalte und Zeile) der Zelle". Der Befehl ThisComponent.getCurrentSelection kann bei aus der Tabelle heraus gestarteten Funktionen nicht verwendet werden. Dazu müsste immer die richtige Zelle aktiviert sein. Spätestens beim abspeichern und Wiederöffnen, wirst du Probleme bekommen, wenn Calc versucht das Dokument neu zu berechnen. Da ist es leichter die gewünschten Daten mit der Funktion Istleer mitzugeben.

Gruß
Charly
Antworten