Dies kann ohne VBA mit der TEXTJOIN()
in Excel 2016 eingeführten Funktion erreicht werden. Wenn Sie nicht über diese Version von Excel verfügen, können Sie eine UDF mit Poly-Fill installieren. Ich habe am Ende dieser Antwort ein grundlegendes gegeben.
Geben Sie die folgende Formel im Feld ein E2
:
{=TEXTJOIN(", ",TRUE,IFERROR(INDEX(A1:A5,N(IF(1,SMALL(IFERROR(1/(1/((B1:B5=D2)*ROW(B1:B5))),FALSE),ROW(INDEX(E:E,1):INDEX(E:E,ROWS(B1:B5))))))),""))}
Die verettete Formel lautet wie folgt:
{= TEXTJOIN( ", ", TRUE, IFERROR( INDEX( A1:A5, N(IF(1, SMALL( IFERROR(1/(1/((B1:B5=D2)*ROW(B1:B5))),FALSE), ROW(INDEX(E:E,1):INDEX(E:E,ROWS(B1:B5))) ) )) ), "" ) )}
Anmerkungen:
- Die verettete Formel funktioniert tatsächlich, wenn sie eingegeben wird.
Meine Version der TEXTJOIN()
Poly-Fill-UDF:
'============================================================================================ ' Module : <any standard module> ' Version : 0.1.1 ' Part : 1 of 1 ' References : Optional - Microsoft VBScript Regular Expressions 5.5 [VBScript_RegExp_55] ' Source : https://superuser.com/a/1331555/763880 '============================================================================================ Public Function TEXTJOIN( _ ByRef delimiter As String, _ ByRef ignore_empty As Boolean, _ ByRef text1 As Variant _ ) _ As String Dim ƒ As Excel.WorksheetFunction: Set ƒ = Excel.WorksheetFunction Const DELIMITER_ As String = "#" Const PATTERN_ As String = "^(?:#)+|(?:#)+$|(#)" Static rexDelimiterEscaper As Object ' VBScript_RegExp_55.RegExp ' ## Object Static rexEmptyIgnorer As Object ' VBScript_RegExp_55.RegExp ' ## Object If rexEmptyIgnorer Is Nothing _ Then Set rexEmptyIgnorer = CreateObject("VBScript.RegExp") ' New VBScript_RegExp_55.RegExp ' ## CreateObject("VBScript.RegExp") With rexEmptyIgnorer .Global = True .Pattern = PATTERN_ ' Replacement = "$1" End With Set rexDelimiterEscaper = CreateObject("VBScript.RegExp") ' New VBScript_RegExp_55.RegExp ' ## CreateObject("VBScript.RegExp") With rexDelimiterEscaper .Global = True .Pattern = "(.)" ' Replacement = "\$1" End With End If Dim varText1 As Variant Select Case TypeName(text1) Case "Range": varText1 = ƒ.Transpose(text1.Value2) If text1.Rows.Count = 1 Then varText1 = ƒ.Transpose(varText1) If text1.Columns.Count = 1 Then varText1 = Array(varText1) End If Case "Variant()": On Error Resume Next If LBound(text1, 2) <> LBound(text1, 2) Then varText1 = text1 Else varText1 = ƒ.Transpose(text1) End If On Error GoTo 0 Case Else: varText1 = Array(text1) End Select If ignore_empty _ Then With rexEmptyIgnorer .Pattern = Replace(PATTERN_, DELIMITER_, rexDelimiterEscaper.Replace(delimiter, "\$1")) TEXTJOIN = .Replace(Join(varText1, delimiter), "$1") End With Else TEXTJOIN = Join(varText1, delimiter) End If End Function
Anmerkungen:
- Dies ist keine richtige Poly-Füllung:
- Die ersten beiden Argumente sind nicht optional.
- Wenn Sie kein Trennzeichen verwenden möchten, müssen Sie als ersten Parameter eine leere Zeichenfolge übergeben.
- Es ist nur ein weiteres (auch erforderliches) Argument zulässig.
- Sie können alles für das dritte Argument übergeben, außer einem Array / Bereich mit mehreren Dimensionen. Dies führt zu einem
#VALUE!
Fehler. - Es sollte sehr schnell sein, besonders für große Eingänge, da keine Schleifen verwendet werden. Wenn Sie leere Werte nicht ignorieren, wird es blitzschnell. Das Ignorieren wird langsamer, da ein paar reguläre Ausdrücke verwendet werden müssen und eine zusätzliche Manipulation der Saiten erforderlich ist.