我感兴趣的是电子表格功能,而不是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给出的结果数组(仅在内存中 - 在sheet中不明确)从1列16行数组更改为1列15行数组,其中包含该数组的前15个单元格值
[FREQUENCY文档:https://support.office.com/en-us/article/FREQUENCY-function-44e3be2b-eca0-42cd-a3f7-fd9ea898fdb9注意:对于Excel,第二个注释表示依赖于bins_array的元素数量。 ]
我很感激建议。
因此,MOD中的两个阵列都具有相同的尺寸,SUMPRODUCT将找不到具有误差值的单元。我可以在SUMPRODUCT中使用IF和ISERROR忽略错误值,但如果可能的话,我宁愿忽略FREQUENCY结果数组的不相关部分。
人们一直认为让它更具体,可能会更有帮助,因此它已经大大减少和简化了。
答案 0 :(得分:0)
在外部帮助下,我已经能够使用数组公式模式中的INDEX微调解决问题的方法。我发布答案以防其他人帮助。
一种方法:在INDEX中放置FREQUENCY(A1:A15;A1:A15)
或产生多单元格数组的任何公式,并将第二和/或第三个参数作为表示行/列的连续值数组。
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中包含“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。它是为Open Office Calc中使用的SUMPRODUCT中的INDEX函数开发的,我错误地认为它与Excel的版本完全相同。可能会使用其他功能更完整的答案。
答案 1 :(得分:0)
在上一个答案中,由于row_num / column_num参数行为,XOR LX非常正确地指出此公式在Excel中不起作用。非常友好的XOR LX向我展示了这种方法是如何工作的,同时也感谢并提供了一个很好的答案:“如果row_num / column_num数组被强制转换,则可以使用INDEX来重新定义数组(甚至是动态创建的数组)获取具有正确尺寸的任意数组,如this blog entry“所示。已在Excel 2010中检查以下公式并具有预期结果:
SUMPRODUCT(MOD(INDEX(FREQUENCY(A1:A15,A1:A15),N(INDEX(ROW(INDIRECT("1:" & ROWS(A1:A15))),,)),1),B1:B15))
注意:第一个INDEX的row_num参数,一个ROW生成的辅助数组,已嵌套在N(INDEX([...] ,,))中;至少需要一个逗号来说明嵌套INDEX的最小两个参数。本身有趣的讨论通常适用于INDEX的论证,以及需要强制接受数组的其他函数(参见XOR LX博客中的here和here)。对于Open Office用户,可能值得强调在博客上提出的观点
与OFFSET不同,(...)第一个参数必须是a 在工作表中引用(...),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 / 1s,在其他地方为FALSE / 0s,因此忽略在方形部分之外的所有定义值。因此,SUMPRODUCT在方形截面的对角线内添加值,这些值是相应值的乘积,直到较短数组的最后一个值。)