Excel 如何在根据给定的条件对值求和后返回条件?

Excel 如何在根据给定的条件对值求和后返回条件?,excel,Excel,我有一张与此类似的表: 因此,A列和B列与C列中的一个数字组合在一起。我试图做的是将每列中的每个值相加(例如:每次出现“猫”、“狗”和“草”等时,将每个C列相加),然后找到A列和B列中最高的值,并返回该值。例如,在我上面的例子中,Dog将是公式结果,因为它的C列总计为28。有没有一个公式(或者很可能是公式的组合)可以实现这一点 谢谢大家! 只是为了说明,公式是: =INDEX(INDEX(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF

我有一张与此类似的表:

因此,A列和B列与C列中的一个数字组合在一起。我试图做的是将每列中的每个值相加(例如:每次出现“猫”、“狗”和“草”等时,将每个C列相加),然后找到A列和B列中最高的值,并返回该值。例如,在我上面的例子中,Dog将是公式结果,因为它的C列总计为28。有没有一个公式(或者很可能是公式的组合)可以实现这一点


谢谢大家!

只是为了说明,公式是:

=INDEX(INDEX(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),N(IF({1},MODE.MULT(IF(ROW($1:$24)=MATCH(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),0),ROW($1:$24)*{1,1}))))),MATCH(MAX(SUMIFS(C:C,A:A,INDEX(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),N(IF({1},MODE.MULT(IF(ROW($1:$24)=MATCH(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),0),ROW($1:$24)*{1,1}))))))+SUMIFS(C:C,B:B,INDEX(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),N(IF({1},MODE.MULT(IF(ROW($1:$24)=MATCH(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),0),ROW($1:$24)*{1,1}))))))),SUMIFS(C:C,A:A,INDEX(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),N(IF({1},MODE.MULT(IF(ROW($1:$24)=MATCH(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),0),ROW($1:$24)*{1,1}))))))+SUMIFS(C:C,B:B,INDEX(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),N(IF({1},MODE.MULT(IF(ROW($1:$24)=MATCH(INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),INDEX(A1:B12,N(IF({1},INT((ROW($1:$24)-1)/2)+1)),N(IF({1},MOD((ROW($1:$24)-1),2)+1))),0),ROW($1:$24)*{1,1})))))),0))
这是一个数组公式,在退出编辑模式时,必须使用Ctrl-Shift-Enter而不是Enter进行确认


使用新的动态数组公式,它变得更易于管理:

=INDEX(UNIQUE(INDEX(A1:B12,N(IF({1},INT(SEQUENCE(24,,0)/2)+1)),N(IF({1},MOD(SEQUENCE(24,,0),2)+1)))),MATCH(MAX(SUMIFS(C:C,A:A,UNIQUE(INDEX(A1:B12,N(IF({1},INT(SEQUENCE(24,,0)/2)+1)),N(IF({1},MOD(SEQUENCE(24,,0),2)+1)))))+SUMIFS(C:C,B:B,UNIQUE(INDEX(A1:B12,N(IF({1},INT(SEQUENCE(24,,0)/2)+1)),N(IF({1},MOD(SEQUENCE(24,,0),2)+1)))))),SUMIFS(C:C,A:A,UNIQUE(INDEX(A1:B12,N(IF({1},INT(SEQUENCE(24,,0)/2)+1)),N(IF({1},MOD(SEQUENCE(24,,0),2)+1)))))+SUMIFS(C:C,B:B,UNIQUE(INDEX(A1:B12,N(IF({1},INT(SEQUENCE(24,,0)/2)+1)),N(IF({1},MOD(SEQUENCE(24,,0),2)+1))))),0))


但我们可以将helper列与动态数组公式一起使用

在一个单元格中,我们放入:

=UNIQUE(INDEX(A1:B12,N(IF({1},INT(SEQUENCE(24,,0)/2)+1)),N(IF({1},MOD(SEQUENCE(24,,0),2)+1))))
我把它放在E1中,然后我用sumifs来表示:

=SUMIFS(C:C,A:A,E1#)+SUMIFS(C:C,B:B,E1#)
我将其放在F1中,然后使用索引/匹配:

=INDEX(E1#,MATCH(MAX(F1#),F1#,0))
=INDEX(E:E,MATCH(MAX(F:F),F:F,0))


在使用普通公式的过程中,需要复制粘贴两列,一列粘贴在另一列下面,并使用“数据”选项卡上的“删除重复项”来获得唯一列表:

然后使用F1中的公式:

=SUMIFS(C:C,B:B,E1)+SUMIFS(C:C,A:A,E1)
把名单抄下来。然后使用索引/匹配:

=INDEX(E1#,MATCH(MAX(F1#),F1#,0))
=INDEX(E:E,MATCH(MAX(F:F),F:F,0))
返回所需的值


这里要详细说明的是为什么vba更适合这个。将其放在一个模块中:

Function myMatch(RngA As Range, RngB As Range, sumRng As Range)
    If RngA.Cells.Count <> RngB.Cells.Count Or RngA.Cells.Count <> sumRng.Cells.Count Or RngB.Cells.Count <> sumRng.Cells.Count Then
        myMatch = CVErr(xlErrValue)
        Exit Function
    End If
    Dim arrA As Variant
    arrA = RngA.Value

    Dim arrB As Variant
    arrB = RngB

    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim j As Long
    For j = 1 To 2
        Dim i As Long
        For i = 1 To UBound(arrA)
            Dim uRec As String
            uRec = IIf(j = 1, arrA(i, 1), arrB(i, 1))

            Dim smRec As Double
            smRec = Application.SumIfs(sumRng, RngA, IIf(j = 1, arrA(i, 1), arrB(i, 1))) + Application.SumIfs(sumRng, RngB, IIf(j = 1, arrA(i, 1), arrB(i, 1)))
            On Error Resume Next
                dict.Add uRec, smRec
            On Error GoTo 0
        Next i
    Next j

    Dim mx As Double
    mx = 0

    Dim temp As String
    temp = ""

    Dim key As Variant
    For Each key In dict.Keys
        If dict(key) > mx Then
            temp = key
            mx = dict(key)
        End If
    Next key

    myMatch = temp
End Function

您还可以使用电源查询解决该案例

步骤如下:

  • 将源数据(即三列表)添加到Power Query编辑器中

  • 使用
    Transform
    选项卡下的Merge Columns函数,通过分隔符(例如分号
    )合并前两列
    

  • 使用
    Transform
    选项卡下的splitcolumns函数,以相同的分隔符拆分合并的列,例如分号
    ,并确保在高级选项中选择将结果放入行中
    

  • 使用Group By函数,按
    合并的
    列对最后一列进行分组,并将
    求和
    设置为函数

  • 最后,对最后一列进行排序
  • 您可以关闭并将结果加载到新工作表中(默认情况下)

    以下是幕后的Power Query M代码
    ,仅供参考。所有步骤都使用直接且易于执行的内置函数

    let
        Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", type text}, {"Column3", Int64.Type}}),
        #"Merged Columns" = Table.CombineColumns(#"Changed Type",{"Column1", "Column2"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged"),
        #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Merged Columns", {{"Merged", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Merged"),
        #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Merged", type text}}),
        #"Grouped Rows" = Table.Group(#"Changed Type1", {"Merged"}, {{"Sum", each List.Sum([Column3]), type number}}),
        #"Sorted Rows" = Table.Sort(#"Grouped Rows",{{"Sum", Order.Descending}})
    in
        #"Sorted Rows"
    

    如果你有任何问题,请告诉我。干杯:)

    你考虑过数据透视表吗?不幸的是,就我正在进行的项目而言,它必须是一个公式(或者像我说的,公式的组合)。谢谢你!除非你能使用新的动态数组公式,否则vba在这里可能是最好的。嗨,斯科特,谢谢你的帮助!我对VBA非常陌生,所以我为任何愚蠢的问题道歉,但是-我在输入代码时遇到以下错误-“Missing;before语句。(第1行,文件“code”)“您将代码放在哪里?点击Alt-F11,然后添加一个模块并将代码放在那里。很抱歉,它在Excel中确实有效!问题是-我需要能够将相同的功能导入到Google Sheets。有没有办法得到同样的结果?导入相同的代码会导致上述错误。我很抱歉没有说得更清楚。@Falcon4ch您要求Excel。谷歌表单的答案完全不同,不可转让。无论是公式还是代码方法都无法在谷歌表单中使用。如果你想要一个谷歌表单答案,请用正确的标签重新提问。我明白了,要做到这一点,不可能同时做到这两个方面。那会让事情变得更加困难。无论如何,我真的很感谢你花时间在这件事上!再次感谢你!