VBA重复总结小时直到某个标准

时间:2016-12-08 10:30:03

标签: excel vba excel-vba macros

我有一个包含6列的表格。 [ID,状态,开始时间,结束时间,小时,总结]

Table Example

我计算了开始时间和结束时间之间的总时数。 现在我必须算上这个小时的总结。 问题是,总结必须计入特殊范围,从状态"发货"直到状态"检查"只是第一次出现。然后重复使用"发货"直到"检查"为下一个ID。

Sub SUMUP()
   Dim LastRow As Long
   LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

   For i = 2 To LastRow
      Cells(i, 6).Value = WorksheetFunction.SumIf(Range("A2:A" & LastRow), Range("A" & i), Range("E2:E" & LastRow))

  Next

End Sub

我有这段代码来总结一下总时数。如何为我的案例编写VBA代码?

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

试试这个:

Sub SUMUP()
    Dim LastRow As Long
    LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

    For i = 2 To LastRow
        If Range("B" & i).Value = "Shipped" Then
            For j = i To LastRow
                If Range("B" & j).Value <> "Checked" Then
                    Sum = Sum + Range("E" & j).Value
                Else
                    Range("F" & j).Value = Sum
                    Exit For
                End If
            Next j
            i = j
            Sum = 0
        End If
    Next i

End Sub

答案 1 :(得分:0)

如果订单状态按正确的顺序排序,则可以使用此公式:

=SUMIF(INDIRECT("A"&MATCH(A2,A:A,0)&":A"&ROW(A2)),A2,INDIRECT("E"&MATCH(A2,A:A,0)&":E"&ROW(A2)))

这将是一个vba解决方案

Sub SUMUP()
    Dim LastRow As Long
    Dim hours As Integer
    Dim ID As Integer
    Dim checked As Boolean

    LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

    ID = Cells(2, 1).Value
    For i = 2 To LastRow
         If ID = Cells(i, 1).Value Then
             If Cells(i, 2).Value <> "checked" And checked = False Then
                 hours = Cells(i, 6).Value + hours
                 Cells(i, 10).Value = hours
             ElseIf Cells(i, 2).Value = "checked" And checked = False Then
                 checked = True
                 hours = Cells(i, 6).Value + hours
                 Cells(i, 10).Value = hours
             End If
         Else

             ID = Cells(i, 1).Value
             checked = False
             hours = 0
         End If
    Next

End Sub

答案 2 :(得分:0)

或数组

=SUM(INDIRECT(("f"&MIN(IF((($A$1:$A$10="ID")*($B$1:$B$10="shipped")),ROW($A$1:$A$10)))&":"&"f"&MIN(IF((($A$1:$A$10=1)*($B$1:$B$10="checked")),ROW($A$1:$A$10))))))

答案 3 :(得分:0)

为了完整起见,我相信这个非数组公式应该有效: -

=IF(AND(B2="checked",COUNTIFS(A$1:A2,A2,B$1:B2,"checked")=1),C2-INDEX(C$2:C$10,MATCH(A2&"shipped",INDEX(A$2:A$12&B$2:B$12,0),0)),"")

它只是从第一个检查的日期时间中减去发货的日期时间。

乘以24以获得数小时的时间。