Arrays 在SUMPRODUCT中使用时,使用电子表格函数更改数组尺寸

Arrays 在SUMPRODUCT中使用时,使用电子表格函数更改数组尺寸,arrays,excel,dimensions,openoffice-calc,array-formulas,Arrays,Excel,Dimensions,Openoffice Calc,Array Formulas,我对包含在单单元格公式中的电子表格函数而不是VBA解决方案感兴趣 [A1:A15包含1到127之间的数值,B1:B15包含设置除数的1到7之间的整数。] 鉴于功能: =SUMPRODUCT(MOD(FREQUENCY(A1:A15;A1:A15);B1:B15)) 频率(A1:A15;A1:A15)给出了15+1行的单列数组,而第二部分(B1:B15)是15行的单列数组 我想将由FREQUENCY(仅在内存中-在工作表中不显式)给出的结果数组从1列16行数组更改为1列15行数组,其中包含该数组

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

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

鉴于功能:

=SUMPRODUCT(MOD(FREQUENCY(A1:A15;A1:A15);B1:B15))
频率(A1:A15;A1:A15)
给出了15+1行的单列数组,而第二部分
(B1:B15)
是15行的单列数组

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

[频率文档:注意:对于Excel,第二条备注说明了依赖于bins_数组的元素数。]

我将感谢您的建议

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


人们一直认为,让它更具体可能更有帮助,因此它被大大简化了

在外部帮助下,我已经能够在数组公式模式下使用索引来微调解决问题的方法。我正在发布答案,以防对他人有所帮助

单向:将
频率(A1:A15;A1:A15)
或任何生成多单元格数组的公式放入索引中,并将第二个和/或第三个参数作为表示行/列的连续值数组

INDEX(FREQUENCY(A1:A15;A1:A15);ROW(INDIRECT("1:" & ROWS(FREQUENCY(A1:A15;A1:A15)-1));1)
索引中的第一个参数是从要收缩的公式(从16x1到15x1)得到的结果数组,如果显式输入,这将是一个多单元数组公式;第二个参数是数组1..15,行号从1到“array from formula to shrink”的总行数减1:数组中公式的前15个(共16个)值;第三个参数是收缩数组的列(如果需要,可以使用与第二个参数类似的方式选择多个参数)

在频率的特定情况下,因为已知我们对函数的“bin”部分感兴趣,所以可以通过将“bin”/“interval”数组的总行包含在频率内(其第二个参数)来简化公式。我们会

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在评论中正确指出的那样,这在广泛流行的电子表格软件Excel中似乎不起作用。它是为SUMPRODUCT内部的一个索引函数开发的,正如在OpenOfficeCalc中使用的那样,我错误地认为它100%等同于Excel版本。如果您能使用其他函数给出更完整的答案,我们将不胜感激。

在前面的答案中,XOR LX非常正确地指出,由于行数/列数参数行为,此公式无法在Excel中工作。非常友好的XOR LX向我展示了该方法的工作原理,同时也感谢并感谢您提供了一个很好的答案:“如果强制行数/列数数组采用具有正确维度的任意数组,则可以使用索引对数组(甚至是动态创建的数组)进行重定维度,如上所示”以下公式已在Excel 2010中进行检查,并具有预期结果:

SUMPRODUCT(MOD(INDEX(FREQUENCY(A1:A15,A1:A15),N(INDEX(ROW(INDIRECT("1:" & ROWS(A1:A15))),,)),1),B1:B15))
注意:第一个索引(一个行生成的辅助数组)的row_num参数已嵌套在N(索引([…],)中;至少需要一个逗号来解释嵌套索引的两个最小参数。这本身就是一个有趣的讨论,它通常适用于索引的参数和其他函数,这些函数需要强制获取数组(请参阅和XOR LX的博客)。对于OpenOffice用户来说,可能值得强调博客中提出的观点

与偏移量不同,(…)的第一个参数必须是 参考工作表中的(…),索引也可以接受- 和操纵–用于包含值的引用数组 例如,通过公式中的其他子函数生成

在更改数组中的维度(如本问题所述)时确实如此,但在反转或替换数组中的值时也很有用。Open Office接受数组作为行数/列数,因此不需要强制,某些公式依赖于此,但如果没有强制,则在Excel中打开文件时,这些公式不太可能工作

遗憾的是,这种类型的强制并没有正确地传递给OpenOffice,而且需要对公式进行“解码”才能起作用,至少在我的非正式测试中是这样

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


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

这个问题很难理解。请再次尝试减少它,这样它就不会包含不必要的信息。感谢pnuts帮助设置格式,问题会突出显示(在pnuts的帮助下)。其余部分用于上下文。如果我把它变成一般性的,摆脱上下文会更好吗?你检查过你的解决方案了吗?索引(频率(A1:A15,A1:A15)、行(间接(“1:”&行(A1:A15)))1)不解析为数组,因为只有第一个
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)
)