🙏 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!🍀

❤️ DANKE >> << DANKE ❤️

>> 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

Alles zur Programmierung im LibreOffice.
lessger
Beiträge: 249
Registriert: Fr 4. Mai 2012, 13:33

[Gelöst] Leere Zellen erkennen in Calc-Funktion

Beitrag von lessger » Mo 24. Mär 2014, 14:47

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
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

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Leere Zellen erkennen in Calc-Funktion

Beitrag von karolus » Mo 24. Mär 2014, 15:38

Hallo

hier gibts eine Addinn-function die das gewünschte tut.

Karolus
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

lessger
Beiträge: 249
Registriert: Fr 4. Mai 2012, 13:33

Re: Leere Zellen erkennen in Calc-Funktion

Beitrag von lessger » Mo 24. Mär 2014, 16:27

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
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Leere Zellen erkennen in Calc-Funktion

Beitrag von karolus » Mo 24. Mär 2014, 16:59

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
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

lessger
Beiträge: 249
Registriert: Fr 4. Mai 2012, 13:33

Re: Leere Zellen erkennen in Calc-Funktion

Beitrag von lessger » Mo 24. Mär 2014, 18:22

Danke, Karolus.

Muß ich wohl doch noch mit Python anfangen.

Grüße
Gerhard
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion

Beitrag von F3K Total » Mo 24. Mär 2014, 21:47

Hi,
nur am Rande sei erwähnt, das man über die Abfrage der Zelleigenschaft

Code: Alles auswählen

.Type
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
Windows 11: AOO, LO Linux Mint: AOO, LO

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion

Beitrag von karolus » Mo 24. Mär 2014, 23:16

Hallo Rik

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;...)
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
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

lessger
Beiträge: 249
Registriert: Fr 4. Mai 2012, 13:33

Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion

Beitrag von lessger » Mi 26. Mär 2014, 09:24

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
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion

Beitrag von F3K Total » Mi 26. Mär 2014, 18:15

... 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
Windows 11: AOO, LO Linux Mint: AOO, LO

lessger
Beiträge: 249
Registriert: Fr 4. Mai 2012, 13:33

Re: [Gelöst] Leere Zellen erkennen in Calc-Funktion

Beitrag von lessger » Mi 26. Mär 2014, 18:22

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
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.



Antworten