Seite 1 von 1

=VERKETTEN() immer noch nicht für Bereiche?

Verfasst: So 21. Okt 2012, 22:44
von Lupo
Sowohl in meinem alten Excel als anscheinend auch beim aktuellen LO gibt es immer noch kein Bereichsverketten:

Stark
Schnell
Schwarz

sollte (auf sicher nicht nur meiner Wunschliste) durch =VERKETTEN(A1:A3;". ";WAHR;1) werden zu:

Stark. Schnell. Schwarz.

(optional: ". " gibt einen Trenner an. Default: kein Trenner)
(optional: WAHR gäbe an, nur nichtleere Zellen zu verketten. Default: FALSCH)
(optional: 1 gäbe dann an, dass der Trenner ". " auch am Schluss verwendet wird (2: am Anfang/3: am Anfang und am Schluss). Default: 0)

Oder habe ich es nur nicht gefunden?

Wie sähe entsprechend die sehr kurze VBA-UDF-Lösung http://sulprobil.com/html/sbcat.html in LO-Basic aus?
[Edit]Antwort: http://de.openoffice.info/viewtopic.php ... 68#p124973[/Edit]

Re: =VERKETTEN() immer noch nicht für Bereiche?

Verfasst: So 21. Okt 2012, 22:52
von swolf
Lupo hat geschrieben: Wie sähe entsprechend die sehr kurze VBA-UDF-Lösung http://sulprobil.com/html/sbcat.html in LO-Basic aus?
Die Frage gehört in das Unterforum 'LibreOffice Programmierung'.
http://www.libreoffice-forum.de/viewforum.php?f=12

Und Informationen zur StarBasic Programmierung findest du im openoffice.info-forum
http://de.openoffice.info/viewtopic.php ... c8ad8187fb

Re: =VERKETTEN() immer noch nicht für Bereiche?

Verfasst: So 21. Okt 2012, 23:48
von Lupo
Das war eine übergreifende Frage ;-)

"Gibt es VERKETTEN() wie gewünscht? (statt nur des unsinnigen Ersatzes für ...&...&...)"

Erst danach kam dann die Frage nach Basic. Die hatte ich dann aber schon selbst beantwortet. Also verbleibt nur erstere.

[Edit]Asche auf mein Haupt: Das hatte sich überschnitten.[/Edit]

Re: =VERKETTEN() immer noch nicht für Bereiche?

Verfasst: Mo 22. Okt 2012, 08:15
von karolus
Hallo
Aus meiner Python-'krabbelkiste' :

Code: Alles auswählen

...
from itertools.chain import from_iterable as flat
...
def sjoin( datarange , joinstring = "" ):    
    """
    Calcfunktion zum verketten ganzer Zellbereiche,
    mit Bereichsadressangabe und mit der optionalen
    Möglichkeit eines Verbindungszeichens oder -Texts
    """
    
    if isinstance (datarange, tuple): # cellranges always *nested* tuples       
        return joinstring.join("%s" % elem for elem in flat(datarange) if elem)
    else :
        return datarange    # a single cellvalue
Lediglich zur "Anbindung" als Calcfunktion wird dazu so etwas wie hier beschrieben benötigt.
( Da in diesem Fall kein Array zurückgegeben wird ist das auch relativ einfach als Addin-funktion umsetzbar ohne die unsinnige Basic-"Schnittstelle" )

Karolus

Re: =VERKETTEN() immer noch nicht für Bereiche?

Verfasst: Mo 22. Okt 2012, 09:07
von Lupo
@Karolus: Vielen Dank für den Einblick in die Krabbelkiste!

Als Höchstens-Nur-Etwas-Mit-Basic-Vertrauter-Nichtinformatiker frage/vermute ich nun mal folgendes:

1- Python läuft nur mit Java, oder? Trifft immer noch zu (LO 3.6.2), dass es eher Java 6 als Java 7 sein muss?

2- Unter Extras-Optionen kann ich bei Python nichts einfügen - liegt das an einem ausgewählten Java 7?

3- Das mit dem Wrapper habe ich schon mal gehört (und damals mit kleinem Testerfolg) für kompilierte Basic-Funktionen. Für den Laien: Was bedeuten Deine beiden Sätze?
Lediglich zur "Anbindung" als Calcfunktion wird dazu so etwas wie hier beschrieben benötigt.
( Da in diesem Fall kein Array zurückgegeben wird ist das auch relativ einfach als Addin-funktion umsetzbar ohne die unsinnige Basic-"Schnittstelle" )
3a- Da es hier ja um eine Calc-UDF (und nicht um eine Weiterverwendung innerhalb von anderen Funktionen, sei es Python oder etwas anderes, richtig?) geht, brauche ich wohl "so etwas", oder? Wie sähe es hier denn genau aus?
3b- Ein zurückgegebenes Array benötigt noch "etwas darüber hinaus", richtig? Was genau?

4- Vielleicht kannst Du noch kurz erklären, wie Du das mit der "unsinnigen Basic-Schnittstelle" meinst? Was ist daran "unsinnig", wann kann darauf verzichtet werden?

Vielen Dank für ein paar Antworten! An einem Beispiel hätte man dann als Laie eine zu einer konkreten Forumsfrage funktionierende Python-Funktion, und zumindest eine Ahnung davon, was man alles braucht, damit sie auch in Calc als UDF läuft.

Re: =VERKETTEN() immer noch nicht für Bereiche?

Verfasst: Mo 22. Okt 2012, 10:35
von karolus
Hallo

zu 1):
Python 'braucht' nur seinen Python-interpreter und seine eigenen Module - nix Java !
Beides wird mit Lo mitgeliefert ( sofern du das bei einer Benutzerdefinierten Installation nicht abwählst )

zu 2):
LO hat keine eingebaute IDE für Python, du musst schon mit einem externen Editor arbeiten und deine Scripte im Pfad:
~$USERCONFIG***/3/user/Scripts/python/... ablegen.

zu 3):
Ohne weiteres Zutun sind aus Calc heraus nur (Basic)-UDF's ansprechbar die in einer der Standard-bibliotheken abgelegt sind
( also enweder ~MeineMakros/Standard/Modulname/.. oder ~Dokumentname.ods/Standard/Modulename/... )

zu 3b):
das wird ausführlich in dem verlinktem Thread beschrieben.

zu 4):
Unsinnig ist die Tatsache, daß man im Prinzip für eine simple Funktion die mit 3 Zeilen Python abgehandelt wird, im einfachsten Fall rund 7 Zeilen in Basic schreiben muss.
Ohne Basicschnittstelle läufts auf eine Calc-Addin heraus.http://www.biochemfusion.com/doc/Calc_addin_howto.html
Eine etwas umfangreicheres in Python geschriebenes Addin ist: http://extensions.services.openoffice.o ... numbertext

***der Basispfad findet sich unter →Extras→Optionen→LO→Pfade

Karolus

Re: =VERKETTEN() immer noch nicht für Bereiche?

Verfasst: Mo 22. Okt 2012, 11:27
von Lupo
Aha.

1) hatte ich wohl missverstanden, weil beim Öffnen von Extr/Opt/Python (anders als bei Extr/Opt/Basic) LO mir ein defektes Java zurückmeldete. Dann setzte ich irgendwo einen Haken bei Java, und die Meldung war weg.

2)+3) ok. Das krieg ich mal später. Bin schon froh, wenn ich Funktionen in Basic hinbekomme.

4) ist es nicht so, das Python hier einfach den Range verketten kann, wo Basic scheitert, weil es den Range vorher in ein 1-dim Array wandeln muss? Doch nur deshalb ist es so viel kürzer (wenn man mal von "For-Next" absieht).

Code: Alles auswählen

function multikette( abereich as variant , trennzeichen as string ) '---Achtung: Funktion geht so nicht!---
    multikette = join(abereich, trennzeichen)
End function
wäre ja möglich, wenn abereich sequentiell in Basic ausgelesen werden könnte, statt erst eine neue Arrayvariable zu füllen.

Bernd Plumhoff nimmt in http://sulprobil.com/assets/images/2010 ... t_Code.png (warum er den Code nicht kopierbar macht, weiß ich nicht) "For Each" und verkürzt den Code dadurch auch. Allerdings ist vermutlich das mehrfache Anhängen an länger werdende Strings viel langsamer als Dein Join() (muss ich mal gegeneinander testen), wobei auch er das Join() statt dessen hätte verwenden können:

Code: Alles auswählen

function multikette( abereich as variant , trennzeichen as string ) '---funktioniert!---
    dim astring( ubound(abereich,1)* ubound(abereich,2) - 1 )
    for each eintrag in abereich
          astring(i) = eintrag
          i = i + 1
    next
    multikette = join(astring(),trennzeichen)
end function
Wenn man etwas "fair" ist, ist

Code: Alles auswählen

return joinstring.join("%s" % elem for elem in flat(datarange) if elem)
halt auch recht komplex.

In Basic ist es dagegen unfein ("Spaghetticode"),

Code: Alles auswählen

for each eintrag in abereich: astring(i) = eintrag: i = i + 1: next
zu schreiben. Dabei ist der Inhalt auch nicht komplexer.

Re: =VERKETTEN() immer noch nicht für Bereiche?

Verfasst: Mo 22. Okt 2012, 13:02
von karolus
Hallo
...wobei auch er das Join() statt dessen hätte verwenden können:
Hätte er nicht, ohne dabei auf die 'if not....' zeile zu verzichten.

Karolus