01-VBA

Excel VBA の エラー処理(Part.1)| 現役エンジニア&プログラミングスクール講師

目標

VBAのエラー処理の基本を理解して利用できる
Errオブジェクト・Numberプロパティを理解して利用できる

VBAにおけるエラーの概要

VBAにおけるエラーとは

VBAにおけるエラーとはプロシージャの実行中に発生する問題で処理の中断や強制終了の原因となります。

VBAにおけるエラー処理

エラーは全てが致命的な問題となる訳ではありません。また目的とする処理としては必要のないエラーも発生します。このようなエラーに対してはエラーの回避を行いシステムの稼働を止めない方法をとる必要があります。VBAでは、このことを「エラー処理」といい、その処理を行うプログラムのことを「エラートラップ」と呼びます。

プログラム言語によっては「エラー」は致命的な問題として捉える用語として使われることもあります。そのような言語では致命的でないものを「例外」と呼んだりします。その為、これらを回避する手法を「例外処理」と呼んだりします。(VBAではエラー処理と呼びます。)

目的の処理に必要のないエラーとは

一度作成したプロシージャはプログラムなので内容が変わることはありません。ですが、処理の対象となるオブジェクト(変数・配列・セル・シート)はエクセルファイルの状態やユーザーからの操作によって変化します。この変化によって、エラーが引き起こされることがあります。

例えば、入力ボックスに数字を入力してもらって動かすプロシージャがあったとすると、このプロシージャでは数字を格納できる変数を利用していたりします。この時、この変数はInteger型などの数字を扱うもので宣言されているはずですが、もしもユーザーが入力時に間違えて文字列を入力した場合はエラーが発生してしまいます。

こうした場合はエラーによってシステムが止まってしまうよりもユーザーに「正しい値を入力してください」などの注意を促してシステムを止めない方がシステムとして正しい動きと言えます。

このような時にエラー処理を行わせてシステムが停止するのを回避させ稼働を続けるようにします。

エラー処理を行わない場合の処理

エラー処理を行わない場合の処理

シートの準備

次のようなデータベースから社員番号を入力して社員名を検索するプログラムでエラーを発生させてみようと思います。

サンプルプロシージャ1

Sub exampleError()
    
    Dim item As Long
    Dim empColumns As Range
    Dim hitEmp As Range
    
    Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
    item = InputBox("検索する社員の社員番号を入力してください。")
    
    Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
    
    MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value

End Sub

実行結果

エラーが起こるとシステムが停止となります。この停止を回避するためにエラー処理が利用されます。

エラー処理の利用方法(基本1)

On Error Resume Nextステートメント

On Error Resume Nextステートメントとは

エラートラップを開始するステートメントです。これによって「エラー処理」が有効になります。このステートメントの後に書かれた処理はエラーが発生した場合は無視(回避)されます。

On Error Resume Nextステートメントの利用方法

On Error Resume Nextステートメントは「回避したいエラーが起こる処理の前」に記述します。

On Error Resume Nextステートメントの文法

プロシージャ内で「エラートラップ」を「有効」にしたい処理の前に記述します。下の構文では処理4と処理5がエラー発生時に無視されます
Sub プロシージャ()
処理1
処理2
処理3
On Error Resume Next
処理4
処理5

End Sub

サンプルプロシージャ2

サンプルプロシージャ1を少し改良したものです。

Sub exampleError()
    
    Dim item As Long
    Dim empColumns As Range
    Dim hitEmp As Range
    
    Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
    
    On Error Resume Next

    item = InputBox("検索する社員の社員番号を入力してください。")
    Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
    MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value

End Sub

実行結果

「On Error Resume Next」を記述するとそれ以降のプログラムはエラートラップの有効範囲となります。上のキャプチャでは赤枠の部分です。エラーが発生した場合はこの部分は無視されます。その後、End Subによってエラートラップが終了となります。

エラー処理の利用方法(基本2)

ErrオブジェクトとNumberプロパティ

ErrオブジェクトとNumberプロパティ

エラー処理を実装しているかに関わらず、プロシージャ内でエラーが発生した場合、発生したエラーの情報やエラー番号は「Errオブジェクト」に格納されます。この情報は「Errオブジェクト」の「Numberプロパティ」を利用して取得することができ、プロシージャ内で利用することができます。

ErrオブジェクトとNumberプロパティの利用方法

「Err.Number」とするとエラー番号を取得することが出来ます。

エラー番号一覧(※よく利用されるものだけを載せています。)

エラー番号エラーの内容
5プロシージャの呼び出し、または引数が不正です。
6オーバーフローしました。
7メモリが不足しています。
9インデックスが有効範囲にありません。
13型が一致しません。
35Sub または Function が定義されていません。
53ファイルが見つかりません。
55ファイルは既に開かれています。
76パスが見つかりません。
419オブジェクトを利用できません。
422プロパティが見つかりません。
423プロパティまたはメソッドが見つかりません。
424オブジェクトが必要です。
448名前付き引数が見つかりません。
449引数は省略できません。または不正なプロパティを指定しています。
1004アプリケーション定義またはオブジェクト定義のエラーです。

サンプルプロシージャ3

Sub exampleError()
    
    Dim item As Long
    Dim empColumns As Range
    Dim hitEmp As Range
    
    Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
    
    On Error Resume Next
    
    item = InputBox("検索する社員の社員番号を入力してください。")
    
    If Err.Number = 13 Then
        MsgBox "正しい値を入力してください"
    End If
    
    Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
    MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value

End Sub

実行結果

「On Error Resume Next」を記述するとそれ以降のプログラムはエラートラップの有効範囲となります。「On Error Resume Next」以降の部分でErr.Numberを利用すると該当するエラー番号で専用の処理を行わせることが出来ます。(スキップせずに別の処理を行わせます。キャプチャの青枠の部分です。)その後は、再度プログラムを無視して(ふたつ目の赤枠部分)End Subによってエラートラップが終了となります。

今回は以上となります。

初心者も実践で通用!「VBA・VBS」おすすめ書籍5選 | 現役エンジニア&プログラミングスクール講師「VBA・VBS」初心者の方が実践業務の中でそれらを活用しt活躍できるために必要な知識を習得できる書籍を紹介しています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】| 現役エンジニア&プログラミングスクール講師「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST
01-VBA

演算子|Excel VBA (Part.1)【算術演算子・代入演算子】| 現役エンジニア&プログラミングスクール講師

2022年10月24日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

ExcelVBAの変数 (Part.1) 基本編 | 現役エンジニア&プログラミングスクール講師

2022年9月13日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

VBScriptを利用したファイルの複製(Part.3)| 現役エンジニア&プログラミングスクール講師

2023年2月13日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

Excel VBA の 配列(サンプルプロシージャの利用)| 現役エンジニア&プログラミングスクール講師

2022年12月25日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

ExcelVBAのCellsプロパティ | 現役エンジニア&プログラミングスクール講師

2022年8月18日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

演算子|Excel VBA (Part.4)【比較演算子】応用編(後編)| 現役エンジニア&プログラミングスクール講師

2022年10月28日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site