Excel 公式到 return 多列名称
Excel formula to return multiple column names
我正在尝试获取一个在每一行中搜索 "Yes" 的公式。然后它应该列出列名。有些行可能只有 1 个是,有些可能有 3 个或更多。我已尝试搜索和编辑多个建议,但找不到我需要的那个。有些公式会给我一个随机的列名,而且只有 1。其他的只是出错。
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
我想你可以试试这样的方法:
=(IF(EXACT(A2;"Yes");A1 & ", ";"")) & (IF(EXACT(B2;"Yes");B1 & ", ";"")) & (IF(EXACT(C2;"Yes");C1 & ", ";"")) & (IF(EXACT(D2;"Yes");D1 & ", ";""))
会检测单元格字符串是否对应"Yes",如果是,则写入的字符串为header,否则写入的字符串为""。
我还用 & 符号与其他三个 IF 条件连接。
将此公式应用于数组的第一行 return 得到以下结果:
header 2, header 3,
我认为你可以改进它以获得你想要的。
您可以使用以下 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
将其放入工作表附带的模块中。
然后您可以像使用以下数组公式的任何其他公式一样调用它:
=TEXTJOIN(",",TRUE,IF(A2:D2="Yes",$A:$D,""))
作为一个数组,退出编辑模式时需要使用Ctrl-Shift-Enter而不是Enter来确认。如果操作正确,那么 Excel 将在公式周围放置 {}
。
要用 IF 公式得到它,这将 return 同样的事情,因为你只有四个。如果你有四个以上,这会变得很长。
=LEFT(IF(A2="Yes",$A & ",","") & IF(B2="Yes",$B & ",","") & IF(C2="Yes",$C & ",","") & IF(D2="Yes",$D & ",",""),LEN(IF(A2="Yes",$A & ",","") & IF(B2="Yes",$B & ",","") & IF(C2="Yes",$C & ",","") & IF(D2="Yes",$D & ",",""))-1)
不需要UDF
使用
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(A2="Yes",A&", ","")&IF(B2="Yes",B&", ","")&IF(C2="Yes",C&", ","")&IF(D2="Yes",D&", ",""),", H","-H"),", ",""),"-H",", H")
SUBSTITUTE
s 是一种(可能矫枉过正)删除尾随 ", "
的方法,仅在需要时使用。
根据需要向下复制尽可能多的行。
我打算写一个数组公式,它适用于任意数量的列而无需显式地写每一列,但显然 CONCATENATE
不适用于数组公式。
我正在尝试获取一个在每一行中搜索 "Yes" 的公式。然后它应该列出列名。有些行可能只有 1 个是,有些可能有 3 个或更多。我已尝试搜索和编辑多个建议,但找不到我需要的那个。有些公式会给我一个随机的列名,而且只有 1。其他的只是出错。
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
我想你可以试试这样的方法:
=(IF(EXACT(A2;"Yes");A1 & ", ";"")) & (IF(EXACT(B2;"Yes");B1 & ", ";"")) & (IF(EXACT(C2;"Yes");C1 & ", ";"")) & (IF(EXACT(D2;"Yes");D1 & ", ";""))
会检测单元格字符串是否对应"Yes",如果是,则写入的字符串为header,否则写入的字符串为""。 我还用 & 符号与其他三个 IF 条件连接。
将此公式应用于数组的第一行 return 得到以下结果:
header 2, header 3,
我认为你可以改进它以获得你想要的。
您可以使用以下 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
将其放入工作表附带的模块中。
然后您可以像使用以下数组公式的任何其他公式一样调用它:
=TEXTJOIN(",",TRUE,IF(A2:D2="Yes",$A:$D,""))
作为一个数组,退出编辑模式时需要使用Ctrl-Shift-Enter而不是Enter来确认。如果操作正确,那么 Excel 将在公式周围放置 {}
。
要用 IF 公式得到它,这将 return 同样的事情,因为你只有四个。如果你有四个以上,这会变得很长。
=LEFT(IF(A2="Yes",$A & ",","") & IF(B2="Yes",$B & ",","") & IF(C2="Yes",$C & ",","") & IF(D2="Yes",$D & ",",""),LEN(IF(A2="Yes",$A & ",","") & IF(B2="Yes",$B & ",","") & IF(C2="Yes",$C & ",","") & IF(D2="Yes",$D & ",",""))-1)
不需要UDF
使用
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(A2="Yes",A&", ","")&IF(B2="Yes",B&", ","")&IF(C2="Yes",C&", ","")&IF(D2="Yes",D&", ",""),", H","-H"),", ",""),"-H",", H")
SUBSTITUTE
s 是一种(可能矫枉过正)删除尾随 ", "
的方法,仅在需要时使用。
根据需要向下复制尽可能多的行。
我打算写一个数组公式,它适用于任意数量的列而无需显式地写每一列,但显然 CONCATENATE
不适用于数组公式。