【问题标题】:Not correctly summing column between all sheets in Workbook工作簿中所有工作表之间的列总和不正确
【发布时间】:2016-06-23 02:12:22
【问题描述】:

背景故事:我正在从 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

结束子

【问题讨论】:

  • 取出On Error,它会抛出什么错误?任何?还是它运行了,只是不准确?

标签: vba excel


【解决方案1】:

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

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() 等,您想明确说明您期望的工作表范围/要打开的单元格/列。否则,正如您所发现的,VBA 可能会返回一些意想不到的结果。

【讨论】:

  • 效果很好。我完全忘记了使用 With。
  • @CeFu - 不用担心!很高兴这是一个简单的修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多