※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

VBA|IsError関数は指定した値や式をエラーか判定する

エクセルVBAのIsError関数のトップ画像

IsError関数について

VBAのIsError関数は、指定した値や変数がエラーであるかを確認する関数です。

これまでに紹介したIsNumeric関数やIsDate関数といった数値や日付を判定するものと同様に指定した式や値・変数などがエラーであるかの判定をする関数です。

IsError関数は、エラーを判定するものであるので、当然ながらエラーハンドリングすることにつかうことができます。具体的な例として、ファンクションプロシージャをつかった戻り値がエラーであるかの判定、セルの範囲内のエラーを検知する、配列の処理でエラーがでるケースなどで利用することが想定できます。

想定されるエラーが判定された場合の処理を準備しておくことは、マクロの品質を高めていく上で有用な関数だと言えるでしょう。

IsError関数は、判定結果はほかのIs〇〇関数と同じく、真偽(Boolean)となるため、TrueまたはFalseで返します。

PR

独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

IsError関数がつかえる場面

IsError関数の利用が想定される場面では、以下のようなものがあります。

関数の結果がエラーを返す場合の処理

 他の関数や式で計算された結果がエラーになる可能性がある場合、IsError関数を使用してその結果がエラーかどうかを確認し、適切なエラーハンドリングを行うことができます。

範囲内のエラーの検出

 セル範囲内の数式の評価結果がエラーを含む可能性がある場合、IsError関数を使用してそれらのセルをループ処理し、エラーが含まれるセルを特定することができます。

配列操作時のエラー処理

 配列を操作する際に、特定の要素がエラーになる可能性がある場合、IsError関数を使用してエラーを処理することができます。

IsError関数の使いかた

IsError関数の構文と戻り値について紹介します。

IsError関数の構文

IsError(変数)

※値または変数(expression)の指定は必須のため、省略した場合はエラーが発生します。

IsError関数の判定結果について

IsError関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。指定した値や変数がエラーである場合はTrue、それ以外と判定された場合はFalseが返ってきます。

IsError関数は数値式がエラーを表しているかどうかを判断します。
エラー値は CVErr関数を使用して有効な数値をエラー値に変換することによっても作成ができます。

判定する値がエラーであったときに「True」がかえってくるよ。

IsError関数のエラー値について

IsError関数でエラーと判定されるエラーの値については以下のとおりです。

エクセルシートのセルのエラー値について

エクセルにはセルのエラー値が存在しています。セルのエラー値の定数・エラー番号・セル上のエラー表記については以下のとおりです。

定数 エラー番号 セル上のエラー表記 エラーの説明
xlErrNull 2000 #NULL! セル参照の間違いや不正な範囲の指定など、セル参照に関するエラーが発生した場合に表示されます。
xlErrDiv0 2007 #DIV/0! ゼロで割り算を行った場合に表示されます。
xlErrValue 2015 #VALUE! 数式や関数の引数に不適切なデータ型が渡された場合や、不正な演算が行われた場合に表示されます。
xlErrRef 2023 #REF! 無効なセル参照が含まれている場合に表示されます。
xlErrName 2029 #NAME? 関数や式内で認識できない関数名や定義されていない名前が使用された場合に表示されます。
xlErrNum 2036 #NUM! 数式や関数の計算中に数値として扱えない値が含まれている場合に表示されます。
xlErrNA 2042 #N/A 「Not Available」の略であり、「利用不可」という意味です。
このエラーは、データが利用できない、見つからない、または不明であることを示します。
xlErrSpill 2045 #SPILL! Excelのダイナミック配列機能において、結果がセル範囲の外に広がりすぎる場合に表示されます。

エクセル関数の結果で表示されるものだね。

ユーザーが定義するエラー値について

さきほど紹介したセルのエラー以外にも、ユーザーが定義するエラー値を引数にしてCVErr関数を利用することで任意のエラーを作成することができます。、このとき、引数として指定可能なエラー番号の範囲は0から65535です。

これらのユーザー定義のエラーは、通常、プロシージャ内で特定の条件が満たされない場合に、エラーを発生させたい場合に使用されます。

例えば、関数が予期しない引数を受け取った場合や、想定外の状況が発生した場合などです。

エラーを定義するときはCVErr関数をつかうんだね。

以下にユーザ定義したエラーをIsError関数で判定するマクロを掲載します。任意でエラーを作成する場合は参考にしてください。

Sub IsError_UserError()
        
    'CVErr関数の戻り値を受けとる変数を宣言する(CVErr関数の戻り値はバリアント型)
    Dim UserErrorVar As Variant
    
    UserErrorVar = CVErr(65535) '0~65535の範囲で指定する
    Debug.Print IsError(UserErrorVar)

End Sub

マクロ内にも記載していますが、CVErr関数で指定する数値の範囲は0~65535となります。ただし、すでに規定されている数値を指定した場合は、規定のエラーとなります。

たとえば、CVErr関数の引数を2000を指定した場合は、すでに存在するエラーのxlErrNull(#NULL!)になります。

すでに準備されているもの以外にもエラーが作れるわけだね。

IsError関数をつかったサンプルマクロ

ここでは、IsError関数をつかったサンプルマクロを紹介します。

IsError関数で引数がエラーであるかを判定する

もっともシンプルなIsError関数を利用したマクロです。

Option Explicit

Sub IsError_Error1()

    'IsError関数をつかって判定した結果を表示する①
    Debug.Print IsError(xlErrDiv0) 'False
    
    'IsError関数をつかって判定した結果を表示する②(※CVErr(xlErrDiv0)はエラー番号2007のエラー)
    Debug.Print IsError(CVErr(xlErrDiv0)) 'True
    
    'IsError関数をつかって判定した結果を表示する③(※シート1のA1セルに存在しない関数が入力されている)
    With ThisWorkbook.Worksheets("Sheet1")
        .Range("A1").Formula = "=SUMLike()"'セルA1に実在しないワークシート関数のSUMLike()を入力する
        Debug.Print IsError(.Range("A1")) 'True
    End With

End Sub

サンプルマクロを実行した結果は以下のとおりです。

③で使用しているワークシート関数である「=SUMLike()」をセルに入力した場合、認識できない関数名が入力された結果、xlErrName(エラー 2029)となり、ワークシートに以下の画像のように「#NAME?」が表示されます。

A1セルにSUMLike()を入力したときのワークシートセルの表示

これをIsError関数で判定しているため、実行結果はTrueとなります。

実在しない関数が使われていることで表示されるエラーだね。

関数の結果がエラーを返すマクロ

このサンプルマクロでは、関数(ファンクションプロシージャ)からの戻り値をIsError関数で判定します。

呼び出しもとのプロシージャである「CheckIsError」で表示される入力ボックスで任意の文字列を入力することができますが、このとき数値に変換できない文字列を入力した場合は、エラーが判定される結果となります。

Option Explicit

Sub CheckIsError()
    
    '関数の戻り値をIsError関数で判定するマクロ
    Dim result As Variant
    Dim Val As String
    
    'InputBoxメソッドでユーザーより値を受けとる(数値に変換できない文字列を入力するとエラーになる)
    Val = Application.InputBox("文字を入力してください。", "文字を入力", Type:=2)
        
    '関数(ConvertToInt)を呼び出し、結果をresultに代入する
    result = ConvertToInt(Val)

    '関数(ConvertToInt)からの戻り値をIsError関数で判定する
    If IsError(result) Then
        MsgBox "エラーが発生しました: " & CStr(result)
    Else
        MsgBox "結果は " & result & " です"
    End If

End Sub

Function ConvertToInt(Val As String) As Variant
    
    Dim intValue As Integer
    
    'エラーが発生した行をスキップして次の処理から継続する
    On Error Resume Next
    intValue = CInt(Val) 'Integer型の変数にInputBoxメソッドで受けとった値を代入する
    
    If Err.Number <> 0 Then '文字列が代入されるとエラーコード13(型が一致しません)
        ' エラーコードを返す
        ConvertToInt = CVErr(2015) ' ユーザー定義のエラーコード (2015) を返す
    Else
        ' 正常に変換された場合は、整数値を返す
        ConvertToInt = intValue
    End If
    
    '実行中のプロシージャで発生したエラー処理を無効にする
    On Error GoTo 0

End Function

サンプルマクロを実行した結果は以下のとおりです。

実行結果(文字列が入力された場合と数値に変換可能な0が入力された場合の結果)
渡された引数が数値に変換できない値であり、整数型の変数に代入を試みてエラーが判定された実行結果
渡された引数が数値に変換可能な値であり、整数型の変数に代入したエラーではないと判定された実行結果

入力された値が数値に変換できるかで結果がかわってくるよ。

こちらのサンプルであるIsError関数でエラーを判定するマクロでは、ファンクションプロシージャからの戻り値を判定することでエラーの回避をしています。

エラーを回避する方法はさまざまな場面でできます。例えばインプットボックスに入力された時点で意図しないものが入力されたかを判定し、有効な値が入力されるまでそのあとの処理に進まないようにする方法もあります。

インプットボックスで期待しない値が入力されないようにする処理のヒントについては、ほかの記事で紹介した内容が参考になるかと思いますので、以下のリンクからそちらを参考にしてください。

セルの範囲内のエラーを検出するマクロ

続いてはワークシート上のセルにエラーがあるかを判定するマクロです。

マクロで処理するサンプルデータとして以下の表があるとします。

この表のC列をIsError関数で判定していくよ。

こちらの表のA列にはモンスターたちのわざの名前、わざのタイプが入力されていて、C列にはわざ名が重複していないかをチェックするエクセルの「COUNTIF関数」が入力されています。

2・4・6・8・10行目は関数の処理が正常に行われ、A列のわざ名が重複しているかを数値であらわしています。しかし、3・7・9・11行目はそれぞれ理由でエラーが表示されています。

これをマクロで判定し、エラーとなっているセルのアドレスを出力してみます。

Option Explicit

Sub CheckIsError_Range() 'セルにエラー値があるかを判定するマクロ

    '判定するセル範囲を参照する変数を宣言
    Dim TRange As Range
    
    'サンプルデータシートのC2からC11セルを変数に代入する
    Set TRange = ThisWorkbook.Worksheets("サンプルデータ").Range("C2:C11")
    
    'くり返し用の変数を宣言する
    Dim TCell As Variant
    
    'ForEachステートメントでTRangeのセルすべてをくり返す
    For Each TCell In TRange
        'IsError関数の判定結果がTrueならイミディエイトウィンドウにセルのアドレスを表示する
         If IsError(TCell) Then
            Debug.Print TCell.Address
         End If
    Next TCell

End Sub

このサンプルマクロの要点としては、変数「TRange」に判定するセル範囲を代入し、ForEachステートメントを利用したくり返し処理をつかって範囲内のすべてのセルを対象にIsError関数で判定しています。判定の結果がTrue、つまりエラーのセルであれば、該当するセルのアドレスをイミディエイトウィンドウに表示していきます。

サンプルデータくらいのボリュームなら目視でチェックできるけどね。

サンプルマクロを実行した結果は以下のとおりです。

サンプルデータのエラーが表示されているセルのアドレスを取得することができました。

エラーのセルは5つあって、どのセルかがわかったね。

こちらのサンプルマクロでは、くり返し処理の方法としてForEachステートメントを利用しています。くり返し処理の実現方法については、以下の記事でくわしい内容を掲載しています。

ForEachステートメント以外のくり返し処理については以下のリンクをクリックして記事をご確認ください。

配列操作時のエラーを判定するマクロ

このサンプルでは、配列のmyArrayに値を代入し、くり返し処理のなかで割り算を実行します。割り算の結果がエラーであるかの判定をIsError関数で判定し、Trueとなればプロシージャの処理を終了します。

Option Explicit

Sub IsError_Array()
    
    '配列を代入する変数の宣言
    Dim myArray As Variant
        
    'くり返し用の変数を宣言
    Dim i As Integer
    
    'Array関数により、myArrayに6つの値を代入する
    myArray = Array(0, 10, 20, 30, 40, 50)
    
    'くり返し処理(最大インデックスから最小にむけて逆順)
    For i = UBound(myArray) To LBound(myArray) Step -1
        
        On Error Resume Next 'エラーが発生した次の行から処理をする
        If IsError(myArray(i) / myArray(i)) Then 'IsError関数による判定
            MsgBox "ゼロで割るエラーが発生しました"
            Exit Sub 'プロシージャを終了
        Else
            Debug.Print myArray(i) / myArray(i) '割り算の結果をイミディエイトウィンドウに表示する
        End If
    Next i

End Sub

まずは、配列変数 myArray とくり返し用の変数 i を宣言しています。配列変数の myArray にはArray関数をつかって6つの値を代入します。myArrayのインデックスと代入した値については以下のとおりです。

変数(配列)名 インデックス 代入する値
myArray 0 0
1 10
2 20
3 30
4 40
5 50

配列変数である myArray に代入した値をつかって演算をくり返し実行します。くり返し処理のため、ForNextステートメントでくり返す回数の指定をしています。
ここでは、UBoundとLBound関数をつかって回数の指定をしていますが、UBound(myArray)は5が返り、LBound(myArray)は0が返ります。

これにより、くり返す回数は変数 i が5から0の間はForNextステートメントのなかの処理をくり返すことになります。くり返しのなかで実行される演算の内容とIsError関数による判定の結果は以下の表のとおりです。

くり返しの回数 変数 i の状態 演算される内容 IsError関数の判定結果
1回目 5 50÷50 False
2回目 4 40÷40 False
3回目 3 30÷30 False
4回目 2 20÷20 False
5回目 1 10÷10 False
6回目 0 0÷0 True
※ForNextステートメントでStep-1を指定しているため、逆順でくり返す処理になります。

6回目は0で割り算をするので、エラーとなります。実行結果は以下のとおりです。

6回くり返して6回目はエラーになるよ。

こちらのプロシージャで利用した配列やUBoundとLBound関数については、以前の記事で解説しています。配列をつかった処理を詳しく知りたい人は以下のリンクの記事を参考にしてください。

PR

残業はしたくない!PCやExcelのスキルアップであなたのプライベート時間を奪わせない!
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。


詳しくは以下のリンクをクリック

IsError関数のような値や変数を判定する関数はほかにもある

ここまで紹介したIsError関数は指定した値や式がエラーであるかの判定をする関数です。

IsError関数以外にもIs〇〇関数というものは多数存在しています。これらの関数は特定の条件や、特定の型を判定することができるので、用途に応じてうまく利用することで目の前の課題が解決する可能性があります。

さいごにほかの判定関数をいくつか紹介します。
気になる関数があれば、それらについての記事をご覧ください。

そのほかの判定につかえる関数について

VBAには数値以外にも値や変数を判定する関数があります。

IsArray関数

 値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsNumeric関数

 値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsDate関数

 値や変数が日付であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsEmpty関数

 値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsNull関数

 値や変数にNullが含まれるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsObject関数

 値や変数がオブジェクトかどうかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

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