我有一个名为Data
的长Excel表格,如下所示:
A B 1 Name Usage 2 Peter 1 3 Johnny 3 4 Johnny 1 5 Peter 1 6 Jack 2 ... 20000 Johnny 1
暂时没关系B列(“用法”)。我知道我可以使用countif
计算Johnny列在A列中的次数,我可以使用sumif
来总结Johnny的用法。
但是,我要做的是获得约翰尼前100,200等事件的总和(他的前两次出现的总和,将是4)。 为了得到这个,我首先需要计算列表中的多少名称(A列),Johnny已被提及100,200等次。 (在这个例子中,他在第4行中被提到过两次,所以如果我们扣除A1,那么期望的结果是'约翰尼在3个名字之后达到的前两次出现','彼得在4个名字之后的前两次出现')
基本上我想要一张名为Results
的第二张表,如下所示:
A B C D E 1 n Peter P.sum Johnny 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("'Data'!$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等价物,可能是一个数组函数。
答案 0 :(得分:1)
=COUNTIF(INDIRECT("A1:A"&SMALL(IF(A1:A9=C1,ROW(A1:A9)),D1)),C1)
=SUMIF(INDIRECT("A1:A"&SMALL(IF(A1:A9=C1,ROW(A1:A9)),D1)),C1,B1:B9)
两者都有一个数组公式(CTRL + Enter)....
,其中
A1 = start range (names)
A9 = end range (names)
C1 = Name to match (Johny, Jack, Peter)
D1 = No of counts required till
B1 = Sum range start
B2 = sum range end