excel 搜索包含值的单元格组,计算差值,将结果放在相邻列中

ha5z0ras  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(149)

不知道如何处理这个问题。我有一个列(列A),其中有一个时间列表。该列有许多不一致之处,因此并非所有行都包含数值。
我需要做的是计算包含数值的时间(行)之间的差异。我需要将结果放置在该特定行分组的第一个值附近(列B)。
所附的照片描绘了一个更好的图片解释我需要做什么。Example Data
数据没有模式。因此,我需要Excel来搜索列,找到分组,从一组时间中的最后一个值减去第一个值,并将结果放在B列中。
感谢您的任何建议!

cbjzeqam

cbjzeqam1#

这可能会过度使用Excel的let function,但它可以通过最大限度地减少所需的计算来显著提高性能。
把它放到B4单元格中,然后向下拖动,它应该会给予你想要的。

=IF(ISNUMBER(A4),IF(NOT(ISNUMBER(A3)),LET(
    aColumn,A:A,
    lastUsedRow,MATCH(2,1/(aColumn<>""),1),
    CleanRange,INDEX(aColumn,ROW(),1):INDEX(aColumn,lastUsedRow,1),
    endRow,IFERROR(MIN(FILTER(ROW(CleanRange),IF(NOT(ISNUMBER(CleanRange)),ROW(CleanRange)>ROW(),FALSE)))-1,lastUsedRow),
    INDEX(aColumn, endRow,1)-INDEX(aColumn,ROW(),1)),""),"")

您还可以通过在工作表中指定lastUsedRow=MATCH(2,1/($A:$A<>""),1)的命名Range,然后在公式中删除该行来改进这一点,这样它就不必不断重新计算它。

zfciruhq

zfciruhq2#

这里是一个数组版本,它溢出了整个结果,并且不需要额外的助手列(formula 1):

=LET(A,A2:A14,n,ROWS(A),seq,SEQUENCE(n),
 cnts,SCAN(0,A,LAMBDA(ac,x, IF(ISNUMBER(x), ac+1,0))),
 start,FILTER(seq,1 - ISNA(XMATCH(cnts,1))),
 end,IFERROR(VSTACK(DROP(start,1) - 1,n),n),
 MAP(seq, LAMBDA(i, LET(s, XLOOKUP(i,start, start),
  IF(ISNA(s), "", LET(e, XLOOKUP(i,start, end),
   f, FILTER(A, (seq>=s) * (seq<=e) * ISNUMBER(A)),TAKE(f,-1) - TAKE(f,1)))))))

这里有一个较短的替代方案:

=LET(A,A2:A14, n, ROWS(A), seq, SEQUENCE(n), isNum, ISNUMBER(A),
 MAP(seq, (isNum=TRUE) * (VSTACK(FALSE, DROP(isNum,-1))=FALSE), LAMBDA(i,first,
  IF(first=0, "", LET(f, FILTER(HSTACK(A,isNum), seq>=i),
   last,IFERROR(XMATCH(FALSE,INDEX(f,,2))-1,ROWS(f)),
   INDEX(f,last,1)-INDEX(f,1,1))))))

在上面的公式中,第二个MAP输入参数标识组的开始(first)。该条件检查当前元素是否为数字,而前一个元素是否为数字。
更短(类似的想法):

=LET(A,A2:A14, n, ROWS(A), seq, SEQUENCE(n), isNum, ISNUMBER(A),
 prev, VSTACK(FALSE, DROP(isNum,-1)),next, VSTACK(DROP(isNum,1), FALSE),
 start,(isNum=TRUE) * (prev=FALSE), end,(isNum=TRUE) * (next=FALSE),
 MAP(IF(start=1,seq,0), LAMBDA(i, IF(i=0,"",
  INDEX(A, XMATCH(1,N(seq>=i) * end)) - INDEX(A,i)))))

下面是输出:

  • 式1*:首先,我们通过SCAN计数(cnts)每个组上的元素(数值)(实际上我们只需要识别组的开始,即。1值)。名称start具有每个组的起始位置。名称end,每个start值对应的结束位置。IFERROR条件,考虑只有一个组的情况,因此间隔的结束是n(输入数组的最后一个索引位置)

现在我们通过MAP迭代输入(seq)的所有索引位置(i)。对于每个i-value,我们检查该值是否属于start位置,如果不是,则返回空字符串。否则,我们获得给定迭代的相应区间(se)的开始和结束。现在,我们通过FILTER过滤输入数据A,以仅获得所选区间的数值,然后通过TAKE获得最后一个和第一个进行减法。

相关问题