【问题标题】:Get values from last 3 non-blank cells in a row从一行中的最后 3 个非空白单元格中获取值
【发布时间】:2013-04-28 11:15:09
【问题描述】:

我目前有一个类似于以下的 Excel 工作表(# 代表空白单元格

1   2   3   4   5   6   7
37  21  30  32  25  22  34
#   17  26  28  27  17  31
#   #   #   #   #   #   38
25  23  27  35  33  #   #
27  11  23  #   #   #   #

在第 8 列中,我需要最后 3 个非空白单元格的总和(列数定期增加)。

我需要实现的示例如下:

1   2   3   4   5   6   7       8
37  21  30  32  25  22  34      25+22+34=81
#   17  26  28  27  17  31      27+17+31=75
#   #   #   #   #   #   38      N/A
25  23  27  35  33  #   #       27+35+33=95
27  11  23  #   #   #   #       27+11+23=61

我已经设法非常接近 LARGE 函数,但显然这只给了我最大的 3 个,而不是最后 3 个非空白:

=(LARGE(C3:J3,1)+LARGE(C3:J3,2)+LARGE(C3:J3,3))

【问题讨论】:

  • 你想要 VBA 还是 NON VBA 解决方案?
  • VBA 绝对可以通过向下循环第 8 列 - 然后在循环内,您需要从左到右移动寻找前三个非空白,并且每次为第 8 列构建公式或计算总数。我不会写这个,因为我怀疑其他人会使用工作表函数,如果可用,这是更简单的方法
  • 如果可能的话,为了便于管理,我更喜欢非 VBA,但如果没有可用的工作表函数,VBA 就可以了。
  • 有一个公式。请给我一些时间。我正在试验它。
  • 如果第 1 行中有 2 个 34,那么我会遇到这样的情况。我已经管理了其余的部分。仍在试验中

标签: vba excel worksheet-function


【解决方案1】:

这是另一个:

=IF(COUNT(A2:G2)<3,"NA",SUM(G2:INDEX(A2:G2,LARGE(COLUMN(A2:G2)*(A2:G2<>""),3))))

来自http://dailydoseofexcel.com/archives/2004/05/03/sum-last-three-golf-scores/

它标识要从中求和的列,并且由于空白单元格为零,因此混合多少并不重要。

【讨论】:

  • 哦,是的,Ctrl+Shift+Enter 可能很重要 :) 谢谢巴里
【解决方案2】:

如果数据在 A1:G1 中,请在 H1 中尝试此公式

=IF(COUNT(A1:G1)&gt;2,SUM(OFFSET(A1,0,MATCH(9.99E+307,A1:G1)-1,1,-3)),NA())

【讨论】:

  • + 1 好吧,我该死!哈哈。我还准备了一个公式,但问题是如果有两个相同的数字,它就不起作用......
  • 这似乎在大多数情况下都有效,但是在 A1:G1 中使用以下内容我得到 58 而不是 88 (30 # 25 # 33 # #) - 同样,# 是空白的
  • 我从你的例子中假设数字中不会有空格,试试迪克的版本....
  • 抱歉,巴里,我没有注意到我的示例都包含块中的数字。非常感谢您的帮助。
【解决方案3】:

我知道这里的专业人士会讨厌这个。但是我处理数十万行和数百万个单元格中的数据,而且我更喜欢辅助行和复杂的公式,而不是数组公式。因为它将计算减少到分数。即使维护工作量更大,我花更少的时间修复一个公式,然后等待每次数据更改的数组计算(对我来说,我的数据每 10 分钟更改一次)因此,每 10 分钟数百万个单元格上的数十万个数组根本行不通。所以,这里只是一个替代方案。

=IF(COUNT(A2:G2)<3,"NA",IF(COUNT(E2:G2)=3,SUM(E2:G2),IF(COUNT(D2:G2)=3,SUM(D2:G2),
 IF(COUNT(C2:G2)=3,SUM(C2:G2),IF(COUNT(B2:G2),SUM(B2:G2),IF(COUNT(A2:G2)=3,
 SUM(A2:G2)))))))

如果没有 3 个值求和,它将返回 NA,否则从右到左工作将检查第一个单元格,从该单元格到末尾有 3 个数字,然后将其相加。

如果您的数据确实涉及更多列,那么您的问题。您可以使用动态范围来稍微清理代码。

另一个有效的非数组公式:

=SUM(IF(COUNT(A2:G2)=3,A2:G2,IF(COUNT(B2:G2)=3,B2:G2,IF(COUNT(C2:G2)=3,C2:G2,
IF(COUNT(D2:G2)=3,D2:G2,IF(COUNT(E2:G2)=3,E2:G2,"NA"))))))

简而言之,将总和从末尾的范围内计数为 3。

【讨论】:

    【解决方案4】:

    Newbee 警报:我知道这篇文章已经过时了,但是如果还有人在那里,我很想就 Dick 提供的公式的派生获得帮助,例如,我想对几行进行计数 [在这种情况下为 2]:

    =IF(COUNT(A1:G2)&lt;3,"NA",SUM(G2:INDEX(A1:G2,LARGE(COLUMN(A1:G2)*(A1:G2&lt;&gt;""),3))))

    最终,我试图将最后三个单元格的总和与运行 12 的数字相加

    [A:L=months of year] by several rows down [1:5=consecutive years].
    

    如果有人能解释一下,我将不胜感激。

    非常感谢:瑞恩

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2011-12-28
      相关资源
      最近更新 更多