2013-03-02 91 views
1
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作爲結果。使用SUMIFS添加持續時間始終給出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 

其中包含最新的源列是一般FORMATT 的我是新來的VBA宏

+0

任何想法在上面的代碼中有什麼錯誤? – amar 2013-03-02 06:54:04

+1

對於你的「慢」解決方案,你不應該循環列中的所有單元格 - 看着'UsedRange'屬性。 – 2013-03-02 09:14:32

回答

3

更新的解決方案:

經與OP討論後,決定純配方解決方案是好的 - 下面是在單獨片材起始A1

  1. 行A將被生成的表頭:在A1我加入Agent Name/Release Code,和起始B1有(容易得到使用Remove Duplicates)所有可用Release Code值的列表。
  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:"&ROWS(AgentNames))),MATCH(AgentNames,AgentNames,0),""),ROW(INDIRECT("1:"&ROWS(AgentNames))))),"")並按CTRL + SHIFT + ENTER 代替通常的ENTER - 這將定義一個多節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")

right after your SUMIFScellDate1 = WorksheetFunction.SumIfs(aa.Range("F:F"), ...

嘗試刪除第一個將零分配給cellDate1的位置。

+0

不是案件無效 – amar 2013-03-02 08:27:07

+0

你是否刪除了那一個? http://floomby.ru/s1/jamrrt – 2013-03-02 09:12:45

+0

我評論說,一個。如果你看到我的第二個代碼,當我使用timeValue()並添加使用循環它的作品。是我的來源有不同的格式?實際上,我必須總結一天中員工的總休息時間,因此我必須在列「F」中爲列A中的特定名稱添加持續時間,並在列「G」中添加特定中斷代碼 – amar 2013-03-02 09:16:27