Problem:
Es gibt eine Reihe von Funktionen, die gesuchte Werte zurückgeben, etwa SVERWEIS, INDEX, MAX oder KKLEINSTE. Funktionen wie VERGLEICH, die deren Ort wiedergeben, sind hingegen eher dünn gesät. Dabei braucht man diesen Ort häufig für dynamische Anwendungen, etwa für die Rückgabe eines vorangehenden SVERWEIS-Werts oder mehrerer gleicher SVERWEIS-Treffer in einer Liste, um die Suchbereiche für die Anzeige weiterer Treffer zu ändern.
Ein Matrix-SVERWEIS wäre nutzlos, da ihm nur die Rückgabe des Werts an sich, jedoch kein Offset nach rechts möglich wäre, weil in einer Suchmatrix ja eben rechts weiter gesucht werden können soll. Damit wäre hier eine Konstruktion wie etwa =SUMMENPRODUKT(--(A:Z=Sucheintrag))>0 ausreichend.
Mit einem Matrix-VERGLEICH könnte jedoch eine andere Matrix mittels INDEX einen korrespondierenden Wert zurückgeben.
Lösung (es sind nur Zahlen in der Matrix erlaubt, siehe jedoch 0061!):
Benennen wir im folgenden die Matrix, z.B. =$A$1:$Y$99, einfach mit M. Das verkürzt die Formeln (da die Matrix oft angesprochen wird) und garantiert, dass alle betroffenen Bezüge angepasst werden. Netter Nebeneffekt: Die laufenden Indizes ZEILE($1:$99) und SPALTE($A:$Y) werden genauso durch ZEILE(M) und SPALTE(M) wiedergegeben. Alle {Formeln} müssen mit Strg-Umschalt-Eingabe abgeschlossen werden - sonst geht es nicht!
Im folgenden suchen wir nach dem relativen Ort des Werts 3 in der Matrix M. Durch das zunächst harte Hineinschreiben dieser 3 kann man die Formeln etwas besser lesen. Die Formeln müssen außerhalb von M stehen - sonst Zirkelbezug!
Nr.1 Z1: {=MIN(((M<>3)*2^15+(M=3))*SPALTE(M))}
gibt die erste Spalte wieder, in der der genaue Wert 3 auftaucht - wie
VERGLEICH(...;...;FALSCH). 2^14 ist die Spaltenanzahl in xl2007, so dass die
MIN-Funktion bei Nicht-Treffern richtig funktioniert.
Nr.2 Z1: {=MIN(((M<3)*2^15+(M>=3))*SPALTE(M))}
gibt die erste Spalte wieder, in der der Wert 3 oder ein höherer auftaucht -
wie
VERGLEICH(...;...).
Nr.3 Z1: {=MAX((M=3)*SPALTE(M))}
gibt die letzte Spalte wieder, in der eine 3 steht. Ist die 3 nur einmal
vertreten, kommt sie der Formel Nr. 1 gleich. Wie in Nr.2 lässt sich der
Vergleichsoperator natürlich auf ">=3" oder etwas anderes ändern.
Nr.4 Z2: {=VERGLEICH(3;BEREICH.VERSCHIEBEN(M;;Z1-1;;1);FALSCH)}
sucht in der oben (Nr.1, 2 oder 3) ermittelten Spalte nach dem ersten Auftreten
der genauen 3.
Nr.5 Z2: {=VERGLEICH(3;BEREICH.VERSCHIEBEN(M;;Z1-1;;1))}
hält sich an die Maßgabe von Nr.2 (also ">=3") nun auch bei der
ersten zutreffenden Zeile.
Nr.6 Z2: {=MAX((BEREICH.VERSCHIEBEN(M;;Z1-1;;1)=3)*ZEILE(M))}
verwendet die letzte Zeile der unter Nr.1, 2 oder 3 ermittelten Spalte. Mit MIN
statt MAX entspricht die Formel der Nr.4; allerdings werden dort nicht alle
Zeilen durchlaufen, weshalb VERGLEICH vorzuziehen ist.
Aus den Nr. 1-3 und 4-6 lassen sich schon 9 verschiedene Kombinationen bauen. Auch kann natürlich zuerst die Zeilensuche und dann die Wiedergabe der entsprechenden Spalte (mit einem völlig anderen Ergebnis!) vorgenommen werden, hier am Beispiel der transponierten Äquivalente zu Nr.1+4:
Nr.7 Z1: {=MIN(((M<>3)*2^21+(M=3))*ZEILE(M))}
Nr.8 Z2: {=VERGLEICH(3;BEREICH.VERSCHIEBEN(M;Z1-1;;1;);FALSCH)}
Aus Nr.1+4 sei abschließend noch eine einzelne Zelladresse in der Form Z1S1 oder A1 zusammengebaut:
Nr.9
{="Z"&VERGLEICH(3;BEREICH.VERSCHIEBEN(M;;
MIN(((M<>3)*2^15+(M=3))*SPALTE(M))-1;;1);)&"S"&
MIN(((M<>3)*2^15+(M=3))*SPALTE(M))}
bzw. Nr.10
=ADRESSE(VERGLEICH(3;BEREICH.VERSCHIEBEN(M;;
MIN(((M<>3)*2^15+(M=3))*SPALTE(M))-1;;1););
MIN(((M<>3)*2^15+(M=3))*SPALTE(M));4;)
Soll nun beispielsweise nicht nach der 3 gesucht werden, sondern nach dem nur in durch 11 teilbaren Zeilennummern liegenden Tabellenmaximum, kann die 3 überall durch MAX((REST(ZEILE(M);11)=0)*M) ersetzt werden. Das sieht dann für Nr.10 so aus:
{=ADRESSE(VERGLEICH(MAX((REST(ZEILE(M);11)=0)*M);BEREICH.VERSCHIEBEN(M;;
MIN(((M<>MAX((REST(ZEILE(M);11)=0)*M))*2^15+(M=MAX((REST(ZEILE(M);11)=0)*M)))*SPALTE(M))-1;;1););
MIN(((M<>MAX((REST(ZEILE(M);11)=0)*M))*2^15+(M=MAX((REST(ZEILE(M);11)=0)*M)))*SPALTE(M));4;)}
Dieses Monster sollte man durch zwei benannte Formeln
P: =MAX((REST(ZEILE(M);11)=0)*M)
N: =MIN(((M<>P)*2^15+(M=P))*SPALTE(M))
zurückstutzen auf:
{=ADRESSE(VERGLEICH(P;BEREICH.VERSCHIEBEN(M;;N-1;;1););N;4;)}