【问题标题】:Excel problem with sum if formula and its range如果公式及其范围求和的Excel问题
【发布时间】:2019-04-24 05:35:56
【问题描述】:

我的工作表中有这个设置:

  A        B     C           D          E        F
1 11-apr   1pm   2pm         START      END      TOTAL
2          2pm   3pm         11-apr     14-apr   8,50 h
3          6pm   7pm         15-apr     25-apr   ....
4          7pm   8pm
5 14-apr   10am  11am
6          12am  12:30am
7          2pm   3pm
8          3pm   5pm
9 15-apr   1pm   3pm
10         6pm   7pm
...

我需要做以下事情:

以 D2 和 E2 为起点,计算 4 月 11 日至 4 月 14 日之间每天花费的小时数,并将总数写入 F2。 我无法修改我的工作表,并且我不想为引用值创建隐藏单元格,因为我不想弄乱我的 Excel 表。

我正在寻找的是,因为我有一些编程技能,所以在 A:A 单元格之间执行一个 for 循环,并从“11-apr”(在本例中为 A1)所在的行开始,一直到我找到了“14-apr”并在第二天单元格之前停止(所以在 A8 处)。我也更喜欢不制作宏,因为它需要在 D 和 E 列方面是动态的。 A中的日期是随机的,所以没有办法提供下一天的到来。

我问你这是否可以在单元格 F2 中的一个公式中实现。

我所做的是寻找参考。 “11-apr”和“14-apr”的行,然后在数组公式中找到哪些单元格不为空(如 INT(A:A<>"") )并使用返回的数组我想从“11-apr”行直到next-non-empty-cell-after-"14-apr"-row 减 1(直到 "15-apr" row - 1 ),即数组中的下一个非 0(非 FALSE)值 AFTER 行 "14-apr" " 减 1。我将很多公式与 MATCH、INDEX、LARGE 结合起来获取第 n 个元素但没有用。

希望我已经足够清楚了,在此先感谢!

附:我正在使用 Excel for Mac,以防万一知道有用!

【问题讨论】:

  • 与其告诉我们您尝试了什么,强迫我们尝试重构您的公式,不如向我们展示您尝试了什么。也就是说,请edit your question给我们你使用的公式
  • 你愿意使用自定义的 vba 函数吗?
  • 时间 1pm 是字符串还是以这种方式格式化的时间?
  • 不用担心格式,我对日期列没问题。我描述了我尝试过的东西,没有有效的解决方案,也没有有效的尝试,我不能这样做,这就是我在这里问的原因。我在 Excel for Mac 上,我不太了解它,所以我不知道 vba 函数是否适合我……如果可能的话,我更喜欢公式
  • 您可以在一个公式中完成此操作,但这会非常复杂。我会写 vba

标签: excel excel-formula


【解决方案1】:

这些非易失性公式数组基于@OverflowStacker 方法来识别Target Range,它们使用INDEX 而不是INDIRECT

FormulaArrays 输入按 CTRL + SHIFT + ENTER 同时,你会看到公式如果输入正确,则包裹在 {} 之间。

这篇文章验证了提供的日期:

=IF( Start > End, "!Err",

这是FormulaArray 用于根据StartEnd 提供的时间获得加法时间:

= SUM(
INDEX( Column.End , MATCH( MIN( IF( Range.Dates >= Start, Range.Dates ) ), Column.Dates , 0 ) ) :
INDEX( Column.End , MATCH( MIN( IF( Range.Dates > End, Range.Dates ) ), Column.Dates , 0 ) - 1 ),
-INDEX( Column.Start , MATCH( MIN( IF( Range.Dates >= Start, Range.Dates ) ), Column.Dates , 0 ) ) :
INDEX( Column.Start , MATCH( MIN( IF( Range.Dates > End, Range.Dates ) ), Column.Dates , 0 ) - 1 ) ) )

StartEndTotal 时间可以表示为 TimeSerialDouble(例如分别为 12:30 AM0.5

下表显示了根据所需时间格式使用的公式:

应用公式:

  1. 表1显示的时间为TimeSerial

一个。总计为TimeSerial:在I7 中输入此ArrayFormula,然后向下复制(单元格编号格式为[hh]:mm

= IF( $G7 > $H7, "!Err", SUM(
  INDEX($E:$E, MATCH( MIN( IF( $C$7:$C$27 >= $G7, $C$7:$C$27 ) ),$C:$C, 0 ) ) :
  INDEX($E:$E, MATCH( MIN( IF( $C$7:$C$27 > $H7, $C$7:$C$27 ) ),$C:$C, 0 ) - 1 ),
- INDEX($D:$D, MATCH( MIN( IF( $C$7:$C$27 >= $G7, $C$7:$C$27 ) ),$C:$C, 0 ) ) :
  INDEX($D:$D, MATCH( MIN( IF( $C$7:$C$27 > $H7, $C$7:$C$27 ) ),$C:$C, 0 ) - 1 ) ) )  

b.总计为Double:在J7 中输入此ArrayFormula,然后向下复制(单元格编号格式为0.?? "Hrs."

= IF( $G7 > $H7, "!Err", 24 * SUM(
  INDEX($E:$E, MATCH( MIN( IF( $C$7:$C$27 >= $G7, $C$7:$C$27 ) ),$C:$C, 0 ) ) :
  INDEX($E:$E, MATCH( MIN( IF( $C$7:$C$27 > $H7, $C$7:$C$27 ) ),$C:$C, 0 ) - 1 ),
- INDEX($D:$D, MATCH( MIN( IF( $C$7:$C$27 >= $G7, $C$7:$C$27 ) ),$C:$C, 0 ) ) :
  INDEX($D:$D, MATCH( MIN( IF( $C$7:$C$27 > $H7, $C$7:$C$27 ) ),$C:$C, 0 ) - 1 ) ) )  
  1. 表1显示的时间为Double

一个。总计为Double:在S7 中输入此ArrayFormula,然后向下复制(单元格编号格式为0.?? "Hrs."

= IF( $Q7 > $R7, "!Err", SUM(
  INDEX($O:$O, MATCH( MIN( IF( $M$7:$M$27 >= $Q7, $M$7:$M$27 ) ),$M:$M, 0 ) ) :
  INDEX($O:$O, MATCH( MIN( IF( $M$7:$M$27 > $R7, $M$7:$M$27 ) ),$M:$M, 0 ) - 1 ),
- INDEX($N:$N, MATCH( MIN( IF( $M$7:$M$27 >= $Q7, $M$7:$M$27 ) ),$M:$M, 0 ) ) :
  INDEX($N:$N, MATCH( MIN( IF( $M$7:$M$27 > $R7, $M$7:$M$27 ) ),$M:$M, 0 ) - 1 ) ) )  

b.总计为TimeSerial:在T7 中输入此ArrayFormula,然后向下复制(单元格编号格式为[hh]:mm

= IF( $Q7 > $R7, "!Err", 1/24 * SUM(
  INDEX($O:$O, MATCH( MIN( IF( $M$7:$M$27 >= $Q7, $M$7:$M$27 ) ),$M:$M, 0 ) ) :
  INDEX($O:$O, MATCH( MIN( IF( $M$7:$M$27 > $R7, $M$7:$M$27 ) ),$M:$M, 0 ) - 1 ),
- INDEX($N:$N, MATCH( MIN( IF( $M$7:$M$27 >= $Q7, $M$7:$M$27 ) ),$M:$M, 0 ) ) :
  INDEX($N:$N, MATCH( MIN( IF( $M$7:$M$27 > $R7, $M$7:$M$27 ) ),$M:$M, 0 ) - 1 ) ) )  

【讨论】:

  • 不错的一个。很高兴知道,您可以使用 INDEX 构建地窖。
  • 我刚刚尝试完您的答案,效果非常好!我在使用 Excel 2011 时遇到了一些困难,因为在使用 INDIRECT 设置后,它在修改函数后不断崩溃,不知道为什么。我不知道你可以用INDEX 构建celladdress(我确定我试过了,但没有成功......也许我做错了什么)。也感谢您对日期数据类型的支持,但这是不必要的,还是谢谢您。我更喜欢你的解释清晰和示例支持的答案(我想准确地说,OverflowStacker 的答案也解决了我的问题!)感谢两者!
  • @pippo INDIRECT 是一个所谓的 volatile 函数。每当您在工作簿中执行某些操作(例如修改或删除单元格)时,它总是会被计算出来。它不应该导致崩溃。 :D
  • 我不知道为什么,但是在使用该公式之后,Excel 不断崩溃……在昨天之前,我从来没有遇到过这样的问题。每当我将数据插入工作表时,我注意到响应时间要慢得多,如果我这样做:插入数组公式,按 meta+enter 并返回指向该单元格以修改我的公式,Excel 崩溃!我认为INDIRECT 很耗时,正如您在回答中对我所说的那样……如果我在编写公式并按下回车后稍等片刻,它就不会崩溃……试图找出原因
  • INDIRECT 可能对崩溃“间接”负责,请记住FormulaArray 中的波动性,并且可能是具有大量计算的工作簿。
【解决方案2】:

嗯,一个解决方案是 ARRAY FORMULA CTRL+SHIFT+ENTER

    =SUMPRODUCT(INDIRECT("C"&MATCH(MIN(IF($A$1:$A$12>E4,$A$1:$A$12)),A:A,0)-1&":C"&MATCH(MIN(IF($A$1:$A$12>=D4,$A$1:$A$12)),A:A,0))-INDIRECT("B"&MATCH(MIN(IF($A$1:$A$12>E4,$A$1:$A$12)),A:A,0)-1&":B"&MATCH(MIN(IF($A$1:$A$12>=D4,$A$1:$A$12)),A:A,0)))

但它使用INDIRECT,这在大型数据库上可能会很慢。绿色单元格包含公式。

我之前添加了一个日期。您还可以输入表格中没有出现的日期。

我跳过了ampm,但如果单元格被正确格式化为日期应该没有问题。

【讨论】:

  • 感谢您的回答!我测试了它,它工作得很好,我不知道INDIRECT 功能,非常感谢!我会根据我的需要调整您的公式,以便在 B 列中也达到空白值时停止(因为在某些时候我的数据集在最后一个旁边没有任何其他日期的情况下停止),引入这个公式:IF.ERROR(MATCH(MIN(IF($A:$A>E4;$A:$A));$A:$A);MATCH(TRUE;LEN(B:B)=0;))(没问题有了大数据库,我很幸运那是一个小数据库!)。谢谢!
  • 啊,我只在SUM 中更改了SUMPRODUCT 函数。我需要在这里使用SUMPRODUCT 有什么特别的原因吗?
  • 我从另一种方法开始,然后把它留在那里。后来我想,SUM 就足够了,但我认为没有必要改变。也许这只是表明我对SUMPRODUCT 的喜爱程度超过了其他任何东西。 :D
  • 一种识别target 范围的智能方法,我正在使用它来提出一个使用INDEX 而不是INDIRECT` 的非易失性公式
  • @EEM 好吧,我不是聪明人。 :) 我刚从here 拿走了它。不过是德语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多