Bedingte Verkettung von Zelleninhalten über Zeilen hinweg

6

Ich habe ein Arbeitsblatt mit Tausenden von Zeilen, die eine eindeutige ID Aund drei verschiedene Fehlercodes enthalten M. Jede einzelne ID kann 1, 2 oder 3 Fehler aufweisen. Sie werden immer in der gleichen Reihenfolge sein.

Ich habe von Hand getippt und in Nwas die gewünschte Ausgabe ist. Ich habe eine Formel wie diese in Spalten O, P, Qmit dem Text des Fehlers geschrieben:

=IF(IFERROR(SEARCH("Brand is not valid", M42), "") <> "", "Brand", "")

Ich habe so etwas ausprobiert, Raber es funktioniert aus offensichtlichen Gründen nicht richtig. Gibt es eine Möglichkeit, dies so zu tun, dass es so Raussieht N?

=CONCATENATE(O42,"/", P42,"/",Q42)

Wenn dies mit der Excel-Formel nicht möglich ist, gibt es vielleicht einen VBA-Weg?

concat

Phrancis
quelle
Gibt es immer 3 Einträge pro eindeutiger ID oder bis zu 3 Einträge?
FreeMan
Ihre CONCATENATEFormel funktioniert ordnungsgemäß. In den anderen Zellen der Zeile befinden sich nur keine Daten (P42 und Q42 sind leer), um die gewünschten Ergebnisse zu erzielen.
CharlieRB
@ FreeMan kann es 1, 2 oder 3 Fehler pro eindeutiger ID geben, mit einer zufälligen Verteilung
Phrancis
@CharlieRB richtig, das merke ich. Können Sie sich vielleicht einen anderen Weg vorstellen, dies zu tun?
Phrancis
Gibt es eine Möglichkeit, O, P, & OEMin dieselbe Spalte zu gelangen? Werden sie immer in dieser Reihenfolge sein? Marke, Produkt, OEM? Oder könnte es eine andere Reihenfolge sein?
CharlieRB

Antworten:

3

OK, ich habe ein bisschen am Kopf gekratzt, aber ich habe es verstanden:

Spalten O, Pund Qwie Sie sie haben, mit dem Titel Brand, Product& OEM. Verwandeln Sie das Ganze in eine Tabelle mit Ctrl- T(nicht erforderlich, aber praktisch, und meine Spalte Rstützt sich darauf, aber Sie können Spaltenreferenzen verwenden, wenn Sie möchten)

Spalte R:

=IF(LEN([Brand])>0,[Brand],IF(LEN([Product])>0,[Product],IF(LEN([OEM])>0,[OEM],"")))

Spalte S:

=IF(A2=A4,F2&"/"&F3&"/"&F4,IF(A2=A1,"",IF(A2=A3,F2&"/"&F3,F2)))

Leider scheint die einzige Möglichkeit, Tabellenreferenzen für eine andere Zeile zu verwenden Offset, die Verwendung zu sein. Um dies zu vereinfachen, habe ich mich wieder mit Zellreferenzen befasst. Das negiert irgendwie den coolen / praktischen Faktor, das Ganze überhaupt in einen Tisch zu verwandeln, aber was auch immer ...

Und ... Hier ist ein Bild davon, wie es aussieht:

Geben Sie hier die Bildbeschreibung ein

FreeMan
quelle
3
Wow ... ich habe ein Are you a bot?CAPCHA zum Ausfüllen, nachdem ich das eingereicht habe. Seltsam ...
FreeMan
3
Jetzt, wo ich darüber nachdenke, wenn wir Bots haben, die solche Antworten produzieren, sage ich "Bring 'em on!"
FreeMan
1
Diese Lösung funktioniert wunderbar, vielen Dank!
Phrancis
3

Ich würde beginnen , Ihre durch die Optimierung O, Pund QFormeln. Derzeit hast du

=IF(IFERROR(SEARCH("Brand is not valid", M42), "") <> "", "Brand", "")

IFERRORist eine großartige Funktion zum Anzeigen einer bereinigten Version eines berechneten Werts, bei dem es sich möglicherweise um einen Fehlercode handelt. Ich benutze es und empfehle es häufig in Antworten auf Super User. Wie du wahrscheinlich weißt,

  • IFERROR(calculated_value, default_value)

Kurzform für

  • IF(ISERROR(calculated_value), default_value, calculated_value)

Es ist jedoch unnötig umständlich IFERROR, eine bereinigte Version eines Werts zu erstellen und diesen Wert dann zu testen, um etwas unter bestimmten Bedingungen zu tunIFERROR . Die obige Formel kann vereinfacht werden

=IF(ISERROR(SEARCH("Brand is not valid", M42)), "", "Brand")

Und, wie Sie sicher wissen, SEARCH("Brand is not valid", M42) Tests, um zu sehen, ob M42 enthält Brand is not valid . Solange Column Mjedoch nur Ihre drei Fehlerzeichenfolgen enthalten kann, kann dies auf verkürzt werden

=IF(ISERROR(SEARCH("Brand", M42)), "", "Brand")

oder vereinfacht zu

=IF(M42 = "Brand is not valid", "Brand", "")

OK, jetzt werde ich die machen O, Pund QFormeln ein wenig komplizierter:

  • O42=IF($A42=$A41, O41, "") & IF(ISERROR(SEARCH("Brand", $M42)), "", "Brand")
  • P42=IF($A42=$A41, P41, "") & IF(ISERROR(SEARCH("Product", $M42)), "", "Product")
  • Q42=IF($A42=$A41, Q41, "") & IF(ISERROR(SEARCH("OEM", $M42)), "", "OEM")

Die Formel für O42sagt:

Wenn dies die zweite oder dritte Zeile für diese ID (Spalte A) ist, überprüfen Sie die Zelle über dieser (dh die Spaltenzelle Ofür die vorherige Zeile), um festzustellen, ob wir bereits festgestellt haben, dass dieses Objekt eine ungültige Marke hat. Sehen Sie sich auch die Spalte Mfür diese Zeile an, um festzustellen, ob dies der Fall ist Brand is not valid. Verketten Sie dann die Ergebnisse.

Da eine eindeutige ID niemals zweimal mit demselben Fehler aufgelistet wird (richtig?), Sind diese beiden Unterergebnisse niemals beide nicht leer, sodass im Wesentlichen ein "ODER" ausgeführt wird:

Zeigen Sie den Wert an, Brandob diese Zeile ODER eine der vorherigen Zeilen für diese ID den ungültigen Markenfehler enthält.

Dies hat den Effekt oder Ziehen an den O, Pund QWerte bis auf die letzte Zeile für jede ID:

Man beachte , daß Reihen 41, 44, 47 und 49 jeweils zeigt die Kurzformen aller Fehler, die auf ihre jeweiligen IDs in Spalten gelten O, Pund Q.

Ich habe Column Rgenauso definiert wie Sie. Weitere Informationen zum Entfernen der unerwünschten Schrägstriche finden Sie unter Generieren einer durch Kommas getrennten Liste von Zelleninhalten, ausgenommen Leerzeichen .

Wenn die gewünschte Verkettung nur in den Zeilen 41, 44, 47 und 49 ausreicht, sind Sie fertig. Andernfalls definieren Sie N42als

=IF($A22=$A23, N23, R22)

oder

=IF($A22<>$A23, R22, N23)

Dies ist fast genau der gleiche Trick , den ich in Spalten verwendet O, Pund Q, aber in der entgegengesetzten Richtung:

Wenn dies die letzte Zeile für diese ID ist (dh wenn dies Zeile 41, 44, 47 oder 49 ist), verwenden Sie die Verkettung der Werte aus dieser Zeile (dies ist die vollständige Sammlung von Fehlercodes für diese ID). Andernfalls sehen Sie sich die Zelle unter dieser an (dh die Spaltenzelle Nfür die nächste Zeile), die die richtige Antwort enthält.

Mit anderen Worten, die gewünschten Werte sickern für jede ID bis zur ersten Zeile.

Scott
quelle
1
Sehr schön, ich habe heute etwas gelernt!
FreeMan
1
@Scott das ist eine tolle Antwort! Haben Sie darüber nachgedacht, die Code Review-Website zu besuchen? Diese Art von Antwort würde dort definitiv durchscheinen!
Phrancis
@FreeMan: Ich bin froh, Ihnen zu helfen, etwas zu lernen. Wenn Sie weitere interessante Informationen zu Excel wünschen, suchen Sie im Super User nach [Microsoft-Excel], [Arbeitsblattfunktion] und, wenn Sie dazu neigen, nach [vba]. Natürlich wird vieles, was Sie finden, langweilig und langweilig sein. einige werden rätselhaft und ungeklärt sein; und einige werden völlig falsch sein. Sie können die besten Ergebnisse erzielen, wenn Sie sich auf die Antworten dieser Personen konzentrieren .
Scott