VBAテクニック集 VBA一覧 エラーハンドリング・処理制御 デバッグ・エラー処理

【VBA】Descriptionプロパティとは?エラー内容を正確に扱う実務必須知識

Excel VBAでマクロを開発していると、
「エラーが出たのは分かるが、原因の特定に時間がかかる
「On Error で止めているのに、ログに残らず再現できない
といった悩みに必ず直面します。

こうした問題の多くは、
エラーを“数値”だけで扱い、“内容”を活かしていない
ことが原因です。

そこで重要になるのが、
Descriptionプロパティです。

この記事では、VBAの Description プロパティについて、

  • 基本的な役割
  • Err.Number との違い
  • 実務でのコード設計例
  • RPA(UiPath)連携を意識した使い方

まで、実コード付きで深掘りして解説します。

✅ Descriptionプロパティとは何か

※ここを曖昧に理解したまま進むと、「エラー処理が形だけのVBA」になります。

・Descriptionプロパティの役割を正しく理解する

Description プロパティは、
発生したエラーの内容を文章として保持するプロパティです。

VBAでエラーが発生すると、
Err オブジェクトに以下のような情報が自動で格納されます。

  • Err.Number:エラー番号(数値)
  • Err.Description:エラー内容(文章)
  • Err.Source:発生元(場合による)

この中で、
人が見て原因を判断できる情報Description です。


・Err.Numberとの決定的な違い

Err.Number は「判定用」、
Description は「説明用」と考えると分かりやすいです。

On Error GoTo ErrHandler

Dim x As Integer
x = 10 / 0

Exit Sub

ErrHandler:
Debug.Print Err.Number
Debug.Print Err.Description

この場合、

  • Err.Number:11
  • Err.Description:0 で除算しました

というように、
数値と文章で役割が分かれて取得されます。

実務では

  • 分岐・制御 → Err.Number
  • ログ・通知 → Err.Description

という使い分けが基本です。


✅ Descriptionがセットされるタイミング

※「なぜ空白になるのか分からない」人は、ここが原因です。

・エラー発生時のみ自動セットされる

Description は、
エラーが実際に発生した瞬間にのみセットされます。

Debug.Print Err.Description  ' ← エラーがなければ空文字

これは正常な挙動であり、
「取得できない」のではなく
エラーが起きていないだけです。


・Err.Clear によるリセットに注意

Err.Clear を実行すると、
Err オブジェクトの情報はすべて消去されます。

On Error GoTo ErrHandler

Dim x As Integer
x = 10 / 0

Exit Sub

ErrHandler:
Err.Clear
MsgBox Err.Description  ' ← ここでは空になる

Descriptionを使う前に Clear してしまう
これは実務で非常に多いミスです。


✅ Descriptionを取得する基本的なエラー処理構造

※この形を覚えておくと、ほぼすべてのVBAで応用できます。

・On Error GoTo を使った基本パターン

Sub Sample()
    On Error GoTo ErrHandler

    ' 通常処理
    Dim x As Integer
    x = 10 / 0

    Exit Sub

ErrHandler:
    MsgBox "エラーが発生しました:" & vbCrLf & Err.Description
End Sub

この構造では、

  • エラー発生
  • Err.Description を即取得
  • ユーザーに通知

という流れが明確になります。

参考:【VBA】GoToステートメントの理解と使用方法




✅ ユーザー向け・開発者向けで使い分ける

※Descriptionをそのまま表示すると、逆に混乱を招くことがあります。

・ユーザー向けに整形する例

MsgBox "処理中に問題が発生しました。" & vbCrLf & _
       "管理者に連絡してください。"

・開発者向けログに使う例

Debug.Print "Error:" & Err.Number & " / " & Err.Description

表示と記録を分ける設計が、
実務では非常に重要です。


✅ Err.RaiseとDescriptionの関係

※業務ルールエラーを表現したい場合は必須知識です。

・独自エラーを作るコード例

If Cells(1, 1).Value = "" Then
    Err.Raise 1001, , "必須項目が入力されていません。"
End If

このようにすると、
Description に 自分で定義したエラーメッセージが入ります。

これにより、

  • 入力不備
  • 業務条件違反

といった「VBA独自の意味」を
エラーとして扱えるようになります。

参考:【VBA】Boolean型とは?True/Falseの使い方と実務での注意点を徹底解説


✅ Descriptionをログ出力に活用する実務例

※保守・問い合わせ対応で圧倒的に差が出ます。

・ログ用シートに記録する例

With Worksheets("Log")
    .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Now
    .Cells(.Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Err.Number
    .Cells(.Rows.Count, 3).End(xlUp).Offset(1, 0).Value = Err.Description
End With

これだけで、
「いつ・どんなエラーが起きたか」
を後から正確に追えるようになります。


✅ RPA(UiPath)連携を意識したDescription設計

※VBA単体で完結しない現場では特に重要です。

UiPathなどのRPAからExcelマクロを呼び出す場合、

  • VBA側:Descriptionに原因を残す
  • RPA側:ログ・通知に反映

という構成がよく使われます。

Descriptionが適切であれば、
RPA側で「原因不明エラー」になりません。


✅ よくある勘違いと失敗例

※中級者でも意外とやりがちです。

・Descriptionの文言で条件分岐してしまう

Descriptionは

  • OS
  • Excelの言語設定

に依存します。

If Err.Description = "Object variable not set" Then

このようなコードは、
環境が変わると即壊れます。

分岐は必ず Err.Number を使いましょう。


✅ まとめ:VBAのDescriptionプロパティを実務で活かす考え方

  • Descriptionはエラー内容を文章で保持するプロパティ
  • 判定は Err.Number、説明は Description
  • Err.Clear の位置に注意する
  • 独自エラーでは Err.Raise と組み合わせる
  • ログ・RPA連携で真価を発揮する

Descriptionプロパティを正しく使えるようになると、
VBAは
「動けばOKのマクロ」から「保守できる業務ツール」
へ一段階レベルアップします。

エラーを隠すのではなく、
エラーを“情報として設計する”
この視点を、ぜひ実務に取り入れてみてください。

参考:【VBA】エラーハンドリングの基本と実務で使えるオープンエラーハンドリング徹底解説

    -VBAテクニック集, VBA一覧, エラーハンドリング・処理制御, デバッグ・エラー処理