【问题标题】:Using SUMIFS to add time duration always gives 00:00:00使用 SUMIFS 添加持续时间总是给出 00:00:00
【发布时间】:2013-03-02 06:48:07
【问题描述】:
Sub Add_sumf()
Dim i As Integer
i = 3
Dim cellDate As Integer
cellDate = 0
Dim cellDate1 As Date
cellDate1 = TimeValue("00:00:00")
Dim total    As Integer
total = 0
Dim j As Integer
j = 2
Dim k As Integer
k = 2
Set aa = Workbooks("Book3").Worksheets(1)
Set bb = Workbooks("Final_result").Worksheets(1)
Do While bb.Cells(1, k).Value <> ""

    For Each y In bb.Range("A:A")
    On Error GoTo Label

    If UCase(bb.Cells(j, "A").Value) <> "" Then


     cellDate1 = WorksheetFunction.SumIfs(aa.Range("F:F"), aa.Range("B:B"), UCase(bb.Cells(1, k).Value), aa.Range("G:G"), UCase(bb.Cells(j, "A").Value))                         
    bb.Cells(j, k).Value = TimeValue(cellDate1)

    cellDate1 = TimeValue("00:00:00")
    bb.Cells(j, k).NumberFormat = "[h]:mm:ss"

    On Error GoTo Label

    j = j + 1
    Else
    Exit For
    End If
    Next
    j = 2
    k = k + 1
 Loop
Label:
    'MsgBox Err.Description
    Exit Sub


End Sub

我使用上面的代码根据其他两列的值添加持续时间,但结果总是 00:00:00。

如果我使用下面的代码,我会得到答案,但它太慢非常慢

Sub add_it_time()
Dim i As Integer
i = 3
Dim cellDate As Integer
cellDate = 0
Dim cellDate1 As Date
cellDate1 = TimeValue("00:00:00")
Dim total    As Integer
total = 0
Dim j As Integer
j = 2
Dim k As Integer
k = 2
Set aa = Workbooks("Book3").Worksheets(1)
Set bb = Workbooks("Final_result").Worksheets(1)
Do While bb.Cells(1, k).Value <> ""
 'MsgBox bb.Cells(1, k).Value
    For Each y In bb.Range("A:A")
    On Error GoTo Label
   ' MsgBox UCase(bb.Cells(j, "A").Value)
    If UCase(bb.Cells(j, "A").Value) <> "" Then

        For Each x In aa.Range("F:F")
        On Error Resume Next
        If UCase(aa.Cells(i, "B").Value) = UCase(bb.Cells(j, "A").Value) Then
       ' MsgBox aa.Cells(i, "F").Text
       ' total = total + Int(get_Second(aa.Cells(i, "F").Text))
        If UCase(aa.Cells(i, "G").Value) = UCase(bb.Cells(1, k).Value) Then
         'MsgBox aa.Cells(i, "F").Text
        cellDate1 = cellDate1 + TimeValue(aa.Cells(i, "F").Value)
        End If
        End If
        i = i + 1
        Next
        i = 3
        On Error GoTo Label
         bb.Cells(j, k).NumberFormat = "h:mm:ss"
        bb.Cells(j, k).Value = WorksheetFunction.Text(cellDate1, "[hh]:mm:ss")
        total = 0
        cellDate1 = 0
    j = j + 1
    Else
    Exit For
    End If
    Next
    j = 2
    k = k + 1
 Loop
Label:
    'MsgBox Err.Description
    Exit Sub
End Sub

包含日期的源列是通用格式 我是 VBA 宏的新手

【问题讨论】:

  • 知道上面的代码有什么问题吗?
  • 对于您的“慢”解决方案,您不应循环列中的所有单元格 - 查看UsedRange 属性。

标签: vba excel xls


【解决方案1】:

更新的解决方案:

在与 OP 聊天讨论后,决定纯公式解决方案很好 - 以下是要在 单独 表上执行的公式/操作,从 A1 开始:

  1. A 行将生成表格标题:在A1 中,我添加了Agent Name / Release Code,从B1 开始,有一个所有可用Release Code 值的列表(使用Remove Duplicates 很容易获得)。
  2. 为了简单和有效,我定义了以下命名范围(因为初始数据不是静态的):AgentNames=OFFSET('Agent State'!$B$2,0,0,COUNTA('Agent State'!$B:$B)-1,1) - 这将返回初始工作表上的名称范围不包括标题; TimeInStateData=OFFSET(AgentNames,0,4)ReleaseCodes=OFFSET(AgentNames,0,5) 移动了 AgentNames 范围。
  3. A 列中,我们应该获得应该是唯一的名称列表,因此在A 列中选择不小于唯一名称数量的任意数量的单元格 - 对于我使用A2:A51 的示例,然后键入该公式:=IFERROR(INDEX(AgentNames,SMALL(IF(MATCH(AgentNames,AgentNames,0)=ROW(INDIRECT("1:"&amp;ROWS(AgentNames))),MATCH(AgentNames,AgentNames,0),""),ROW(INDIRECT("1:"&amp;ROWS(AgentNames))))),"") 并按 CTRL+SHIFT+ENTER 而不是通常的 ENTER - 这将定义一个Multicell ARRAY 公式,并在其周围产生{} 大括号(但请不要手动输入它们!)。李>
  4. B2: =IF(OR($A2="",SUMPRODUCT(--($A2=AgentNames),--(B$1=ReleaseCodes),TIMEVALUE(TimeInStateData))=0),"",SUMPRODUCT(--($A2=AgentNames),--(B$1=ReleaseCodes),TIMEVALUE(TimeInStateData))) - 普通公式,将返回空名称或零时间的空值。
  5. 将公式从B2 复制到整个表格。

备注:

  • 时间值总和的结果范围应格式化为Time
  • 如果将来要扩展名称列表 - 对新范围重复第 3 步,但不要向下拖动公式 - 这将导致 You cannot change part of an array 错误。

示例文件:https://www.dropbox.com/s/quudyx1v2fup6sh/AgentsTimeSUM.xls

初步回答:

也许这太简单明了,但乍一看我不明白为什么你有那行代码:

cellDate1 = TimeValue("00:00:00")

就在您的SUMIFS 之后:cellDate1 = WorksheetFunction.SumIfs(aa.Range("F:F"), ...

尝试删除您为cellDate1 分配零的第一个。

【讨论】:

  • 我评论了那个。如果你在我使用 timeValue() 并添加使用 for 循环时看到我的第二个代码,它就可以工作。是不是我的来源有不同的格式?实际上,我必须汇总员工白天的总休息时间,因此我必须在“A”列中为特定名称添加持续时间在“F”列中,并在“G”列中添加特定休息代码
  • @amar 很高兴看到您的数据样本或最好的文件(至少是其相关部分)
  • dropbox.com/s/oulw9isfks5l71m/Book3.zip?m dwnload 链接我必须为“G”中的每个值合计“F”中的值,其中名称来自“B”
  • @amar 汇总数据的目标范围是多少?
  • 我在另一张表中显示总数,其中第一列中的所有名称(唯一)和第一行中的所有中断代码。我必须在十字路口显示总价值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2011-06-27
  • 2015-02-25
相关资源
最近更新 更多