【问题标题】:Excel: count occurences until value has occured n-timesExcel:计算出现次数,直到值出现 n 次
【发布时间】:2013-08-29 18:13:25
【问题描述】:

我有一个名为 Data 的长 Excel 表格,看起来像这样:

甲乙 1 名称用法 2 彼得 1 3 强尼 3 4 强尼 1 5 彼得 1 6 杰克 2 ... 20000 强尼 1

暂时不要介意 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,看起来像这样:

A B C D E 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 等效项,可能是一个数组函数。

【问题讨论】:

    标签: excel excel-formula array-formulas


    【解决方案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
    

    【讨论】:

    • 非常感谢,这不是我想要的,但它帮助我找到了解决方案。我是数组函数的新手,所以我没有意识到你基本上可以使用 small 对条目进行排序。我现在有以下工作解决方案:
       {=SMALL(IF(Data!$A$2:$A$20000=B$1;ROW(Data!$A$20000));$A2-1} 和 前>
    • 当然,我现在有以下工作解决方案:{=SMALL(IF(Data!$A$2:$A$20000=B$1,ROW(Data!$A$20000)),$A2)-1} 使用您的范围将是 {=SMALL(IF(A1:A9=C1, ROW(A1:A9)),D1)-1}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多