Seite 1 von 2
[Gelöst] Leere Zellen erkennen in Calc-Funktion
Verfasst: Mo 24. Mär 2014, 14:47
von lessger
Ich habe mir für Calc als Starbasic-Macro eine Funktion geschrieben, um die Texte innerhalb eines ausgewählten Bereichs zu einer Zeichenkette zu verknüpfen. Der Aufruf sieht wie folgt aus:
=BVERKETTEN(Bereich,[Trennzeichen],[LeereZellenIgnorieren])
In Basic
Function BVERKETTEN (Bereich As Variant, Optional Trennzeichen As String, Optional LeereZellenIgnorieren As Boolean) As String
(...)
If Not LeereZellenIgnorieren Or Bereich(i,j)<>"" Then
(...)
Funktioniert soweit, außer meinem Parameter "LeereZellenIgnorieren". Der soll bewirken, daß leere Zellen nicht eingebunden werden. Funktioniert aber nur dann, wenn die Zelle einen leeren String enthält (""). Für wirklich leere Zellen ist der Typ der von Calc an Basic übergebenen Variablen numerisch und der Wert 0, was von einer echten 0 nicht zu unterscheiden ist.
Läßt sich eine leere Zelle bei der Übergabe an Basic erkennen?
Danke
Gerhard
Re: Leere Zellen erkennen in Calc-Funktion
Verfasst: Mo 24. Mär 2014, 15:38
von karolus
Hallo
hier gibts eine Addinn-function die das gewünschte tut.
Karolus
Re: Leere Zellen erkennen in Calc-Funktion
Verfasst: Mo 24. Mär 2014, 16:27
von lessger
Danke, Karolus.
Ja, die macht was ich suche, wenn auch ohne die Wahlmöglichkeit für leere Zellen, die ich vorgesehen hatte. Aber dann gibt es halt zwei Funktionen.
Ich habe mir die Extension installiert und ausprobiert. Ich wollte mir dann den Source Code ansehen, um zu lernen, wie ich mein Makro verbessern müßte (mehr aus Wißbegierde als aus Notwendigkeit). Ich finde aber unter Makros > Makros verwalten... > Python... nichts was zu PYJOIN paßt. Ist's geheim wie's funktioniert oder kann ich mir die Source irgendwo ansehen?
Grüße
Gerhard
Re: Leere Zellen erkennen in Calc-Funktion
Verfasst: Mo 24. Mär 2014, 16:59
von karolus
Hallo
Extensions werden im Pfad
$(deine User-config).../uno_packages/cache/uno_packages/
gespeichert unter einem kryptischen Ordnernamen.
Hier ist der Pythonsourcecode:
Code: Alles auswählen
import unohelper
from itertools import chain
from com.capylibre import Xtextfunc
flat = chain.from_iterable
class Textfunctions(unohelper.Base, Xtextfunc):
def __init__( self, ctx ):
self.ctx = ctx
def pyjoin(self, inrange, joinchar=""):
return joinchar.join('%s' % elem for elem in flat(inrange) if elem)
def createInstance( ctx ):
return Textfunctions( ctx )
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation(
createInstance,"com.capylibre.Textfunctions",("com.sun.star.sheet.AddIn",),)
wie du siehst hat die eigentliche Pythonfunction lediglich 2 Zeilen Code - der Rest ist Boilerplate für die Extension.
Mitentscheidend für das Ignorieren von
leeren Zellen ist aber die Datei textfunc.rdb die wiederum aus textfunc.idl kompiliert wird
textfunc.idl:
Code: Alles auswählen
module com {
module capylibre {
interface Xtextfunc {
any pyjoin(
[in] sequence< sequence< string > > inrange,
[in] any joinchar );
};
};
};
Die Typangabe '
string' sorgt dafür das die Inhalte des an python übergebenen Zellbereichs vorher explizit in Text umgewandelt werden. Mit dem Typ 'any' würden leere Zellen ebenfalls als Wert 0 interpretiert.
( Sowas geht bei simplen UDFs in Basic nicht )
Karolus
Re: Leere Zellen erkennen in Calc-Funktion
Verfasst: Mo 24. Mär 2014, 18:22
von lessger
Danke, Karolus.
Muß ich wohl doch noch mit Python anfangen.
Grüße
Gerhard
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
Verfasst: Mo 24. Mär 2014, 21:47
von F3K Total
Hi,
nur am Rande sei erwähnt, das man über die Abfrage der Zelleigenschaft
auf den Zellinhalt kommt.
Schreibe mal in den Zellbereich A1:A4
- nichts
- eine Zahl
- eine Text
- eineFormel
und lasse dieses Makro laufen:
Code: Alles auswählen
Sub S_find_empty
oSheet = thiscomponent.sheets.getbyname("Tabelle1")
for i = 0 to 3
ocell = oSheet.getcellbyposition(0,i)
select case ocell.Type
case com.sun.star.table.CellContentType.EMPTY
msgbox ocell.AbsoluteName & " ist leer"
case com.sun.star.table.CellContentType.VALUE
msgbox ocell.AbsoluteName & " enthält den Wert " & ocell.value
case com.sun.star.table.CellContentType.TEXT
msgbox ocell.AbsoluteName & " enthält den Text " & ocell.string
case com.sun.star.table.CellContentType.FORMULA
msgbox ocell.AbsoluteName & " enthält die Formel " & ocell.formula
end select
next i
End Sub
Gruß R
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
Verfasst: Mo 24. Mär 2014, 23:16
von karolus
Hallo Rik
Das ist schon klar, nur geht es hier um eine benutzerdefinierte Funktion die aus
Calc heraus aufgerufen wird in der Form:
in diesem Funktionsaufruf wird eben nicht das "vollständige" Zellbereichsobject durchgereicht mit allen Properties und Methoden sondern
nur ein 2D-Array mit den Inhalten der Zellen.
Karolus
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
Verfasst: Mi 26. Mär 2014, 09:24
von lessger
Danke, F3K Total, für die Code Beispiele.
Da die Doku für die LO Basic Programmierung nicht so super ist (oder ich die Superdoku nicht fnde), bin ich an solchen Beispielen sehr interessiert.
Allerdings hilft es in dem konkreten Fall nicht weiter, wie Karolus schon sagte. Von Calc wird an eine UDF nur ein Array of Variant weitergegeben. Leere Zellen haben dabei den Typ Double und den Wert 0, von einer echten 0 nicht zu unterscheiden. Es gibt auch keinen Bezug zurück auf die ursprünglichen Zellen.
Danke und Gruß
Gerhard
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
Verfasst: Mi 26. Mär 2014, 18:15
von F3K Total
... ich denke man kann, auch wenn "nur" ein Array was den Zellbereich beschreibt, also quasi die Zelladressen übergeben wird, innerhalb der UDF mit Hilfe der Zelladressen auf die Zellen zugreifen.
Gruß R
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
Verfasst: Mi 26. Mär 2014, 18:22
von lessger
F3K Total hat geschrieben:... ich denke man kann, auch wenn "nur" ein Array was den Zellbereich beschreibt, also quasi die Zelladressen übergeben wird, innerhalb der UDF mit Hilfe der Zelladressen auf die Zellen zugreifen.
Gruß R
Ich wüßte nicht wie...
Man hat ja keinen Einfluß darauf, was Calc an die Funktion übergibt. Und die übergebene Struktur habe ich mir mit Xray angesehen, das ist wirklich nur der Inhalt der Zellen als Array.
Grüße
Gerhard