【问题标题】:Maximum value of a dynamic range动态范围的最大值
【发布时间】:2015-04-16 03:56:41
【问题描述】:

我有一列包含值。我想找到 10 行深度范围的最小值的最大值。所以第一个范围是 a1:a10,第二个范围是 a2:a11,以此类推。对于每个范围,必须计算最小值,但不能存储或显示。然后我需要这些最小值的最大值。我自己不需要最小值,我只需要最大值。 我创建了以下数组公式 {=MAX(MIN(OFFSET($C$10,$A$11:$A$366,1,10,1)))} 虽然在使用数组公式时返回 0 {=MIN(OFFSET($C$10,$A $11:$A$366,1,10,1))} 在 B11:B366 范围内并应用 max(B11:B366) 我获得了正确的值。

我不想创建额外的列(这解决了问题),因为这些最小值没有意义,我只需要知道这 356 个最小值中的最大值。

提前致谢, 菲利普

有什么建议吗?

【问题讨论】:

标签: excel


【解决方案1】:

对于A1:A30 单元格中的数据,您可以使用以下公式:

=MAX(SUBTOTAL(5,OFFSET((A1:A21),ROW(A1:A21)-1,,10)))

-1参数要改为起始行号

编辑:正如@XOR LX 在下面评论的那样,这是一个数组公式,因此您需要使用Ctrl+Shift+Enter 确认它

【讨论】:

  • 也许值得让 OP 知道这是一个数组公式?他们不一定只看就知道,也不一定知道数组公式到底是什么?
  • @XOR LX 是的,谢谢,我将编辑答案。问题中有一个数组公式,所以我忘了添加注释。
  • 啊!好点子。你是对的 - 我想在这种情况下真的没有必要。
【解决方案2】:

一个可以在工作表上用作用户设计函数的VBA解决方案:

=LargestMinimum(A1:A365)

VBA 代码:

Function LargestMinimum(rng As Range) As Integer
    Dim i As Long, max As Integer, col As Integer, temp As Integer

    res = 0
    col = rng.Column

        For i = 1 To rng.Count - 9
            temp = WorksheetFunction.Min(Range(Cells(i, col), Cells(i + 9, col)))
            res = IIf(temp > res, temp, res)
        Next i

    LargestMinimum = res
End Function

【讨论】:

  • 谢谢,但我想在不使用 VBA 的情况下这样做
【解决方案3】:

我怀疑您的查询应该有一些逻辑捷径。但是,对于 A1:A100 中的数据:

=MAX(SUBTOTAL(5,OFFSET(A1,MMULT(ROW(INDEX(A:A,1):INDEX(A:A,91))-1,1),,10)))

我相信您可以修改此内容以满足您的实际需要? 91 表示此处要查询的最后 10 个单元格范围是 A91:A100。

注意事项:这里使用MMULT函数其实是相当多余的。事实上,它只是为了从 ROW 构造中强制返回所需的数组,这种强制要求将公式作为数组公式提交,即使用 CSE。

这种相当人为的强制也可以在许多情况下使用 INDEX 来实现。然而,可以说这些方法不是最佳实践的例子,我可能不应该在这里使用这种技术。毕竟,数组公式没有任何“错误”。

话虽如此,这里额外的函数调用很可能意味着它的效率仅比等效的 CSE 公式低一小部分。

不管怎样,这部分:

ROW(INDEX(A:A,1):INDEX(A:A,91))-1

生成一个从 0 到 90 的整数数组,即:

ROW(A1:A91))-1

即:

{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90;91}-1

即:

{0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90}

正如我所说,MMULT 提供了必要的数组强制。事实上,这就是它所做的一切,因为:

MMULT(ROW(INDEX(A:A,1):INDEX(A:A,91))-1,1)

这是:

MMULT({0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90},1)

很简单:

{0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90}

但请注意,如果没有此附加功能或 CSE 条目,ROW 构造:

ROW(INDEX(A:A,1):INDEX(A:A,91))

不会解析为数组(实际上它只会返回结果数组中的第一个元素,即 1)。

这个数组然后作为 rows 参数传递给 OFFSET,其中 height 参数为 10,意味着我们将生成一个范围数组以传递给小计,因此:

OFFSET(A1,ROW(INDEX(A:A,1):INDEX(A:A,91))-1,,10)

这是:

OFFSET(A1,{0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90},,10)

实际上是:

{A1:A10;A2:A11;A3:A12;A4:A13;A5:A14;A6:A15;A7:A16;A8:A17;A9:A18;A10:A19;A11:A20;A12:A21;A13:A22;A14:A23;A15:A24;A16:A25;A17:A26;A18:A27;A19:A28;A20:A29;A21:A30;A22:A31;A23:A32;A24:A33;A25:A34;A26:A35;A27:A36;A28:A37;A29:A38;A30:A39;A31:A40;A32:A41;A33:A42;A34:A43;A35:A44;A36:A45;A37:A46;A38:A47;A39:A48;A40:A49;A41:A50;A42:A51;A43:A52;A44:A53;A45:A54;A46:A55;A47:A56;A48:A57;A49:A58;A50:A59;A51:A60;A52:A61;A53:A62;A54:A63;A55:A64;A56:A65;A57:A66;A58:A67;A59:A68;A60:A69;A61:A70;A62:A71;A63:A72;A64:A73;A65:A74;A66:A75;A67:A76;A68:A77;A69:A78;A70:A79;A71:A80;A72:A81;A73:A82;A74:A83;A75:A84;A76:A85;A77:A86;A78:A87;A79:A88;A80:A89;A81:A90;A82:A91;A83:A92;A84:A93;A85:A94;A86:A95;A87:A96;A88:A97;A89:A98;A90:A99;A91:A100}

然后我们将哪个范围引用数组传递给 SUBTOTAL,function_num 参数为 5(即 MIN),这会产生一个包含上述每个数组的最小值的值数组,例如:

{10;10;13;11;11;11;11;11;11;11;11;11;11;21;21;21;21;21;21;21;21;21;21;21;21;21;21;21;21;21;21;30;5;5;5;5;5;5;5;5;5;5;24;24;12;12;12;12;12;6;6;6;6;6;6;6;6;6;6;7;7;7;7;7;7;7;7;18;8;8;8;8;8;2;2;2;2;2;2;2;2;2;2;7;7;7;7;7;7;7;7}

然后最终传递给 MAX。

问候

【讨论】:

  • 谢谢,但我不知道小计将如何为我的 10 个连续行生成最小值
  • 你的意思是你不明白这个功能组合是如何运作的?或者你尝试了这个公式,但它没有给你想要的结果?如果是这样,您是否首先在 A1:A100 中的数据集上测试了该公式?你得到了什么结果?而且,假设您能够修改范围以满足您的实际需求,那么您得到了什么结果?为什么它们不是您所期望的?
  • 非常感谢,您的解决方案确实有效;正是我想要的。我只是无法理解您的公式如何通过小计和 mmult 得出最小值。再次感谢。
  • 啊,好的。不客气。如果你愿意,我可以在我的帖子中添加一些解释。虽然所采用的结构不是一个简单的结构,所以我不能保证它会很容易理解,即使在我提出了一个解构之后。
  • 如果您能提供更多有用的信息,不仅对我有用,也对本论坛的其他订阅者有用。如果解构不容易,我会冒险。我非常感谢您的帮助和经验。亲切的问候。菲利普
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多