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

时间:2014-10-20 09:44:01

标签: excel vba excel-vba

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

例如

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

在最终产品中,我想使用两个最终列,公式列出来自单元格的标题,其中值为9列,第二列为其他40多列。

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

2 个答案:

答案 0 :(得分:1)

在这里,我将使用VBA' Join function。 VBA函数不能直接在Excel中使用,因此我将Join包装在一个公开相同功能的用户定义函数中:

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&", ",""),"")

作为array formula输入(使用 Ctrl - Shift - 输入)。然后将其复制下来。

enter image description here

说明:

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

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

  • JoinXL将该数组的内容连接成一个字符串。

答案 1 :(得分:0)

如果您想使用工作表函数而不是VBA,我建议在单独的单元格中返回每个列标题。您可以通过输入以下公式来完成此操作:

此公式必须数组输入

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:A引用。

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

您可以反转逻辑以获取"其他"的列表头。

输入后,

array-enter 一个公式 公式进入单元格或公式栏,按住 ctrl-shift ,同时点击输入。如果你这样做了 正确地说,Excel会在公式周围放置大括号 {...}

如果您确实需要在两个不同的列中将结果作为逗号分隔值,我建议使用以下用户定义函数。

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

要使用此用户定义函数(UDF),请输入类似

的公式
=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

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

您应该在例程中添加一些逻辑,以确保您的范围参数是单行,并且这两个参数的大小相同。