🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱
🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
[Gelöst] Leere Zellen erkennen in Calc-Funktion
[Gelöst] Leere Zellen erkennen in Calc-Funktion
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
=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
Zuletzt geändert von lessger am Mo 24. Mär 2014, 18:22, insgesamt 1-mal geändert.
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit
Re: Leere Zellen erkennen in Calc-Funktion
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Re: Leere Zellen erkennen in Calc-Funktion
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
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
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit
Re: Leere Zellen erkennen in Calc-Funktion
Hallo
Extensions werden im Pfad $(deine User-config).../uno_packages/cache/uno_packages/
gespeichert unter einem kryptischen Ordnernamen.
Hier ist der Pythonsourcecode:
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:
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
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",),)
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 );
};
};
};
( Sowas geht bei simplen UDFs in Basic nicht )
Karolus
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Re: Leere Zellen erkennen in Calc-Funktion
Danke, Karolus.
Muß ich wohl doch noch mit Python anfangen.
Grüße
Gerhard
Muß ich wohl doch noch mit Python anfangen.
Grüße
Gerhard
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
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
Gruß R
nur am Rande sei erwähnt, das man über die Abfrage der Zelleigenschaft
Code: Alles auswählen
.Type
Schreibe mal in den Zellbereich A1:A4
- nichts
- eine Zahl
- eine Text
- eineFormel
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
Windows 11: AOO, LO Linux Mint: AOO, LO
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
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
Das ist schon klar, nur geht es hier um eine benutzerdefinierte Funktion die aus Calc heraus aufgerufen wird in der Form:
Code: Alles auswählen
BVERKETTEN( A1:B5;...)
Karolus
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
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
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
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
... 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
Gruß R
Windows 11: AOO, LO Linux Mint: AOO, LO
Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion
Ich wüßte nicht wie...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
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
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit
An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:
Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.