我想获取包含文本值的每个单元格的列标题列表。
例如
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多列。
我有一个模糊的概念,即我可能需要使用INDEX
,MATCH
和IF
函数 - 但是作为一个新手不知道如何将它们连贯地串在一起。
答案 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 - 输入)。然后将其复制下来。
说明:
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
==========================================
您应该在例程中添加一些逻辑,以确保您的范围参数是单行,并且这两个参数的大小相同。