未正确汇总工作簿中所有工作表之间的列

时间:2016-06-22 16:58:34

标签: excel vba excel-vba

背景故事:我从PBX服务器上拔下电话记录。我正在调整&计算长途电话。我已经过滤掉了本地和免费电话号码。我按租户的名义将工作簿分成了工作表。我的下面的宏是格式化&计算持续时间的所有总和&该通话的总费用。

问题:我的宏没有正确选择所有电话呼叫行(我相信)。它能够正确计算第一张纸(我选择所有电话呼叫行),但当它移动到其他电话时,它无法正确计算它们全部。

完整错误表:

Start Time  Duration    Calling Name    Dialed Number    Cost 
6/1/2016 15:07  0:30:55 BLANK_I380            NUMBER     $3.72 
6/3/2016 12:26  0:05:40 BLANK_I380            NUMBER     $0.72 
6/6/2016 13:49  0:00:08 BLANK_I380            NUMBER     $0.12 
6/6/2016 13:50  0:00:08 BLANK_I380            NUMBER     $0.12 
6/6/2016 13:51  0:01:15 BLANK_I380            NUMBER     $0.12 
6/16/2016 8:29  0:01:42 BLANK_I380            NUMBER     $0.24 
Total Duration: 0:02:50                       Total Cost:    $0.72 

第一张正确的表格

Start Time  Duration    Calling Name    Dialed Number    Cost 
6/1/2016 9:20   0:00:09 BLANK Shining_I113  1313600000   $0.12 
6/1/2016 9:25   0:00:22 BLANK Shining_I113  1248600000   $0.12 
6/1/2016 9:26   0:00:54 BLANK Shining_I113  1248600000   $0.12 
Total Duration: 0:01:25                                 Total Cost:  $0.36 

代码

Sub FormatEntry()
Dim TotalCost As Double
Dim TotalTime As Double

For Each ws In ActiveWorkbook.Worksheets
             On Error Resume Next 'Will continue if an error results
    ws.Range("E:E").NumberFormat = "_-[$$-40B]* #,##0.00_ ;_-[$$-40B]* -#,##0.00 ;_-[$$-40B]* ""-""??_ ;_-@_ "
    ws.Range("A1").End(xlDown).Offset(1).Font.Bold = True
    ws.Range("A1").End(xlDown).Offset(1).Value = "Total Duration:"
    ws.Range("D1").End(xlDown).Offset(1).Font.Bold = True
    ws.Range("D1").End(xlDown).Offset(1).Value = "Total Cost:"
     ws.Range("E2").End(xlDown).Offset(1, 0).Value = _
     WorksheetFunction.Sum(Range("E2:E" & Cells.SpecialCells(xlLastCell).Row))
     ws.Range("B2").End(xlDown).Offset(1, 0).Value = _
     Format(WorksheetFunction.Sum(Range("B2:B" & Cells.SpecialCells(xlLastCell).Row)), "hh:mm:ss")
Next ws

End Sub

1 个答案:

答案 0 :(得分:1)

可能是由于您在Range()函数中Sum使用了 - 它没有引用工作表,因此可能会导致问题。试试这个:

Sub FormatEntry()
Dim TotalCost As Double
Dim TotalTime As Double

For Each ws In ActiveWorkbook.Worksheets
    On Error Resume Next     'Will continue if an error results
    With ws
        .Range("E:E").NumberFormat = "_-[$$-40B]* #,##0.00_ ;_-[$$-40B]* -#,##0.00 ;_-[$$-40B]* ""-""??_ ;_-@_ "
        .Range("A1").End(xlDown).Offset(1).Font.Bold = True
        .Range("A1").End(xlDown).Offset(1).Value = "Total Duration:"
        .Range("D1").End(xlDown).Offset(1).Font.Bold = True
        .Range("D1").End(xlDown).Offset(1).Value = "Total Cost:"
        .Range("E2").End(xlDown).Offset(1, 0).Value = _
        WorksheetFunction.Sum(.Range("E2:E" & .Cells.SpecialCells(xlLastCell).Row))
        .Range("B2").End(xlDown).Offset(1, 0).Value = _
        Format(WorksheetFunction.Sum(.Range("B2:B" & .Cells.SpecialCells(xlLastCell).Row)), "hh:mm:ss")
    End With
Next ws
End Sub

主要想法是任何时候您有Range()Cells()Columns()Rows()等您想要明确声明您期望Range / Cells / Columns打开的工作表。否则,正如您所发现的,VBA可以返回一些意想不到的结果。