我有一个长长的 Excel 表,Data
看起来像这样:
AB 1 名称用法 2 彼得 1 3 强尼 3 4 强尼 1 5 彼得 1 6 杰克 2 ... 20000 强尼 1
暂时不要介意 B 列(“使用”)。我知道我可以计算 Johnny 在列 A 中的使用次数countif
,并且我可以使用 总结 Johnny 的使用情况sumif
。
然而,我想要做的是得到约翰尼的前 100、200 等次出现的总和(上面他的前 2 次出现的总和为 4)。为了得到这个,我首先需要计算列表中有多少个名字(A列),约翰尼被提到了100、200等次。(在这个例子中,他在第 4 行被提到了两次,所以如果我们减去 A1,期望的结果是 'Johnny's first 2出现在 3 个名字之后达到','Peter's first 2出现在 4 个名字之后达到')
本质上,我想要第二张纸,名称Results
如下:
ABCDE 1 n 彼得 P.sum 约翰尼 J.sum 2 2 4 2 3 4 3 100 215 220 312 312 4 200 812 480 462 715 5 500 9850 1421 5425 3212
我的问题是将什么公式放入“结果”表的 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 等效项,可能是一个数组函数。