このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

【VBA】Err.Raiseメソッドの使い方を解説

2024年4月15日

今回はErr.Raiseメソッドについて解説します。 (Errオブジェクト)

Err.Raiseメソッドは自らエラーを発生させるメソッドになります。

あまりプログラムに慣れてない人にとっては、どうしてわざわざエラーを発生させるの?と疑問に思うかもしれません。

このメソッドのポイントは呼び出されたプロシージャ内でエラーを投げることにあります。

サンプルコードとともに説明するので、じっくりとご覧ください。

この記事では↓の内容が分かります。

  • Err.Raiseメソッドの使い方
  • Err.Raiseメソッドでエラーを投げる目的

VBAが難しいと感じたら
プロにお任せして代わりに作ってもらうのはいかがでしょうか?
マクロの作成請負をしていますので、こちらからご相談ください。

Err.Raiseメソッドの使い方

Sub Sample1()
    Err.Raise Number:=513, Description:="エラーが発生しました"
End Sub
独自エラー

サンプルコードを実行すると画像のような独自のエラーが発生します。

Err.Raiseメソッドの引数は↓のようになり、Number(エラー番号)については513~65535が使えます。

基本的にNumber(エラー番号)とDescription(説明)を記載して独自のエラーを発生させます。(エラー番号以外は省略可能です)

Err.Raise number, source, description, helpfile, helpcontext
引数説明
number必須です。 エラーの性質を識別する長整数型 (Long) です。 Visual Basic エラー (Visual Basic 定義エラーとユーザー定義エラーの両方) は、0 から 65535 の範囲にあります。 範囲 0 から 512 はシステム エラー用に予約されています。範囲 513 から 65535 は、ユーザー定義エラーに使用できます。Numberプロパティをクラス モジュールの独自のエラー コードに設定する場合は、エラー コード番号をvbObjectError定数に追加します。 たとえば、エラー番号513 を生成するには、vbObjectError+ 513 をNumberプロパティに割り当てます。
source省略可能。 エラーを生成したオブジェクトまたはアプリケーションの名前を示す文字列式です。Sourceプロパティをオブジェクトに対して設定する場合、project.classの形式を使用します。sourceを指定しない場合、現在の Visual Basicプロジェクトのプログラム ID が使用されます。
description省略可能。 エラーを説明する文字列式です。 指定しない場合、Numberの値が調べられます。 Visual Basic の実行時エラー コードにマップできる場合、Error関数によって返される文字列がDescriptionとして使用されます。Numberに対応する Visual Basic エラーがない場合、"アプリケーション定義またはオブジェクト定義のエラーです。" というメッセージが使用されます。
helpfile省略可能。 このエラーに関するヘルプを確認できるヘルプ ファイルへの完全修飾パスです。 指定しない場合、Visual Basic では、完全修飾された、Visual Basic ヘルプ ファイルのドライブ、パス、およびファイル名が使用されます。HelpFileを参照してください。
helpcontext省略可能。 エラーに関するヘルプを提供するhelpfile内のトピックを識別するコンテキスト ID です。 省略した場合、Numberプロパティに対応するエラーに応じた、Visual Basic ヘルプ ファイルのコンテキスト ID が使用されます (存在する場合)。HelpContextを参照してください。
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/raise-method

Err.Raiseメソッドでエラーを投げる目的

ここからはErr.Raiseメソッドを使う目的を解説したいと思います。

JavaやC# などでTry – Catchの経験がある方は、同じことをしていると理解してください。

Sub Main()
    'エラーがあればErrorTrapへ処理を飛ばす
    On Error GoTo ErrorTrap
    
    '別のプロシージャを呼び出し
    CalledSub
    Exit Sub
    
ErrorTrap:
    MsgBox "エラー番号:" & Err.Number & vbLf & "概要:" & Err.Description
End Sub
 

Private Sub CalledSub()
    
    'このプロシージャ内で問題があればエラーを投げる
    Err.Raise Number:=513, Description:="CalledSubプロシージャでエラー"
End Sub

このサンプルコードはMainプロシージャがCalledSubプロシージャを呼び出す構造となっています。

MainプロシージャにはOn Error GoToを記載しており、エラーが発生するとメッセージを出して強制終了させます。

このような構造にしていれば、MainプロシージャはOn Error GoToを書くだけでエラーハンドリングができます。

呼び出されるCalledSubについてもErr.Raiseメソッドを入れておけば、異常が起こったときの対応をシンプルに記載できます。

このようにプロシージャを分割して処理するとき、Err.Raiseメソッドを活用することで異常処理をきれいにまとめることができます。

On Error GoToについて

On Error GoToについては↓の記事をご覧ください。

VBAが難しいと感じたら
プロにお任せして代わりに作ってもらうのはいかがでしょうか?
マクロの作成請負をしていますので、こちらからご相談ください。

VBA

Posted by やろまい