Search code examples
exceltextjoin

Excel formula to return multiple column names


I am trying to get a formula that searches each row for a "Yes". It then should list the column name(s). Some row may only have 1 yes, some may have 3 or more. I have tried searching and editing several suggestions, but cannot get the one I need. Some formulas will give me a random column name, and only 1. Other just error out.

Header 1    Header 2    Header 3    Header 4    List
  No          Yes        Yes           No       Header 2, Header 3
 Yes           No        Yes          Yes       Header 1, Header 3, Header 4
  No           No         No          Yes       Header 4
 Yes          Yes         No          Yes       Header 1, Header 2, Header 4

Solution

  • You can use the following UDF:

    Function TEXTJOIN(delim As String, skipblank As Boolean, arr)
        Dim d As Long
        Dim c As Long
        Dim arr2()
        Dim t As Long, y As Long
        t = -1
        y = -1
        If TypeName(arr) = "Range" Then
            arr2 = arr.Value
        Else
            arr2 = arr
        End If
        On Error Resume Next
        t = UBound(arr2, 2)
        y = UBound(arr2, 1)
        On Error GoTo 0
    
        If t >= 0 And y >= 0 Then
            For c = LBound(arr2, 1) To UBound(arr2, 1)
                For d = LBound(arr2, 1) To UBound(arr2, 2)
                    If arr2(c, d) <> "" Or Not skipblank Then
                        TEXTJOIN = TEXTJOIN & arr2(c, d) & delim
                    End If
                Next d
            Next c
        Else
            For c = LBound(arr2) To UBound(arr2)
                If arr2(c) <> "" Or Not skipblank Then
                    TEXTJOIN = TEXTJOIN & arr2(c) & delim
                End If
            Next c
        End If
        TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim))
    End Function
    

    Put it in a module attached to the worksheet.

    Then you would call it like any other formula with the following array formula:

    =TEXTJOIN(",",TRUE,IF(A2:D2="Yes",$A$1:$D$1,""))
    

    Being an array it needs to be confirmed with Ctrl-Shift-Enter instead of Enter when exiting edit mode. If done correctly then Excel will put {} around the formula.

    enter image description here

    To get it with IF formulas this will return the same thing, since you only have four. If you have more than four this would get quite long.

    =LEFT(IF(A2="Yes",$A$1 & ",","") & IF(B2="Yes",$B$1 & ",","") & IF(C2="Yes",$C$1 & ",","") & IF(D2="Yes",$D$1 & ",",""),LEN(IF(A2="Yes",$A$1 & ",","") & IF(B2="Yes",$B$1 & ",","") & IF(C2="Yes",$C$1 & ",","") & IF(D2="Yes",$D$1 & ",",""))-1)
    

    enter image description here