【问题标题】:Change array dimensions, using spreadsheet functions, when used inside SUMPRODUCT在 SUMPRODUCT 中使用时,使用电子表格函数更改数组维度
【发布时间】:2015-10-09 19:48:48
【问题描述】:

我对包含在单个单元格公式中的电子表格函数而不是 VBA 解决方案感兴趣。

[A1:A15 包含从 1 到 127 的数值,B1:B15 包含设置除数的从 1 到 7 的整数。]

给定函数:

=SUMPRODUCT(MOD(FREQUENCY(A1:A15;A1:A15);B1:B15))

FREQUENCY(A1:A15;A1:A15) 给出一个 15+1 行的 1 列数组,而第二部分 (B1:B15) 是一个 15 行的 1 列数组。

我想将 FREQUENCY 给出的结果数组(仅在内存中 - 在工作表中不明确)从 1 列 16 行数组更改为 1 列 15 行数组,其中包含该数组的前 15 个单元格值.

[FREQUENCY 文档:https://support.office.com/en-us/article/FREQUENCY-function-44e3be2b-eca0-42cd-a3f7-fd9ea898fdb9 NB:对于 Excel,第二个备注说明了依赖于 bins_array 的元素数量。 ]

我将不胜感激。

因此,MOD 中的两个数组将具有相同的维度,并且 SUMPRODUCT 不会找到具有错误值的单元格。我可以在 SUMPRODUCT 中使用 IF 和 ISERROR 忽略错误值,但如果可能的话,我宁愿忽略 FREQUENCY 结果数组的不相关部分。

人们认为,使其更具体可能更有帮助,因此已大大减少和简化。

【问题讨论】:

  • 这个问题很难理解。请再次尝试减少它,以免包含不必要的信息。
  • 感谢 pnuts 帮助格式化,问题被突出显示(在 pnuts 的帮助下)。其余的用于上下文。如果我把它笼统地去掉上下文会更好吗?

标签: arrays excel dimensions openoffice-calc array-formulas


【解决方案1】:

借助外部帮助,我能够在数组公式模式下使用 INDEX 微调解决问题的方法。我发布答案以防它帮助其他人。

一种方法:将FREQUENCY(A1:A15;A1:A15) 或任何生成多单元格数组的公式放在 INDEX 中,并将第二个和/或第三个参数作为表示行/列的连续值数组。

INDEX(FREQUENCY(A1:A15;A1:A15);ROW(INDIRECT("1:" & ROWS(FREQUENCY(A1:A15;A1:A15)-1));1)

INDEX 中的第一个参数是来自要缩小的公式(从 16x1 到 15x1)的结果数组,如果显式输入,这将是一个多单元格数组公式;第二个参数是数组 1..15,由从 1 到“要缩小的公式的数组”的总行数的行数给出 MINUS 1:公式中数组中的前 15 个(共 16 个)值;第三个参数是收缩数组的列(如果需要,可以使用第二个参数的类似物选择多个)。

在 FREQUENCY 的特殊情况下,因为已知我们对函数的“bins”部分感兴趣,所以可以通过在 FREQUENCY 中包含“bins”/“intervals”数组的总行数来简化公式(它的第二个论点)。我们会有

INDEX(FREQUENCY(A1:A15;A1:A15);ROW(INDIRECT("1:" & ROWS(A1:A15)));1)

完整的公式会变成

SUMPRODUCT(MOD(INDEX(FREQUENCY(A1:A15;A1:A15);ROW(INDIRECT("1:" & ROWS(A1:A15)));1);B1:B15))

现在,MOD 的被除数和除数具有完全相同的尺寸 (15x1),并且因为 B1:B15 包含大于 0 的整数,所以没有错误。

感谢大家帮助我使问题更简洁和格式更好。

附加信息:正如 XOR LX 在 cmets 中正确指出的那样,这似乎不适用于广受欢迎的电子表格软件 Excel。它是为 SUMPRODUCT 中的 INDEX 函数开发的,用于 Open Office Calc,我错误地认为 100% 等同于 Excel 的版本。可能使用其他功能的更完整的答案将不胜感激。

【讨论】:

  • 你检查过你的解决方案了吗? INDEX(FREQUENCY(A1:A15,A1:A15),ROW(INDIRECT("1:" & ROWS(A1:A15))),1) 不解析为数组,因为仅生成数组中的第一个值通过 ROW(INDIRECT("1:" & ROWS(A1:A15)),即 1,将传递给 INDEX。
  • 是的,已经查过了。如果您将其作为数组公式输入(即选择合适的范围并使用 ctrl-shift-enter 输入),它会解析为数组。在 SUMPRODUCT 中,它被视为动态创建的数组,在我的测试 (openOffice Calc) 中,它的行为与 MOD 和 SUMPRODUCT 中的描述相同。我很想知道它在 Excel 中的行为是否有所不同,我稍后会自己尝试。
  • 我不知道“openOffice Calc”是什么,但您的原始问题标记为 Excel,并且我确信该数组在该应用程序中无法按照您的意愿解析,无论是作为数组输入公式与否。
  • 请原谅我,但这根本不是真的。您不能将值数组作为 INDEX 的 row_num 或 column_num 参数传递。除非你通过使用几个附加功能来强制它,也就是说,在这种情况下你没有这样做。也许您在通过在公式栏中重复按 F9 来评估公式时犯了一个错误,这根本不是一个好主意。然而,评估公式工具将始终给出正确的评估。
  • 感谢您对 XOR LX 的持续关注。在 Open Office 中有效,但在 Excel 中的行为似乎不同。 INDEX 可以在 Excel 2010 中作为数组公式输入,它可以为您提供一个完整的数组(取决于所选范围),如果使用 ctrl-shift-enter,我已经检查过了。但是,SUMPRODUCT 确实给我带来了意想不到的结果。您将如何从 FREQUENCY(A1:A15,A1:A15) 函数中获取动态创建的数组的一部分。我非常感谢您提出的建议(尤其是考虑到 Excel 的受众比 Open Office 更广泛)。
【解决方案2】:

在上一个答案中,XOR LX 非常正确地指出,由于 row_num/column_num 参数行为,该公式无法在 Excel 中工作。非常友好的 XOR LX 向我展示了这种方法是如何工作的,并且感谢并感谢提供了一个好的答案:“如果 row_num/column_num 数组被强制为取一个具有正确尺寸的任意数组,如this blog entry 上所示" 以下公式已在 Excel 2010 中检查并具有预期结果:

SUMPRODUCT(MOD(INDEX(FREQUENCY(A1:A15,A1:A15),N(INDEX(ROW(INDIRECT("1:" & ROWS(A1:A15))),,)),1),B1:B15))

NB: 第一个 INDEX 的 row_num 参数,一个 ROW 生成的辅助数组,已经嵌套在 N(INDEX([...],,));至少需要一个逗号来说明嵌套 INDEX 的两个参数最小值。通常适用于 INDEX 的参数和其他函数的讨论本身很有趣,这些参数需要强制采用数组(参见 XOR LX 博客上的herehere)。对于 Open Office 用户,可能值得强调博客中提出的观点

与 OFFSET 不同,(...) 的第一个参数必须是 工作表中的引用(...),INDEX 也可以接受 – 和操作——因为它的参考数组由值组成 生成例如通过公式中的其他子函数。 XOR LX's blog

在这个问题中改变数组中的维度确实是这种情况,但在反转或置换数组中的值时也很有用,例如。 Open Office 接受数组作为 row_num/column_num,因此不需要强制转换,一些公式依赖于此,但没有它,当在 Excel 中打开文件时,这些公式不太可能工作。

遗憾的是,这种类型的强制没有正确传递给 Open Office,并且公式需要“去强制”才能工作,至少在我的随意测试中。

为了使用适用于两个电子表格程序的有关缩短数组的公式,我唯一管理的是以下内容(必需:数组必须是单列)

SUMPRODUCT(
(COLUMN(INDIRECT("R1C1:R"& ROWS(vals_to_mod) &"C"& ROWS(FREQUENCY(vals_for_freq,vals_for_freq)),FALSE))
-ROW(COLUMN(INDIRECT("R1C1:R"& ROWS(vals_to_mod) &"C"& ROWS(FREQUENCY(vals_for_freq,vals_for_freq)),FALSE))
=0)
*MOD(TRANSPOSE(FREQUENCY(vals_for_freq,vals_for_freq)),vals_to_mod)
)

(它通过在左上角开始的对角线上创建一个具有 TRUE/1 和其他位置的 FALSE/0 的辅助数组,将一个数组“缩短”为一对中最短的一个数组,因此忽略正方形部分之外的所有定义值数组。因此,SUMPRODUCT 在正方形部分的对角线内添加值,这些值是对应值的乘积,直到较短数组的最后一个值。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多