Aufgabe:
Lückenhafte Matrixeinträge sollen (Nachtrag vom 2008.01.25: "zeilenweise!") lückenlos und unsortiert in einer Spalte wiedergegeben werden (als Erweiterung von http://excelformeln.de/formeln.html?welcher=160, wo es nur um eine Spalte statt einer Matrix geht).
A B C D E F 1 Matrix Vektor 2 1 2 3 1 3 4 50 2 4 3 5 6 7 80 9 4 6 10 11 50 7 12 6 8 7 9 80 10 9 11 10 12 11 13 12 Illustration der Aufgabe
Lösung (Klaus "Perry" Pago vom 2007.06.20):
F2: =INDEX($A$2:$D$7;GANZZAHL(
KKLEINSTE(WENN($A$2:$D$7<>"";(ZEILE($1:$6)-1)*6+SPALTE(A:D));ZEILE(A1))/6)+1;REST(
KKLEINSTE(WENN($A$2:$D$7<>"";(ZEILE($1:$6)-1)*6+SPALTE(A:D));ZEILE(A1));6))
- ist ab dem = (Gleichheitszeichen) zusammenhängend in eine Excel-Zelle einzufügen
- ist eine Matrixformel (mit STRG-UMSCH-EINGABE einzugeben, sonst geht es nicht)
- ist nach unten zu kopieren
Eine Abwandlung für spaltenweise Wiedergabe wird aufgeführt unter http://excelformeln.de/formeln.html?welcher=315.
Generalisierung (etwas komplex) für beliebig große Matrix:
Benennt man die "Matrix" als solche und den (s.o.) sich wiederholenden Term
KKLEINSTE(WENN($A$2:$D$7<>"";(ZEILE($1:$6)-1)*6+SPALTE(A:D));ZEILE(A1))
als "lfdPlatz" mit der verallgemeinerten Formel (unter Einfügen Name Definieren - bezieht sich auf)
=KKLEINSTE(WENN(Matrix<>"";(ZEILE(INDIREKT("1:"&ZEILEN(Matrix)))-1)*ZEILEN(Matrix)+
SPALTE(INDIREKT(WECHSELN("A:"&ADRESSE(1;SPALTEN(Matrix);4);"1";))));ZEILE(1:1))
(in Zeile 1 des Zielvektors stehend definiert, wichtig!), dann passt sich die o.g. Lösung in der Tabelle als
(z.B. in F2:) {=INDEX(Matrix;lfdPlatz/ZEILEN(Matrix)+1;REST(lfdPlatz;ZEILEN(Matrix)))}
jeglichen Änderungen der Größe und Lage von "Matrix" sofort an, ohne dass man weitere Parameter manuell nachführen müsste. Somit können ohne sonstige Anpassung in der Matrix Zeilen und Spalten gelöscht oder eingefügt werden (!).
Hinweis: Aufgrund der max. Verschachtelungstiefe von 8 funktioniert die denkbare Formel (mit 10 Funktions-Klammerebenen)
{=INDEX(Matrix;
KKLEINSTE(WENN(Matrix<>"";(ZEILE(INDIREKT("1:"&ZEILEN(Matrix)))-1)*ZEILEN(Matrix)+
SPALTE(INDIREKT(WECHSELN("A:"&ADRESSE(1;SPALTEN(Matrix);4);"1";))));ZEILE(1:1))
/ZEILEN(Matrix)+1;REST(
KKLEINSTE(WENN(Matrix<>"";(ZEILE(INDIREKT("1:"&ZEILEN(Matrix)))-1)*ZEILEN(Matrix)+
SPALTE(INDIREKT(WECHSELN("A:"&ADRESSE(1;SPALTEN(Matrix);4);"1";))));ZEILE(1:1))
;ZEILEN(Matrix)))}
ohne die o.g. Ausgliederung des benannten Teilausdrucks lfdPlatz vor
xl2007 nicht.