Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1556to1560
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array-Matrix

Array-Matrix
13.05.2017 14:02:52
Niclaus
Grüezi miteinander!
Ich beschäftige mich mit Arrays und brauche Eure Hilfe.
In A1 steht das Wort "Excel". Aufgesplittet in die ANSI-Codes erhalte ich "69,120,99,101,108".
In C2 erhalte ich diese Werte auf ganz traditionelle Art mit =CODE(TEIL(A1;1;99)) & "," & CODE(TEIL(A1;2;99)) & "," & CODE(TEIL(A1;3;99)) & "," & CODE(TEIL( _ A1;4;99)) & "," & CODE(TEIL(A1;5;99))
Ich möchte diese Formel in eine Array-Formel umwandeln, also ohne VBA. Ich schaffe es aber nicht. Kann mir jemand einen Tipp dazu geben?
Mit VBA funktioniert das mit dieser Function (in C3):

Function codezelle(zelle)
lz = Len(zelle)
For i = 1 To lz
cz = Asc(Mid(zelle, i, 1))
cztot = cztot & "," & cz
Next
codezelle = Mid(cztot, 2, 9999)
End Function

In C6 und C7 habe ich die Summe dieser Code-Werte berechnet. Hier klappt es mit der Array _ Formel in C7:

=SUMME(CODE(TEIL(A1;ZEILE(INDIREKT("A1:A"&LÄNGE(A1)));1)))

Eingegeben als Matrix-Formel mit CTRL-SHIFT-RETURN.
Der langen Rede kurzer Sinn: Wie wandle ich die Formel in C2 in eine Array-Formel um, analog zur Formel in C7?
Vielen Dank für eure Hilfe!
Niclaus
Tabelle3

 ABC
1ExcelAufsplittung in Codes 
2 primitive Formel:69,120,99,101,108
3 VBA-Function:69,120,99,101,108
4   
5 Summe der Codes 
6 primitive Formel:497
7 Array-Formel:497

Formeln der Tabelle
ZelleFormel
C2=CODE(TEIL(A1;1;99)) & "," & CODE(TEIL(A1;2;99)) & "," & CODE(TEIL(A1;3;99)) & "," & CODE(TEIL(A1;4;99)) & "," & CODE(TEIL(A1;5;99))
C3=codezelle(A1)
C6=CODE(TEIL(A1;1;99)) + CODE(TEIL(A1;2;99))+ CODE(TEIL(A1;3;99)) + CODE(TEIL(A1;4;99))+ CODE(TEIL(A1;5;99))
C7{=SUMME(CODE(TEIL(A1;ZEILE(INDIREKT("A1:A"&LÄNGE(A1))); 1)))}
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
das funktioniert erst mit Excel-2016
13.05.2017 14:54:25
WF
hab' ich auch nicht.
Da gibt es die Funktion TEXTKETTE (oder ähnlich).
WF
Excel 2010
13.05.2017 16:27:29
snb
C1:C5: =CODE(MID($A$1;{1;2;3;4;5};1))
in ONLINE-Excel (zum Testen für WF)
14.05.2017 08:56:44
lupo1
C2: =TEXTVERKETTEN(",";;INDEX(CODE(TEIL(A1;ZEILE(INDIREKT("1:"&LÄNGE(A1)));1));)) oder
C2: =TEXTVERKETTEN(",";;INDEX(CODE(TEIL(A1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1));))
ohne {} möglich, da hier das Hineinziehen von INDEX(...;) klappt.
Online-Excel scheint Strg-Umsch-Eing (oder anders) noch nicht zu können, also weder deren Eingabe noch das korrekte Öffnen von Dateien damit.
Hinweis: Für das kostenlose Verwenden von Online-Excel benötigt man nur einen kostenlosen Zugang über Outlook.de (bzw. live.com). Dann geht man auf
https://office.live.com/start/Excel.aspx?omkt=de-DE&auth=1&nf=1
Anzeige
TEXTVERKETTEN ist Excel-2016, was ich nicht habe.
14.05.2017 09:07:42
WF
.
und hier auch gleich die Summe ohne {}
14.05.2017 09:13:16
lupo1
C2: =SUMMENPRODUKT(--GLÄTTEN(TEIL(TEXTVERKETTEN(WIEDERHOLEN(" ";99);;INDEX(CODE(TEIL(A1;
ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1));));
ZEILE(A1:INDEX(A:A;LÄNGE(A1)))*99-98;99)))
ergibt mit
A1: Excel
C2: 497
(ab Excel 2016, in Excel 365 oder Excel-Online)
AW: diese ist nun überhaupt nicht notwendig ...
14.05.2017 11:26:18
...
Hallo lupo1,
... denn dafür reicht ja schon die von Niclaus bereits selbst aufgezeigte Formel bzw. die von mir mit SUMMENPRODUKT() mit INDEX() oder alternativ auch:
=SUMME(INDEX(CODE(TEIL(A1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1));)) aus.
Das was Niclaus gesucht hat, wäre dann wohl =TEXTVERKETTEN(",";;INDEX(CODE(TEIL(A1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1));)), welche aber erst in der Version 2016 genutzt werden kann.
Allerdings mir stellt sich nach wie vor die Frage, wozu würde denn so eine Auflisting und vor allem nur in einer Zelle wirklich gebraucht? Ihm ging es mE möglicherweise darum, dass er nicht verstehen kann (wie ich auch), dass in seiner Excelversion standardmäßig eine derartige Matrix zwar "verwurstet" aber nicht direkt als Zellwert ausgegeben werden kann.
Gruß Werner
.. , - ...
Anzeige
Ich werde doch wohl nicht meine Aussage unten ...
14.05.2017 15:43:32
Luc:-?
…revidieren müssen, Werner…‽ ;-]
Warum soll denn ein Vektor (in Xl ist alles mit mehreren Werten eine Matrix!) in nur einer Zelle darstellbar sein können? Das ist in keinem Fall so! Will man so etwas erreichen, müssen die Werte miteinander zu einem Text verbunden wdn!
Ginge es aber nur um die Vorstufe einer Weiterverarbeitung, ist ja erreichbar, dass die ganze Matrix auch in nur einer Zelle zV steht, aber das ist ja etwas Anderes, denn dafür muss man etwas tun, was auch Niclaus, Lupo und du getan haben, wobei es mehrere Varianten gibt.
Folglich ist mir ziemlich unverständlich, worum sich in diesem recht simplen Fall die Diskussion eigentlich dreht bzw drehen soll. Da gibt's ja wesentlich kompliziertere Fälle, bei denen ich das eher verstehen würde…
Gruß, Luc :-?
Anzeige
AW: musst Du nicht ...
15.05.2017 09:59:45
...
Hallo Luc,
... denn einerseits meinte ich persönlich nicht wesentlich anderes als Du und anderseits hab ich mit meiner Aussage an lupo1 zu dessen vorangegangenen zwei Formelvorschlägen "Das was Niclaus gesucht hat, wäre dann wohl =TEXTVERKETTEN(",";;INDEX(CODE(TEIL(A1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1));)), welche aber erst in der Version 2016 genutzt werden kann." nur den mE wesentlicheren Bezug zu Niclaus ursprünglicher Fragestellung herzustellen versucht.
Richtigstellen möchte ich jedoch, dass es nicht wirklich mein Wunsch war und ist, einen Datenvektor in einer Zelle darzustellen. Sondern dies wurde und wird von vielen Usern immer wieder als Wunsch geäußert, den man dann manchmal auf verschiedenste Art und Weise nachkommt bzw. nachkommen möchte.
Mit Standardfunktionen war das bis zur Bereitstellung von =TEXTVERKETTEN() ab Version 2016 aber nur mit VBA, UDFs oder "Formelklimmzügen" bzw. Hilfszellen möglich.
Gruß Werner
.. , - ...
Anzeige
Na, denn iss ja jut... ;-) owT
15.05.2017 19:32:21
Luc:-?
:-?
AW: die Matrix wird schon erzeugt, aber ...
13.05.2017 17:12:08
...
Hallo Niclaus,
... sie kann mit den Standard-Excel-Funktionen vor Excel 2016 nicht so ausgegeben werden, sondern lediglich für die weitere direkte Verwendung genutzt werden.
Also: =CODE(TEIL(A1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));99)) erzeugt zwar diese Matrix (kannst Du leicht überprüfen, indem Du diese Formel in der Eingabezeile markierst und die Taste [F9] betätigst).
Die Ausgabe kann auch mit dem eingeben als Matrix-Formel (CTRL-SHIFT-RETURN) nicht erzwungen werden.
Allerdings kann sie auch ohne klassische Matrixformel "verarbeitet" werden z.B. zur Summenermittlung so: =SUMMENPRODUKT(CODE(TEIL(A1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1)))
Es gibt allerdings im Netz UDFs, wie z.B. Vjoin vom User Luc hier im Forumsarchiv, die das direkt ermöglichen.
Du hast sicherlich bemerkt, dass ich anstelle INDIREKT() auf die nicht volatile und auch flexiblere Funktion INDEX() zurückgreife. Mehr dazu sieh mal hier: http://www.online-excel.de/excel/singsel.php?f=180 und hier: http://www.online-excel.de/excel/singsel.php?f=24
Die von Dir aufgezeigte Ergebnisausgabe kann übrigens exakt in dieser Form auch in Version 2016 mit der Funktion TEXTKETTE() nicht ohne "Hochzüge" erzielt werden.
Dort müsste man z.B. als Matrixformel:
{=WECHSELN(TEXTKETTE(CODE(TEIL(A1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1))&",");",";"";LÄNGE(A1))}
eingeben. Also da verzichte ich doch lieber auf eine derartige Ausgabe ;-)
Gruß Werner
.. , - ...
Anzeige
er hat die Funktion TEXTKETTE (noch) nicht
13.05.2017 18:07:24
WF
das ist alles
PUNKT
AW: und die würde ihn auch nicht viel nützen ...
13.05.2017 18:57:35
...
Hallo WF,
... jedenfalls nicht so, wie er es dargestellt hat.
Und wenn Du meinen Beitrag an Niclaus gelesen hättest, müsstest Du feststellen, dass meine dort getroffene Aussagen nicht konträr zu Deinen hier getroffenen stehen.
Gruß Werner
.. , - ...
Ab xl2007 mit meiner WIEDERHOLEN-Formel
14.05.2017 01:44:58
lupo1
{=SUMME(--WENNFEHLER(--GLÄTTEN(TEIL(WECHSELN(C2;",";WIEDERHOLEN(" ";99));(ZEILE($1:$99)-1)*99+1;99)); 0)) }
Vermutlich bekommt man noch das WENNFEHLER weg ... dann geht es auch mit den alten Excels.
Hier ohne {} und für uralte Excels
14.05.2017 01:51:45
lupo1
=SUMMENPRODUKT(--GLÄTTEN(TEIL(WECHSELN(C2;",";WIEDERHOLEN(" ";99));(ZEILE(
INDIREKT("1:"&1+LÄNGE(C2)-LÄNGE(WECHSELN(C2;",";))))-1)*99+1;99)))
Anzeige
Frage falsch gelesen - owT
14.05.2017 02:19:07
lupo1
Warum Array/Matrix?
14.05.2017 01:52:40
Luc:-?
Was willst du wirklich erreichen, Niclaus,
die Summe der CodeWerte, den CodeWerte-Vektor oder beides, evtl Letzteren nur als Zwischenstufe zu Ersterem?
Deine UDF gibt eine scheinbare AW darauf, indem sie eine kommagetrennte Folge von CodeWerten zurückgibt. Das ist aber kein Datenfeld (hier Array-Vektor), sondern einfach nur ein (Listen-)Text (hier als Elemente­Aufzählung). Die angegebenen Fmln bilden beides, den Text und die Summe!
Aus dem ListenText kannst du aber nicht direkt die Summe bilden, so dass der als Zwischenstufe eigentlich ausscheidet.
Werner (neopa) hat diesen Widerspruch als offensichtlich bisher Einziger bemerkt und ist dann auch darauf eingegangen! Dabei hat er völlig recht mit seiner Anmerkung, dass die neue XlFkt TEXTKETTE auch für die Bildung des ListenTextes ungeeignet ist. Sie ist für simple TextAnreihungen gedacht, nicht für zusätzliche Einschübe von Trenn- resp Verbindungs­Zeichen! Man könnte das dann zwar so lösen, wie er gezeigt hat, das ist aber unökonomisch, da dafür die neue XlFkt TEXTVERKETTEN (TextJoin) prädestiniert ist! In allen XlVersionen vor 2013 stehen diese Fktt aber nicht zV, wohl aber die erwähnte UDF VJoin (ab Xl9/2k einsetzbar). Aber wird das denn überhpt benötigt…‽
Falls nicht, würden ja folgende normale (keine Matrix-)Fmln reichen:
Deine so: =SUMMENPRODUKT(CODE(TEIL(A1;ZEILE(INDIREKT("A1:A"&LÄNGE(A1)));1)))
Werners: =SUMMENPRODUKT(CODE(TEIL($A$1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1)))
Mit anderen UDFs dann ggf auch so: =AggregateXk(-9;6;CODE(VSplit(A1;"")))
Oder einfach nur so: =SUMMENPRODUKT(CODE(VSplit(A1;"")))
Ginge es nur um die Summe, hättest du deine UDF auch darauf ausrichten können, wie ich das schon vor Jahren mit meiner UDF SumBin getan hatte. Dann würde so etwas reichen: =SumBin(A1)
Wenn es aber unbedingt eine (hier singulare, also 1zellig-1wertige) MatrixFml wdn soll, könnte man auch folgd UDF-haltigen Fmln wählen:
{=TxEval(VJoin(CODE(TEIL($A$1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1));"+"))}
{=TxEval("sum("&VJoin(CODE(TEIL($A$1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1));;2)&")") } [*]
[* Nur unveröffentlichte VJoin-Vs1.5!]

Diese geht für die Summenbildung von einer Aufzählung in Form einer MatrixKonstante in Textform aus. Anderenfalls (wie beim von dir gezeigten ListenText) käme diese singulare MatrixFml (mit UDFs) infrage:
{=TxEval("sum("&VJoin(CODE(TEIL($A$1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1));",")&")")}
Die könnte man auch in ihre beiden Bestandteile aufteilen und erst den ListenText bilden und anzeigen und dann daraus die Summe ermitteln:
C1:{=VJoin(CODE(TEIL($A$1;ZEILE(A1:INDEX(A:A;LÄNGE(A1)));1));",")}
=TxEval("sum("&C1&")")
Statt TEIL kann natürlich auch in den letzten Fmln VSplit verwendet wdn!
VJoin & VSplit: https://www.herber.de/bbs/user/99024.xlsm [BspDatei]
AggregateXk: https://www.herber.de/forum/archiv/1468to1472/1469329_Zum_WE_Kleiner_Exkurs_ueber_ContainerFktt.html#1470618 [Vs1.2, aktuell im Archiv aber 1.3!]
TxEval: https://www.herber.de/forum/archiv/1476to1480/1476498_Projektplan.html#1477400
SumBin: unveröffentlicht, kannst du aber selbst!
Morrn + schöSo, Luc :-?
Besser informiert mit …
Anzeige
Wohl eher ein Warthberg! Keine einzige AW! :-[
19.05.2017 18:15:03
Luc:-?
Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige