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) 它将起作用,但会很慢,我可以使其变得非常快吗?
其工作原理如下:当前,您有一个X*N数组/矩阵,您想要将其更改为X*1矩阵(其中每个新行是旧矩阵中的行的总和),然后取最大值。为此,您需要将其乘以一个N*1矩阵:两个Ns“抵消”。
第一步很简单: 第二个矩阵中的每个值都是1
示例: [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]]\nRun Code Online (Sandbox Code Playgroud)\n\n然后我们MAX这样:
=MAX(MMULT(A1:B6,{1;1}))\nRun Code Online (Sandbox Code Playgroud)\n\n要动态生成第二个数组(即任何大小),我们可以使用表的第一行,将其完全转换为1(例如,“列号> 0”),然后TRANSPOSE将其转换为列而不是行。这可以写成TRANSPOSE(--(COLUMN(A1:B1)>0))
把它们放在一起,我们得到:
\n\n=MAX(MMULT(A1:B6, TRANSPOSE(--(COLUMN(A1:B1)>0))))\nRun Code Online (Sandbox Code Playgroud)\n\n由于MMULT适用于数组 - 就像SUMPRODUCT- 我们实际上不需要将其定义为带有Ctrl+ Shift+的数组公式Enter!
如果您想按列进行此操作,则需要交换数组- 矩阵乘法不可交换:
\n\n=MAX(MMULT(TRANSPOSE(--(ROW(A1:A6)>0)), A1:B6))\nRun 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]]\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
8451 次 |
| 最近记录: |