Seite 1 von 1

Leere Zellen in Calc aus Oo-basic erkennen

Verfasst: Mo, 05.01.2009 11:21
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!

Re: Leere Zellen in Calc aus Oo-basic erkennen

Verfasst: Mo, 05.01.2009 15:06
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

Re: Leere Zellen in Calc aus Oo-basic erkennen

Verfasst: Mo, 05.01.2009 20:17
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

Re: Leere Zellen in Calc aus Oo-basic erkennen

Verfasst: Mo, 05.01.2009 20:41
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

Re: Leere Zellen in Calc aus Oo-basic erkennen

Verfasst: Di, 06.01.2009 10:42
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

Re: Leere Zellen in Calc aus Oo-basic erkennen

Verfasst: Do, 08.01.2009 18:29
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


Re: Leere Zellen in Calc aus Oo-basic erkennen

Verfasst: Do, 08.01.2009 21:53
von Debugger
Ich hab' es eben selber schnell gestetet. Das funktioniert prima.



Martin

Re: Leere Zellen in Calc aus Oo-basic erkennen

Verfasst: Fr, 09.01.2009 07:44
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