背景故事:我从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
答案 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可以返回一些意想不到的结果。