【问题标题】:Time count based on condition基于条件的时间计数
【发布时间】:2017-10-11 13:36:20
【问题描述】:

我一直在努力解决这个问题,请看看是否有人可以给我一些指导。

我有一张工作表,其中记录了一天中执行的活动(W 列),所以我每天都有一份报告。每个活动都有一个由下拉菜单(U 列)中列出的字母定义的类型,例如:'R' 表示 'Reporting','M' 表示 'Meeting' em> 等,以及以小时为单位的持续时间 (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

所以我的努力​​是让代码在事件的持续时间内计算。

已填写的工作表示例

【问题讨论】:

  • 如果您需要代码方面的帮助,请将其包含在您的问题中。
  • 你需要SumIf,但是请提到@braX,发布你的代码或者你迄今为止尝试过的代码。
  • 你是对的@Moacir,我已经编辑了我的问题,我只是觉得它太简单了,甚至不能包含它,但我错了。
  • 现在你只需要让它遍历所有唯一的代码值,让它可以使用x = Application.WorksheetFunction.CountIf(rng, c),条件可以是If x = 1 Then 'do the sumif'

标签: vba excel worksheet-function worksheet


【解决方案1】:

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

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

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

【讨论】:

  • 看起来您的活动从第 5 行开始。如果不是,您将更改所选的初始单元格:)
  • 谢谢@Leroy,这正是我所需要的!当然也感谢所有其他人。
猜你喜欢
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2013-05-12
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多