なぜ「実行時エラー」の理解が重要なのか
業務効率化のためにVBAを作成していると、必ず直面するのが「実行時エラー」です。特に、シートのコピーや名前変更などの操作を行う際、既に同名のシートが存在したり、対象のファイルが削除されていたりすると、マクロは途中で停止してしまいます。
今回のテーマである「個別精算書の自動作成」において、エラーを放置することは、データの中途半端な作成や、不必要なシートの残存を招きます。エラーを想定し、それを回避または制御するロジックを組むことこそが、実務で安心して使えるマクロの第一歩です。
基礎知識:Excelの制約とエラーの仕組み
Excelには「同じブック内に同じ名前のシートは存在できない」という絶対的なルールがあります。マクロでシートを新規作成し、特定の名前(例:「新精算書」)に変更しようとした際、その名前が既に存在していると、VBAは「1004番:アプリケーション定義またはオブジェクト定義のエラー」を吐いて停止します。
初心者が陥りやすいのは、このエラーが出た際に「コードが間違っている」と悩み続けることですが、実際には「システム上の制約」をコード側で検知できていないことが原因です。
実装:エラーを発生させないための設計思想
エラーを回避するためには、処理を実行する前に「その対象が存在するかどうか」をチェックする、あるいは「既存のシートがあれば削除してから作成する」といった予防策を講じます。これにより、マクロが途中で止まらず、安定して動作するようになります。
サンプルプログラム:安全なシート作成のコード例
以下は、同名シートがある場合に自動で削除してエラーを防ぐ、実務で使えるプログラミング例です。
Sub CreateNewStatement()
Dim targetSheetName As String
targetSheetName = “新精算書”
‘ 画面更新を停止して処理速度を向上
Application.ScreenUpdating = False
‘ 既に同名のシートが存在するかチェック
On Error Resume Next ‘ エラーが発生しても無視して次の行へ
Application.DisplayAlerts = False ‘ 削除時の確認メッセージを非表示
Worksheets(targetSheetName).Delete
Application.DisplayAlerts = True
On Error GoTo 0 ‘ エラー監視を元に戻す
‘ 新規シートを作成して名前を変更
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = targetSheetName
‘ 画面更新を再開
Application.ScreenUpdating = True
MsgBox “精算書シートの作成が完了しました。”
End Sub
応用・注意点:現場で役立つエラーハンドリング
1. Application.DisplayAlertsの活用: シート削除時に表示される「完全に削除しますか?」という警告は、自動化を阻害します。これをFalseにすることで、ユーザーの操作を介さずにマクロを完走させることが可能です。
2. On Error Resume Nextの使いどころ: この命令は「エラーを無視する」強力な武器ですが、多用すると重大なバグを見逃す原因になります。今回のコードのように、「削除できるなら削除する」という局所的な処理に限定して使用するのが鉄則です。
3. 終了処理の徹底: マクロが途中で失敗した場合、非表示にしたはずのシートが画面に残ってしまうことがあります。常に「どの状態なら成功か」を意識し、失敗した際の状態をクリーンに保つコードを心がけましょう。
