【问题标题】:Excel formula to return multiple column namesExcel公式返回多个列名
【发布时间】:2016-08-31 20:04:25
【问题描述】:

我正在尝试获取一个公式,该公式在每一行中搜索“是”。然后它应该列出列名。有些行可能只有 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

【问题讨论】:

  • 你用的是什么 Excel?
  • 如果您没有 Office 365 Excel,请查看:stackoverflow.com/questions/36572697/udf-to-concatenate-values 如果您有,请查看 TEXTJOIN()。
  • 现在是 2013 年,您链接的第一个正是我想要的最终结果,只是希望不要使用编码,因为我在那个方面更糟糕,但我现在会尝试
  • 那么你需要使用 UDF。
  • 没有必要使用 UDF。检查我的公式。

标签: excel textjoin


【解决方案1】:

您可以使用以下 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$1:$D$1,""))

作为一个数组,退出编辑模式时需要使用 Ctrl-Shift-Enter 而不是 Enter 来确认。如果操作正确,Excel 会在公式周围加上{}

要使用 IF 公式得到它,这将返回相同的内容,因为您只有四个。如果你有四个以上,这会很长。

=LEFT(IF(A2="Yes",$A$1 & ",","") & IF(B2="Yes",$B$1 & ",","") & IF(C2="Yes",$C$1 & ",","") & IF(D2="Yes",$D$1 & ",",""),LEN(IF(A2="Yes",$A$1 & ",","") & IF(B2="Yes",$B$1 & ",","") & IF(C2="Yes",$C$1 & ",","") & IF(D2="Yes",$D$1 & ",",""))-1)

【讨论】:

  • 您刚刚提供的 UDF 效果很好,正是我所需要的。谢谢!
  • @scott 只是试图将您的 UDF 用作基本行,没有什么特别的,只是数字。我试图做的只是组合一行的单元格并在值之间放置一个逗号。我不断得到#Value的结果!此问题中的 UDF 是工作表中的唯一代码。是否需要先保存工作表? =textjoin(",",TRUE,A24:J24) 是我目前的公式。
  • 改用这个:stackoverflow.com/questions/39532189/…@ForwardEd
  • 谢谢。我会看看这个。我偶然发现了这个解决方案和其他一些 UDF。我最初是在寻找 TEXTJOINT 数组公式替代方案,我认为您对 2013 年的用户有此想法,但我的 google 技能让我失望了。
  • @ForwardEd 我确实有一个 TEXTJOINIFS():stackoverflow.com/questions/56858571/…
【解决方案2】:

我觉得你可以试试这样的:

    =(IF(EXACT(A2;"Yes");A1 & ", ";"")) & (IF(EXACT(B2;"Yes");B1 & ", ";""))  & (IF(EXACT(C2;"Yes");C1 & ", ";"")) & (IF(EXACT(D2;"Yes");D1 & ", ";""))

它会测试单元格字符串是否对应“是”,如果是,则写入的字符串为表头,否则写入的字符串为“”。 我还用 & 符号连接了其他三个 IF 条件。

在数组的第一行应用这个公式会返回以下结果:

    header 2, header 3,

我认为你可以改进它以获得你想要的。

【讨论】:

    【解决方案3】:

    不需要 UDF

    使用

    =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(A2="Yes",A$1&", ","")&IF(B2="Yes",B$1&", ","")&IF(C2="Yes",C$1&", ","")&IF(D2="Yes",D$1&", ",""),", H","-H"),", ",""),"-H",", H")
    

    SUBSTITUTEs 是删除尾随 ", " 的一种(可能是矫枉过正的)方法,仅在需要时。 根据需要在尽可能多的行中向下复制。

    我的意思是编写一个数组公式,它适用于任意数量的列,而无需明确编写每一列,但显然CONCATENATE 不适用于数组公式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多