简体   繁体   中英

Return a list of column headers across a row when cells have text

I want to get a list of column headers for each cell that contains a text value.

Eg.

    A--------------B-------------C-------------BC (desired output)  
1   Header1        Header2       Header3              
2   M                            T             Header1, Header3  
3   T              MT                          Header1, Header2  
4                  TMW                         Header2

In the final product I want to use two final columns with formulas listing headers from cells with values across 9 columns and a second with the other 40 odd columns.

I have the vague notion that I might need to use INDEX , MATCH and IF functions - but as a novice have no idea how to string them together coherently.

Here I will make use of VBA's Join function . VBA functions aren't directly available in Excel, so I wrap Join in a user-defined function that exposes the same functionality:

Function JoinXL(arr As Variant, Optional delimiter As String = " ")
    JoinXL = Join(arr, delimiter)
End Function

The formula in D2 is:

=JoinXL(IF(NOT(ISBLANK(A2:C2)),$A$1:$C$1&", ",""),"")

entered as an array formula (using Ctrl - Shift - Enter ). It is then copied down.

在此处输入图片说明

Explanation:

  • NOT(ISBLANK(A2:C2)) detects which cells have text in them; returns this array for row 2: {TRUE,FALSE,TRUE}

  • IF(NOT(ISBLANK(A2:C2)),$A$1:$C$1&", ","") converts those boolean values to row 1 contents followed by a comma delimiter; returns the array {"Header A, ","","Header C, "} .

  • JoinXL joins the contents of that array into a single string.

If you want to use worksheet functions, and not VBA, I suggest returning each column header in a separate cell. You can do this by entering a formula such as:

This formula must be array-entered :

BC: =IFERROR(INDEX($A$1:$C$1,1,SMALL((LEN($A2:$C2)>0)*COLUMN($A2:$C2),COUNTBLANK($A2:$C2)+COLUMNS($A:A))),"")

Adjust the range references A:C to reflect the columns actually used for your data. Be sure to use the same mixed address format as in above. Do NOT change the $A:A reference, however.

Then fill right until you get blanks; and fill down as far as required.

You can reverse the logic to get a list of the "other" headers.

To array-enter a formula, after entering the formula into the cell or formula bar, hold down ctrl-shift while hitting enter . If you did this correctly, Excel will place braces {...} around the formula.

If you really need to have the results as comma-separated values in two different columns, I would suggest the following User Defined Function.

To enter this User Defined Function (UDF), alt-F11 opens the Visual Basic Editor. Ensure your project is highlighted in the Project Explorer window. Then, from the top menu, select Insert/Module and paste the code below into the window that opens.

To use this User Defined Function (UDF), enter a formula like

=Headers($A2:$BA2,$A$1:$BA$1,True)

or, to get the headers that do NOT contain text:

=Headers($A2:$BA2,$A$1:$BA$1,FALSE)

in some cell.

=====================================================

Option Explicit
Function Headers(rData As Range, rHeaders As Range, Optional bTextPresent As Boolean = True) As String
    Dim colHeaders As Collection
    Dim vData, vHeaders
    Const sDelimiter As String = ", "
    Dim sRes() As String
    Dim I As Long
vData = rData
vHeaders = rHeaders
Set colHeaders = New Collection
For I = 1 To UBound(vData, 2)
    If (Len(vData(1, I)) > 0) = bTextPresent Then colHeaders.Add vHeaders(1, I)
Next I

ReDim sRes(1 To colHeaders.Count)
For I = 1 To colHeaders.Count
    sRes(I) = colHeaders(I)
Next I

Headers = Join(sRes, sDelimiter)
End Function

==========================================

You should probably add some logic to the routine to ensure your range arguments are a single row, and that the two arguments are of the same size.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM