【问题标题】:How to enter conditional list of headers in cell sorted based on cell values in same header's column?如何在根据同一标题列中的单元格值排序的单元格中输入条件标题列表?
【发布时间】:2019-10-04 03:32:12
【问题描述】:

在 MS Excel 中,我试图根据标题是否具有值(大于 0)在一个单元格中提供标题列表。我希望也可以先按最大排序这个单元格中的列表。我该怎么做?

我根本没有学过 Visual Basic,只是真正尝试过使用一些 if 语句。我有一张很大的桌子要整理,不想手动整理。

我想得到什么:

         ---------  Header1   Header2   Header3   List
                    Apple     Orange    Pear  

Row 1 -     Ryan    0         0         0         --
Row 2 -     Cindy   0         5         7         Pears, Oranges
Row 3 -     Tom                                   N/A
Row 4 -     Jess    3         6         2         Oranges, Apples, Pears

谢谢!

【问题讨论】:

  • 只有在您拥有 Office 365 excel 或更高版本时才可以使用公式。
  • @Scott Craner:您也可以使用带有经典 excel 的公式来做到这一点,请参阅下面的答案。
  • @Kaiser 可以,但可以看到我对您的回答的评论。

标签: excel sorting excel-formula conditional


【解决方案1】:

您可以使用旧版本的 excel 来做到这一点,但公式会变得有点复杂,以便在正确的位置显示正确的逗号。为了更清楚,我将其分成了 2 个公式:

第一个公式是查找并写入标题(位于E列):

 =+IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),"")

第二个是清除逗号并提供最终结果(位于F列):

=+IF(RIGHT(E6,1)=",",LEFT(E6,LEN(E6)-1),E6)

您可以将两者合二为一,但很难阐明公式的作用:

=+IF(RIGHT(IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),""),1)=",",LEFT(IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),""),LEN(IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),""))-1),IF(COUNTIF(B6:D6,">"&0)>0,CONCATENATE(IF(B6>0,B$4&",",""),IF(C6>0,C$4&",",""),IF(D6>0,D$4,"")),""))

【讨论】:

  • 两件事,如果有超过 3 列,这会变得非常大,其次,OP 要求按照值的顺序而不是标题的顺序排列标题。仅供参考,如果 OP 只有 3-4 件商品并且不关心订单,那么这会很好用。
  • 我完全同意,将它们按顺序排列或添加更多列在单个公式中是难以忍受的。
  • 另外,如果我要使用较旧的字符串公式:=MID(IF(B5>0,","&$B$4,"")&IF(C5>0,","&$C$4,"")&IF(D5>0,","&$D$4,""),2,999) 请参阅下面的编辑答案
【解决方案2】:

如果你有 Office 365 Excel,你会使用这个数组公式:

=IFERROR(TEXTJOIN(",",TRUE,INDEX($B$1:$D$1,N(IF({1},MATCH(AGGREGATE(14,7,$B3:$D3/($B3:$D3>0),ROW($XFD$1:INDEX($XFD:$XFD,COUNTIF($B3:$D3,">0")))),$B3:$D3,0))))),IF(COUNT(B3:D3)>1,"---","N/A"))

作为一个数组公式,退出编辑模式时必须使用 Ctrl-Shift-Enter 而不是 Enter 来确认它。

它按顺序构建标题数组并将其返回给 TEXTJOIN 函数。不过需要注意的是,如果值中存在平局,它将为两者返回相同的标头。例如6,6,6 将返回Apple,Apple,Apple


如果没有 Office 365 Excel,则将此代码放在附加到工作表的模块中,并使用上述公式:

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

也可以通过一次创建一个单词来完成:

=MID(IF(B3>0,","&$B$1,"")&IF(C3>0,","&$C$1,"")&IF(D3>0,","&$D$1,""),2,999)

但是如果有很多列,这会变得非常不规则:

【讨论】:

  • 我没有返回包含 Office 365 数组公式的列表。我只得到列表中最大的项目。你是怎么做到的?顺便说一句,答案种类繁多!
  • 退出编辑模式时是否使用了Ctrl-Shift-Enter?当您这样做时,Excel 是否在公式周围添加了 {}
  • 啊,谢谢!!
【解决方案3】:

欢迎使用 Stack Overflow!

尝试查看TEXTJOIN 以将单元格连接到一个列表中。另请查看conditionally concatenating a range 上的此链接,以获得一个很好的实施示例。祝你好运!

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多