如何使用空白单元格作为参考执行sumif?

请参阅下面的示例数据:

Time Date Result 00:21.6 10/1/2012 1:43 FALSE 01:47.7 10/1/2012 2:13 FALSE 00:56.7 10/1/2012 2:49 FALSE 00:54.9 10/1/2012 3:43 00:11.8 10/1/2012 3:43 02:10.9 10/1/2012 3:46 FALSE 01:05.4 10/1/2012 3:58 FALSE 00:55.8 10/1/2012 4:53 04:41.8 10/1/2012 4:52 00:26.3 10/1/2012 4:58 00:04.2 10/1/2012 4:58 00:15.3 10/1/2012 4:59 00:06.4 10/1/2012 4:57 00:10.7 10/1/2012 4:56 00:04.4 10/1/2012 4:56 00:04.2 10/1/2012 4:57 00:29.2 10/1/2012 4:57 00:34.5 10/1/2012 4:56 01:22.4 10/1/2012 4:55 00:08.1 10/1/2012 4:55 FALSE 03:20.9 10/1/2012 4:51 FALSE 00:56.3 10/1/2012 5:42 FALSE 02:23.1 10/1/2012 5:51 01:20.6 10/1/2012 5:48 00:09.8 10/1/2012 5:49 FALSE 01:40.0 10/1/2012 7:47 FALSE 01:13.4 10/1/2012 8:11 FALSE 00:41.6 10/1/2012 9:49 FALSE 01:08.1 10/1/2012 11:56 FALSE 

我需要执行某种types的计算。 如果结果中没有空白单元格,则需要结果旁边的时间单元格中的数据。 但是,如果结果列中有一个空白单元格,我需要在包含空白单元格的行和第一个包含空白单元格旁边的FALSE的单元格中执行时间总和。

请参阅下面的示例输出:

 00:21.6 10/1/2012 1:43 FALSE 00:21.6 01:47.7 10/1/2012 2:13 FALSE 01:47.7 00:56.7 10/1/2012 2:49 FALSE 00:56.7 00:54.9 10/1/2012 3:43 00:11.8 10/1/2012 3:43 02:10.9 10/1/2012 3:46 FALSE 03:17.6(ie, 00:54.9+00:11.8+02:10.9) 01:05.4 10/1/2012 3:58 FALSE 01:05.4 00:55.8 10/1/2012 4:53 04:41.8 10/1/2012 4:52 00:26.3 10/1/2012 4:58 00:04.2 10/1/2012 4:58 00:15.3 10/1/2012 4:59 00:06.4 10/1/2012 4:57 00:10.7 10/1/2012 4:56 00:04.4 10/1/2012 4:56 00:04.2 10/1/2012 4:57 00:29.2 10/1/2012 4:57 00:34.5 10/1/2012 4:56 01:22.4 10/1/2012 4:55 00:08.1 10/1/2012 4:55 FALSE 09:23.3(ie, 00:55.8+04:41.8+00:26.3+00:04.2+00:15.3+00:06.4+00:10.7+00:04.4+00:04.2+00:29.2+00:34.5+01:22.4+00:08.1) 03:20.9 10/1/2012 4:51 FALSE 03:20.9 00:56.3 10/1/2012 5:42 FALSE 00:56.3 02:23.1 10/1/2012 5:51 01:20.6 10/1/2012 5:48 00:09.8 10/1/2012 5:49 FALSE 03:53.5(ie, 02:23.1+01:20.6+00:09.8) 01:40.0 10/1/2012 7:47 FALSE 01:40.0 01:13.4 10/1/2012 8:11 FALSE 01:13.4 00:41.6 10/1/2012 9:49 FALSE 00:41.6 01:08.1 10/1/2012 11:56 FALSE 01:08.1 

如果可以通过任何公式或使用Visual Basic编辑器,请让我知道。 我现在正在手动执行此操作。 我每天要处理10000-15000行。 如果你帮我,我可以节省很多时间,并用它来学习新东西。

如果你喜欢使用VBA,你可以试试这个:

 Sub SmartRunningTotals() Dim rng As Range Dim cell As Range Dim lastRow As Long Dim totalTime As Double ' I'm assuming your time column is in column A lastRow = Range("A" & ActiveSheet.Rows.Count).End(xlUp).Row Set rng = Range("A2:A" & lastRow) For Each cell In rng totalTime = totalTime + cell.Value If cell.Offset(, 2).Value <> "" Then cell.Offset(, 3).Value = totalTime ' reset total after we write it to column D totalTime = 0 End If Next End Sub 

相当容易在两列。 如果上面的单元格不是空白的,计算一个运行总数并重置。

例如

(时间= H列,date=列I,结果= J列)

 Column N =IF(J1="",H2+N1,H2) =IF(J2="",H3+N2,H3) =IF(J3="",H4+N3,H4) =IF(J4="",H5+N4,H5) =IF(J5="",H6+N5,H6) Column O =IF(J2="","",O2) =IF(J3="","",O3) =IF(J4="","",O4) =IF(J5="","",O5) =IF(J6="","",O6) 

复制这些公式

假设数据从第1行开始,第1行的标题就可以在D2中使用这个公式

=IF(C2<>"",SUM(A$2:A2)-SUM(D$1:D1),"")

我假设你现有的范围从单元格A1开始(即在单元格A1中存在单词"Time" )。 我还假设在列C中,两个可能的值是逻辑值FALSE (不是文本string"FALSE" )或空白(不是一个或多个空格的string)。

在单元格D1中,input公式=IF(AND(C2=FALSE,C1=""),D1+1,1)

在单元格E1中,input公式=IF(C2="","",SUM(OFFSET(A2,-(D2-1),0,D2,1)))

将单元格E1中的数字格式设置为"mm:ss.0"

复制D1和E1一路下降你的范围。 如果需要,请隐藏D列。