2016-06-22 9 views
0

Backstory:私は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]* ""-""??_ ;[email protected]_ " 
    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

「On Error」を取り出すと、どのようなエラーがスローされますか?どれか?それとも、正確には実行されませんか? – BruceWayne

答えて

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]* ""-""??_ ;[email protected]_ " 
     .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が予期しない結果を返す可能性があります。

+1

素晴らしい作品です。私は完全にWithを使うのを忘れていました。 – CeFu

+0

@CeFu - 心配しないで!それは単純な修正だったのでうれしい – BruceWayne

関連する問題