【VBAリファレンス|実務向け】第5回 個別精算書をマクロで作成する 4/5:エラーを恐れず「例外処理」の重要性を学ぶ

スポンサーリンク

なぜ「実行時エラー」の理解が重要なのか

業務効率化のために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. 終了処理の徹底: マクロが途中で失敗した場合、非表示にしたはずのシートが画面に残ってしまうことがあります。常に「どの状態なら成功か」を意識し、失敗した際の状態をクリーンに保つコードを心がけましょう。

タイトルとURLをコピーしました