【发布时间】:2013-08-29 18:13:25
【问题描述】:
我有一个名为 Data 的长 Excel 表格,看起来像这样:
暂时不要介意 B 列(“使用”)。我知道我可以使用 countif 计算 Johnny 在 A 列中列出的次数,并且我可以使用 sumif 来总结 Johnny 的使用情况。
但是,我要做的是获取 Johnny 前 100 次、200 次等出现的总和(上面他的前 2 次出现的总和为 4)。 为了得到这个,我首先需要计算列表中有多少个名字(A列),约翰尼被提到了100、200等次。 (在这个例子中,他在第 4 行被提到了两次,所以如果我们减去 A1,期望的结果是 'Johnny's first 2出现在 3 个名字之后达到','Peter's first 2出现在 4 个名字之后达到')
基本上我想要第二张表,名为Results,看起来像这样:
我的问题是将什么公式放入“结果”表的 B 列和 D 列。我不能使用 VBA,不能使用辅助列,也不能对“数据”表进行不同的排序。
现在我确实有一个可行的解决方案,但它对 CPU 的消耗非常多,以至于工作表需要一个多小时才能计算一个名称的结果。我在 B2 中使用了以下数组公式:
{=MATCH($A2, COUNTIF(INDIRECT("'数据'!$A$2"&":"&ADDRESS(ROW($A$2:$A$20000),COLUMN($A$2))),B$2), 0)}这可行,但必须有一个更简单的解决方案,我的意思是在 CPU 上更简单。请帮我找到它。
问题是,在代码中,每个单元计算本质上是一个大致如下所示的函数:
function (n=2 /*or 100, 200, etc*/, name="Peter") {
int counter1;
for (int i1=2; i1<20000; i1++) {
int counter2=0;
for (int i2=2; i2<i1; i2++) {
if (Data!A[i2]==name) counter2++;
}
if (counter2==n) counter1=i1;
}
return counter1;
}
换句话说,如果我们只有五行,它将(仅针对一个结果)循环遍历第 1 行,然后是第 1-2 行,然后是第 1-3 行,然后是第 1-4 行,然后是第 1-5 行.有 20000 行,计算数量惊人。 在代码中,会有一个更简单的解决方案,如下所示:
function (n=2 /*or 100, 200, etc*/, name="Peter") {
int counter1=0;
for (int i1=2; i1<20000; i1++) {
if (Data!A[i1]==name) counter1++;
if (counter1==n) return(i1);
}
}
这将使每个单元格最多进行 200000 次计算,我正在寻找一个 Excel 等效项,可能是一个数组函数。
【问题讨论】:
标签: excel excel-formula array-formulas