根据条件

时间:2017-10-11 13:36:21

标签: vba excel-vba worksheet-function worksheet excel

我一直在努力想出这个,请看看是否有人可以给我一些指示。

我有一张工作表,我在其中列出了当天执行的活动(W栏),因此我每天都有一份报告。每个活动都有一个由下拉菜单(U列)中列出的字母定义的类型,例如:' R' R'对于'报告' ,' M' ' Meeting' 等,以及持续时间(小时)(HH:mm)(第S列)。

我希望我的工作表能够根据类型对活动的所有持续时间求和,并将结果存储在不同的单元格中。在附带的图片示例中,会议需要3:30小时,报告需要4:30小时,绘图需要2小时

以下SumIf代码的作用是对所有小时数求和,但是一旦持续时间是下一行中的时间与条件参数所在行的时间之间的差异,它就不会计算持续时间。 。

Sub test_count_hours()

Range("E35").Value = WorksheetFunction.SumIf(Range("U8:U37"), "R", Range("S8:S37"))

End Sub

所以我的努力​​是让代码在事件持续期间进行会计。

填充工作表的示例

enter image description here

1 个答案:

答案 0 :(得分:0)

如何将活动类型存储在数组中?您可以循环遍历每个活动,然后遍历每一行以检查活动类型,如果匹配,则在该行和下一行之间添加时间

Sub sumHours()
Dim activityList As Variant
Dim activity As Variant
Dim rowCount As Integer
Dim countHours As Date

activityList = Array("M", "R", "Dv")

Range("U5").Select
Range(Selection, Selection.End(xlDown)).Select
rowCount = Selection.Rows.Count

For Each activity In activityList
countHours = 0
    For i = 5 To rowCount + 5
        If Range("U" & i) = activity Then
            countHours = countHours + Range("S" & i + 1) - Range("S" & i)
        End If
    Next i

    Select Case activity
        Case Is = "M"
        Range("E35") = countHours

        Case Is = "R"
        Range("E36") = countHours

        Case Is = "Dv"
        Range("E37") = countHours
    End Select
Next activity
End Sub

(确保将保存时间值的单元格格式化为“Time”数据类型。