0

我有一个长长的 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 等效项,可能是一个数组函数。

4

1 回答 1

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
于 2013-08-29T08:59:42.607 回答