如何在Excel中的数组公式中进行逐行求和?

Mic*_*elE 4 excel vba sum excel-formula

假设我有以下基本电子表格:

    A   B   C   D
1  -2   4   2  12
2  -1   1   0
3   0   0   0  22
4   1   1   2  12
5   2   4   6
6   3   9  12
Run Code Online (Sandbox Code Playgroud)

A 列包含从 -2 到 3 的整数。

B 列具有 a 列值的平方。

C 列是 A 和 B 的行总和,因此 C1 为 =SUM(A1:B1)。

D1 有=MAX(C1:C6),这个最大值是我需要用一个公式得到的结果。

D3 是通过 Ctrl+Shift+Enter 输入的 =MAX(SUM(A1:B6)),但它只是得到常规总和。D4 是 =MAX(A1:A6+B1:B6) 并按 ctrl+shift+enter,这样可以得到正确的结果 12。

然而,D4 的问题是我需要能够处理大动态范围,而无需输入无穷无尽的总和。假设 SUM(A1:Z1000) 将为 A1:A1000+B1:B1000+....+Z1:Z1000,这不是一个合理的公式。

那么我怎样才能做类似 =MAX(SUM(A1:Z1000)) 的事情,以便它将行 A1:Z1 到 A1000:Z1000 求和并给出最终的行宽度最大值。

我只能使用基本 Excel,因此没有辅助列,也没有 VBA 函数。

更新 由于还没有任何成功的答案,我不得不假设当前的 Excel 版本不可能做到这一点。

所以我试图在 VBA 中构建这个函数,这就是我到目前为止所拥有的。

Function MAXROWSUM(Ref As Range) As Double
    Dim Result, tempSum As Double
    Dim Started As Boolean
    Started = False
    Result = 0
    For Each Row In Ref.Rows
        tempSum = Application.WorksheetFunction.Sum(Row)
        If (Started = False) Then
            Result = tempSum
            Started = True
        ElseIf tempSum > Result Then
            Result = tempSum
        End If
    Next Row
    MAXROWSUM = Result
End Function
Run Code Online (Sandbox Code Playgroud)

此函数可以正常工作,并且在行数少于 100k 时速度相当快,但如果范围内的行数接近可能的 100 万行,则即使大部分范围为空,该函数也会变得非常慢,需要几秒钟。有没有办法通过过滤掉任何空行来显着优化当前代码?在我的示例中,如果我输入 MAXROWSUM(A1:B1000000) 它将起作用,但会很慢,我可以使其变得非常快吗?

Chr*_*dal 9

您的解决方案是矩阵乘法,通过函数MMULT

\n\n

其工作原理如下:当前,您有一个X*N数组/矩阵,您想要将其更改为X*1矩阵(其中每个新行是旧矩阵中的行的总和),然后取最大值。为此,您需要将其乘以一个N*1矩阵:两个Ns“抵消”。

\n\n

第一步很简单: 第二个矩阵中的每个值都是1

\n\n

示例: [6*2] \xe2\x88\x99 [2*1] = [6*1]

\n\n
[[-2][ 4]             [[ 2]\n [-1][ 1]    [[ 1]     [ 0]\n [ 0][ 0]  \xe2\x88\x99  [ 1]] =  [ 0]\n [ 1][ 1]              [ 2]\n [ 2][ 4]              [ 6]\n [ 3][ 9]]             [12]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我们MAX这样:

\n\n
=MAX(MMULT(A1:B6,{1;1}))\n
Run Code Online (Sandbox Code Playgroud)\n\n

要动态生成第二个数组(即任何大小),我们可以使用表的第一行,将其完全转换为1(例如,“列号> 0”),然后TRANSPOSE将其转换为列而不是行。这可以写成TRANSPOSE(--(COLUMN(A1:B1)>0))

\n\n

把它们放在一起,我们得到:

\n\n
=MAX(MMULT(A1:B6, TRANSPOSE(--(COLUMN(A1:B1)>0))))\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于MMULT适用于数组 - 就像SUMPRODUCT- 我们实际上不需要将其定义为带有Ctrl+ Shift+的数组公式Enter

\n\n

如果您想按列进行此操作,则需要交换数组- 矩阵乘法不可交换

\n\n
=MAX(MMULT(TRANSPOSE(--(ROW(A1:A6)>0)), A1:B6))\n
Run Code Online (Sandbox Code Playgroud)\n\n

[1*6] \xe2\x88\x99 [6*2] = [2*1]

\n\n
                              [[-2][ 4]\n                               [-1][ 1]\n[[ 1][ 1][ 1][ 1][ 1][ 1]]  \xe2\x88\x99  [ 0][ 0]   =  [[ 3][19]]\n                               [ 1][ 1]\n                               [ 2][ 4]\n                               [ 3][ 9]]\n
Run Code Online (Sandbox Code Playgroud)\n