Excel:计算出现次数,直到值出现n次

时间:2013-08-29 08:38:50

标签: excel excel-formula array-formulas

我有一个名为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等价物,可能是一个数组函数。

1 个答案:

答案 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