当单元格有文本时,返回行中列标题的列表

我想获得包含文本值的每个单元格的列标题列表。

例如。

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

在最终产品中,我想使用两列最后一列的公式,列出了来自单元格的标题,其值为9列,其他40列为奇数列。

我有一个模糊的概念,我可能需要使用INDEXMATCHIF函数 – 但作为一个新手不知道如何将它们连贯在一起。

这里我将利用VBA的Join函数 。 VBA函数不能直接在Excel中使用,所以我将Join到一个用户定义的函数中,该函数公开了相同的function:

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

D2中的公式是:

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

作为数组公式input(使用CtrlShiftEnter )。 然后被复制下来。

在这里输入图像描述

说明:

  • NOT(ISBLANK(A2:C2))检测哪些单元格中有文本; 为第2行返回此数组: {TRUE,FALSE,TRUE}

  • IF(NOT(ISBLANK(A2:C2)),$A$1:$C$1&", ","")将这些布尔值转换为行1内容,后跟逗号分隔符; 返回数组{"Header A, ","","Header C, "}

  • JoinXL将该数组的内容join到单个string中。

如果你想使用工作表function,而不是VBA,我build议在一个单独的单元格中返回每个列标题。 你可以通过input一个公式来做到这一点:

这个公式必须是数组input的

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

调整范围引用A:C以反映实际用于数据的列。 一定要使用与上面相同的混合地址格式。 不过,不要更改$ A:参考。

然后填写,直到你得到空白。 并根据需要填写。

您可以反转逻辑以获取“其他”标题的列表。

数组input公式,在将公式input到单元格或公式栏后,按住Ctrl键并按Enter键 。 如果你正确地做了这个,Excel会在公式中放置大括号{…}

如果你真的需要在两个不同的列中作为逗号分隔值的结果,我会build议下面的用户定义函数。

要input这个用户自定义函数(UDF), alt-F11打开Visual Basic编辑器。 确保您的项目在“项目浏览器”窗口中突出显示。 然后,从顶部菜单中select插入/模块,然后将下面的代码粘贴到打开的窗口中。

要使用这个用户定义函数(UDF),input一个像

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

或者,获取不包含文本的标题:

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

在一些细胞。

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

 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 

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

你应该在例程中添加一些逻辑来确保你的范围参数是一行,并且这两个参数的大小是一样的。