不能在工作簿中的所有工作表之间正确求和

Backstory:我从PBX服务器上取下电话logging。 我正在调整和计算长途电话。 我已经过滤了本地和免费电话号码。 我把工作簿按租户的名字分成几张。 我下面的macros正在格式化和计算所有的时间和总费用的总和。

问题:我的macros没有正确select所有的电话行(我相信)。 它能够正确地计算出第一张(我select所有的电话行),但是当它移动到其他人时,它不能正确地将它们总和。

准确的错误表:

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 

结束小组

这可能是由于你在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可以返回一些意想不到的结果。