Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Wenn-Formel mit Reihenfolge

Forumthread: Wenn-Formel mit Reihenfolge

Wenn-Formel mit Reihenfolge
20.06.2018 17:51:59
Rud
Hallo allerseits,
Also ich habe einen totalen knacks, irgendwie kann ich mir die folgende Formel nicht klardenken - vielleicht liegts an der Hitze :)
Ich habe eine File wo in A1-A8 Zahlen von 1-8 definiert sind. Unter jeder Zahl habe ich einen Namen. Der Output sollte die Reihenfolge der Namen sein, getrennt durch jeweils ";" (siehe beiliegende Excel File).
https://www.herber.de/bbs/user/122212.xlsx
Wenn ich nun bei den Zahlen A1-A8 die Reihenfolge ändere, so z.B. bei Zelle A1 neu "3" drin habe, soll im Output, der darunterliegende Name an dritterstelle erscheinen usw.
Lagomio, habe Schweissausbrüche deswegen :P
Tausend Dank
R
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
8 mal Index/Vergleich
20.06.2018 18:06:51
WF
Hi,
=INDEX(2:2;VERGLEICH(1;1:1;0))&"; "&INDEX(2:2;VERGLEICH(2;1:1;0))&"; "&INDEX(2:2;VERGLEICH(3;1:1;0)) &"; "
usw. mit 4 bis 8
WF
AW: alternativ eine kurze Formel, wenn ...
20.06.2018 19:17:31
neopa
Hallo R,
... Hilfszellen nicht stören, gib in J2 folgende Formel ein:
=INDEX(2:2;VERGLEICH(KKLEINSTE(1:1;SPALTE(A1));1:1;0))&WENN(K2="";"";";"&K2)
und kopiere diese ziehend bis Q2. (Spalte K bis Q lassen sich danach auch ausblenden)
Das gewünschte Ergebnis steht abschließend in J2.
Falls eine unterschiedliche Anzahl ausgewertet werden soll (mal 5 mal 9 etc) kann man noch eine Fehlerabfangung einbauen. Du hattest jedoch konstant 8 vorgegeben.
Gruß Werner
.. , - ...
Anzeige
Wohl einzige Alternative ohne VBA zu WFs ...
23.06.2018 00:28:31
Luc:-?
…umständlicher Patchwork- und neopas eleganterer rückwärtskumulativer Fml mit Hilfszellen wäre die Nutzung der Berechnungs­Iteration, die auch den erforderlichen ZirkelBezug zulässt. Allerdings ist das Ergebnis nicht permanent stabil und muss gelegentlich neu berechnet wdn (hängt auch von der IterationsFml ab), verlangt aber nur eine Hilfszelle.
Hilfszelle J1: =WENN(J1<8;J1+1^JETZT();1)
J2: =WENN(J2="0";"1;2;3;4;5;6;7;8";WECHSELN(J2;INDEX(A1:H1;J1);INDEX(A2:H2;J1)))
Die IterationsHilfszelle kann sich auch woanders befinden, ausgeblendet sein oder ggf mit der Fml in J2 in einer VerbundZelle J2:K2 (auf K2) vereinigt sein, was sie schützt. Diese VerbundZelle kann aber nur durch FormatPinselÜbertragung des Formats eines ent­sprechend vorformatierten ZellVerbunds erzeugt wdn!
Eine elegante Lösung ohne Hilfszellen bedarf VBA, zumindest in Form von UDFs für ZellFml-Einsatz. Dabei gibt's mit im Archiv vor­han­denen (und etlichen weiteren in meinem UDF-AddIn) diverse Möglichkeiten, zu denen ich später kommen werde…
🙈 🙉 🙊 🐵 Luc :-?
PS: Dieser Beitrag wendet sich (ohne die sonst üblichen Floskeln) an die Allgemeinheit, da der Fragesteller so unhöflich war, nicht auf die bisherigen AWen zu reagieren!
„Die Intelligenzmenge ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …
Anzeige
Weiterführende ProblemAnalyse
23.06.2018 05:22:37
Luc:-?
Bei der Lösung dieser Aufgabe wird man mit 2 Problemen konfrontiert, deren …
1. das Verketten der Inhalte einzelner Zellen bzw aller Zellen eines Bereichs ist. Xl bot hierzu in der Vergangenheit (wie generell bei Text­Bear­bei­tungsFktt) wenig. Dies hat sich erst in jüngster Zeit mit den Abo-Fktt TEXTKETTE (trivial) und TEXTVERKETTEN (uni­ver­sel­ler) – ab Xl2016 wohl im regulären Xl-FktsBestand – etwas verbessert. Das …
2. besteht in der fml-gesteuerten Sortierung von Texten, speziell auch nach (wie hier) vorgegebener Reihenfolge. Dafür bringt Xl nichts Direktes mit, so dass man das nur auf Umwegen lösen kann. Dabei gibt es prinzipiell 2 Möglichkeiten:
2.1 Man gibt die (neue) Reihenfolge direkt als Ziffernfolge der (alten – bezogen auf eine ursprüngliche TextReihenfolge –) Standorte der Texte vor bzw ermittelt diese aus …
2.2 Vorgabe des (neuen) Standorts pro Text (wie hier).
Beide VorgabeArten (die erste entspräche der üblichen Xl-Methodik) prädestinieren jeweils andere Verfahrensweisen. Die ersten beiden AWen benötigen eine Vorgabe lt 2.1. Da das hier aber nicht der Fall ist, muss mit VERGLEICH umgerechnet wdn. Das in der 3.AW gezeigte Iterationsverfahren benutzt zwar ein 2.2 entsprd Verfahren (weil hier naheliegend), könnte aber (mit Umrechnung) auch mit 2.1 angewendet wdn, ist also als Methode davon unabhängig.
Egal welchem Prinzip die Lösungen folgen, mit UDFs (im Fml-Verbund mit Xl-Fktt) wird es einfacher. Allerdings tritt eine weitere Lücke im Xl-FktsAngebot zutage, wenn man eine hier im Prinzip nahe liegende Lösung nach 2.2 (idR mit WECHSELN) anstrebt → WECHSELN arbeitet nach dem Oder-, nicht nach dem hier erforderlichen Und-Prinzip, d.h., die einzelnen Wechsel kumulieren nicht zu einem Gesamt­Ergebnis! I.W. deshalb hatte ich vor Jahren die bisher unpublizierte (weil noch nicht endgülig fertiggestellt) UDF RepOpt für alle Fktt, bei denen eine derartige Kumulation sinnvoll wdn könnte, geschaffen (dazu mehr am BT-Ende).
Es folgt nun eine Auswahl möglicher LösungsFmln (singulare u.duale MatrixFmln) mit UDFs, die nach den beiden Methoden geordnet sind:
&bullet; Fmln nach Methode 2.1 - Auswahl in kontinuierlich aufsteigender Reihenfolge per Alt-Position
singular:
{=VJoin(""&INDEX(A2:H2;VERGLEICH(SPALTE(A:H);A1:H1;0));";")}
{=VJoin(MTRANS(INDIREKT("Z2S"&VERGLEICH(SPALTE(A:H);A1:H1;0);0));";")}
dual - vertikal: (d.h., für nur ein Ergebnis müssen 2 Zellen ausgewählt wdn!)
{=WAHL({1;2};"";VJoin(""&INDEX(A2:H2;VERGLEICH(SPALTE(A:H);A1:H1;0));";")) } LeerText über Text
{=WAHL({1;2};VJoin(""&INDEX(A2:H2;VERGLEICH(SPALTE(A:H);A1:H1;0));";");"") } LeerText unter Text
dual - horizontal: (LeerText idR nur vor Text sinnvoll, außer in VerbundZelle!)
{=WAHL({1.2};"";VJoin(""&INDEX(A2:H2;VERGLEICH(SPALTE(A:H);A1:H1;0));";"))} EinzelZellen
{=WAHL({1.2};VJoin(""&INDEX(A2:H2;VERGLEICH(SPALTE(A:H);A1:H1;0));";");"")} VerbundZelle; oder …
{=VJoin(""&INDEX(A2:H2;VERGLEICH(SPALTE(A:H);A1:H1;0));";") } Text in beiden Zellen des Verbunds
&bullet; Fmln nach Methode 2.2 - Setzen lt Alt-Reihenfolge an angegebene Neu-Position
Basis - Verteilungsmatrix: (mit LeerTexten → Verbinden ohne diese; alle singular)
{=VJoin(WENN(ZEILE(1:8)=A1:H1;A2:H2;"");";";-1)} wohl kürzest-mögliche Fml
{=MxJoin(MTRANS(AggregateXk(0;6;WENN(ZEILE(1:8)=A1:H1;A2:H2;#NV)));";")}
{=VJoin(T(VSplit(VSplit(VJoin(WECHSELN(ZEILE(1:8);A1:H1;A2:H2);{"|"." "};-2));"|";1));";";-1)}
{=VJoin(WENN(ISTZAHL(--WECHSELN(ZEILE(1:8);A1:H1;A2:H2));"";WECHSELN(ZEILE(1:8);A1:H1;A2:H2));";";-1) }
Basis - ReihenfolgeNrn-MusterText: (Wechseln Zahl gg Text m.gleicher ZielPosition)
{=RepOpt("substitute";SPALTEN(A:H);;{2.3};RepOpt("substitute";SPALTEN(A:H);;3;WIEDERHOLEN("#;";7) &"#";"#";SPALTE(A:H);1);A1:H1;A2:H2) }
{=RepStitute(RepStitute(WIEDERHOLEN("#;";7)&"#";"#";SPALTE(A:H);1);A1:H1;A2:H2)}
Es gibt auf dieser Basis natürlich noch mehr Möglichkeiten, die aber wie die vorletzte Fml bisher generell unpublizierte UDFs voraus­setzen, wie bspw eine textsortierende wie in folgender Fml, die damit auch eine recht elegante Möglichkeit darstellen würde:
{=WECHSELN(MaskOn(VJoin(Sort4Match(A1:H1&A2:H2);"");"alf");" ";";")}
Ansonsten sind die meisten UDFs im hiesigen Archiv zu finden, wobei die jeweilige Version nicht unbedingt die aktuellste sein mag, aber die letztpublizierte (höchste Vs-Nr) dürfte hier jeweils ausreichen. Da RepOpt nicht vorliegt und notwendigerweise massiert wiederholte WECHSEL(N)ei ein ständiges und absolutes Ärgernis ist, habe ich speziell dafür eine Repeat-Operation-UDF geschrieben → Repeat-Substitute:

Rem Wechseln von Teiltexten in Wiederholung (WWechseln) analog xlFkt WECHSELN (Substitute)
'   Arg1: EinzelText (TextFelder m.INDEX-Fml im Arg1 in 1zelTexte zerlegen!); Arg2: auszu-
'   tauschde/r Textteil/e; Arg3: neue/r Textteil/e; Arg4: fehlt=alle, sonst n-te/s Auftre-
'   ten in Arg1 (analog Xl-Fkt); Arg5: 0=keine W-Op, fehlt - AutoErmittlg aus Argg2-4 (die
'   auch als [Ko-]Vektoren gleicher Länge mögl sind), sonst Anzahl der WechselOperationen.
'   Vs1.1 -LSr:CyWorXxl -cd:20180622 -1pub:20180623h -lupd:20180622t
Function RepStitute(QText, AText, NText, Optional nAuftr, Optional ByVal OpAnz)
Dim isOpCheck As Boolean, isSglMode As Boolean, lBit As Integer, OpVar As Integer, _
wx As Long, wArL, wt, wTx As Variant, wf As WorksheetFunction
On Error GoTo fx: If IsError(QText) Or IsArray(QText) Then Err.Raise xlErrRef
Set wf = WorksheetFunction: isSglMode = Not IsMissing(nAuftr)
If isSglMode And Not IsArray(nAuftr) Then isSglMode = nAuftr > 0
OpVar = Abs(IsArray(AText)) + 2 * Abs(IsArray(NText)): RepStitute = QText
isOpCheck = IsMissing(OpAnz): On Error Resume Next
If isOpCheck Then ReDim wArL(1 - CInt(isSglMode))
If IsArray(AText) Then
AText = wf.Transpose(AText)
If IsError(UBound(AText, 2)) Then
Else: AText = wf.Transpose(AText)
If IsError(UBound(AText, 2)) Then Else On Error GoTo fx: Err.Raise xlErrRef
End If
ReDim Preserve AText(UBound(AText) - LBound(AText))
If isOpCheck Then wArL(0) = UBound(AText) + 1
End If
If IsArray(NText) Then
NText = wf.Transpose(NText)
If IsError(UBound(NText, 2)) Then
Else: NText = wf.Transpose(NText)
If IsError(UBound(NText, 2)) Then Else On Error GoTo fx: Err.Raise xlErrRef
End If
ReDim Preserve NText(UBound(NText) - LBound(NText))
If isOpCheck Then wArL(1) = UBound(NText) + 1
End If
If isSglMode Then
OpVar = OpVar + 4 * Abs(IsArray(nAuftr))
If IsArray(nAuftr) Then
nAuftr = wf.Transpose(nAuftr)
If IsError(UBound(nAuftr, 2)) Then
Else: nAuftr = wf.Transpose(nAuftr)
If IsError(UBound(nAuftr, 2)) Then Else On Error GoTo fx: Err.Raise xlErrRef
End If
ReDim Preserve nAuftr(UBound(nAuftr) - LBound(nAuftr))
If isOpCheck Then wArL(2) = UBound(nAuftr) + 1
End If
End If
On Error GoTo fx: If isOpCheck And CBool(OpVar) Then OpAnz = wf.Max(wArL) Else OpAnz = 0
If CBool(OpAnz) Then
wTx = Array(AText, NText, IIf(isSglMode, nAuftr, Empty))
If IsEmpty(wTx(2)) Then ReDim Preserve wTx(1)
For Each wt In wTx
If IsArray(wt) Then
If UBound(wt) + 1 - LBound(wt)  OpAnz Then Err.Raise xlErrRef
End If
Next wt
For wx = 0 To Abs(OpAnz) - 1
If isSglMode Then
If IsArray(wTx(2)) Then lBit = Abs(wTx(2)(wx) > 0) Else lBit = Abs(wTx(2) > 0)
End If
Select Case wf.Bin2Dec(wf.Dec2Bin(OpVar, 3) & lBit)
Case 0:  RepStitute = wf.Substitute(RepStitute, wTx(0), wTx(1))
Case 1:  RepStitute = wf.Substitute(RepStitute, wTx(0), wTx(1), wTx(2))
Case 2:  RepStitute = wf.Substitute(RepStitute, wTx(0)(wx), wTx(1))
Case 3:  RepStitute = wf.Substitute(RepStitute, wTx(0)(wx), wTx(1), wTx(2))
Case 4:  RepStitute = wf.Substitute(RepStitute, wTx(0), wTx(1)(wx))
Case 5:  RepStitute = wf.Substitute(RepStitute, wTx(0), wTx(1)(wx), wTx(2))
Case 6:  RepStitute = wf.Substitute(RepStitute, wTx(0)(wx), wTx(1)(wx))
Case 7:  RepStitute = wf.Substitute(RepStitute, wTx(0)(wx), wTx(1)(wx), wTx(2))
Case 9:  RepStitute = wf.Substitute(RepStitute, wTx(0), wTx(1), wTx(2)(wx))
Case 11: RepStitute = wf.Substitute(RepStitute, wTx(0)(wx), wTx(1), wTx(2)(wx))
Case 13: RepStitute = wf.Substitute(RepStitute, wTx(0), wTx(1)(wx), wTx(2)(wx))
Case 15: RepStitute = wf.Substitute(RepStitute, wTx(0)(wx), wTx(1)(wx), wTx(2)( _
wx))
End Select
Next wx
End If
fx: If CBool(Err.Number) Then RepStitute = CVErr(Err.Number)
Set wf = Nothing
End Function
Morrn, Luc :-?
PS: Evtl folgen noch ein paar Anmerkungen nebst Verweis auf ein INDEX-„Phänomen“ samt Link zu anderem diesbzgl BT.
Anzeige
1.Fortsetzung: INDEX
23.06.2018 17:00:01
Luc:-?
Die oben gezeigten Fmln mit INDEX verwenden ein VorschaltElement, dass hier zwingend erforderlich ist, um die Xl-Steuerung (resp ihren Fml-Interpreter) dazu zu veranlassen, die gesamte erzeugte Matrix weiter zu verwenden → hier ""&INDEX(…), weil es sich um Texte handelt. Anderenfalls würde zur „Stabilisierung“ des Ergebnisses idR auch eine einfache arithmetische Operation, wie hier gezeigt, ausreichen.
Die erste oben gezeigte Fml stellt praktisch eine Komprimierung von WFs Fml-Ansatz dar, durch das Hinzufügen von ""& direkt vor INDEX als GesamtMatrix verfügbar gemacht. Die Verbindung ihrer Elemente erfolgt dann dort durch die UDF VJoin (ggf wäre auch TEXTVERKETTEN möglich). Die Variante mit INDIREKT (2.Fml) könnte statt mit VJoin auch mit der (unpublizierten) UDF RepOpt arbeiten (was mit INDEX leider bisher nicht möglich ist):
{=WECHSELN(RepOpt("&";8;;2;"";MTRANS(INDIREKT("Z2S"&VERGLEICH(ZEILE(1:8);A1:H1;0);0)));", ";";")}
Anmerkung: Aktuelle ArchivLinks zu den verwendeten publizierten UDFs können ggf nachgereicht wdn.
Luc :-?
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Wenn-Formel zur Sortierung und Reihenfolge in Excel


Schritt-für-Schritt-Anleitung

  1. Daten vorbereiten: Stelle sicher, dass du in den Zellen A1 bis A8 die Zahlen 1 bis 8 eingegeben hast. In den Zellen A2 bis A9 sollten die entsprechenden Namen stehen, die du sortieren möchtest.

  2. Hilfsformel eingeben: Wähle eine Zelle (z.B. J2) und gib die folgende Formel ein:

    =INDEX(A2:A9;VERGLEICH(KKLEINSTE(A1:A8;SPALTE(A1));A1:A8;0))

    Diese Formel gibt den Namen zurück, der zur kleinsten Zahl in der angegebenen Reihenfolge gehört.

  3. Formel kopieren: Ziehe die Formel in J2 nach rechts bis Q2, um die Namen für alle Positionen zu erhalten.

  4. Ergebnis verketten: Um die Namen in einer Zelle zusammenzufassen, verwende die TEXTVERKETTEN-Funktion (ab Excel 2016 verfügbar):

    =TEXTVERKETTEN("; ";WAHR;J2:Q2)

    Dadurch erhältst du eine durch Semikolons getrennte Liste der Namen in der gewünschten Reihenfolge.


Häufige Fehler und Lösungen

  • Fehler: #NV: Dieser Fehler tritt auf, wenn eine Zahl in A1:A8 nicht gefunden werden kann. Überprüfe, ob alle Zahlen korrekt eingegeben sind.

  • Problem mit leeren Zellen: Wenn du leere Zellen in deinem Datenbereich hast, kann dies zu unerwartetem Verhalten führen. Stelle sicher, dass du nur die relevanten Zellen in deinen Formeln verwendest.


Alternative Methoden

Eine alternative Methode zur Verwendung von INDEX und VERGLEICH ist die Verwendung von VBA oder UDFs (benutzerdefinierte Funktionen). Mit VBA kannst du eine Funktion erstellen, die die Namen basierend auf einer gegebenen Reihenfolge zurückgibt. Diese Methode kann besonders nützlich sein, wenn du komplexere Anforderungen hast.


Praktische Beispiele

Angenommen, du hast folgende Daten in Excel:

A B
1 Max
2 Tom
3 Lisa
4 Anna
5 Peter
6 Sophie
7 Paul
8 Julia

Wenn du die Zahlen in A1 bis A8 änderst, z.B. von 1 zu 3, wird der Name "Lisa" an erster Stelle erscheinen, und du erhältst das Ergebnis "Lisa; Max; Tom; Anna; Peter; Sophie; Paul; Julia".


Tipps für Profis

  • Verwendung von VJoin: Wenn du die Namen in einer einzigen Zelle zusammenfassen möchtest, kannst du auch die benutzerdefinierte Funktion VJoin verwenden, die dir hilft, die Ergebnisse zu verketten:

    =VJoin(A2:A9;"")

    Diese Funktion ist besonders nützlich, wenn du mit großen Datenmengen arbeitest.

  • Dynamische Bereiche: Nutze dynamische Bereiche, um sicherzustellen, dass deine Formeln automatisch aktualisiert werden, wenn du neue Daten hinzufügst.


FAQ: Häufige Fragen

1. Wie kann ich die Reihenfolge der Namen ändern?
Ändere einfach die Zahlen in den Zellen A1 bis A8. Die Namen werden automatisch in der Reihenfolge angezeigt, die du eingegeben hast.

2. Was mache ich, wenn ich mehr als 8 Namen habe?
Erweitere den Bereich in der Formel entsprechend, z.B. A1:A10 für 10 Namen, und passe die Formeln an.

3. Kann ich diese Methode in älteren Excel-Versionen verwenden?
Die oben genannten Formeln sind ab Excel 2016 verfügbar. In früheren Versionen musst du möglicherweise auf alternative Methoden zurückgreifen, wie die Verwendung von INDEX und VERGLEICH ohne TEXTVERKETTEN.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige