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関数で判定するマクロを掲載します。任意でエラーを作成する場合は参考にしてください。
ユーザー定義のエラーをIsError関数で判定するマクロ
Sub IsError_UserError() 'CVErr関数の戻り値を受けとる変数を宣言する(CVErr関数の戻り値はバリアント型) Dim UserErrorVar As Variant UserErrorVar = CVErr(65535) '0~65535の範囲で指定する Debug.Print IsError(UserErrorVar) End Sub
実行結果
True
マクロ内にも記載していますが、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
サンプルマクロを実行した結果は以下のとおりです。
実行結果
False
True
True
③で使用しているワークシート関数である「=SUMLike()」をセルに入力した場合、認識できない関数名が入力された結果、xlErrName(エラー 2029)となり、ワークシートに以下の画像のように「#NAME?」が表示されます。
これを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
サンプルマクロを実行した結果は以下のとおりです。
入力された値が数値に変換できるかで結果がかわってくるよ。
こちらのサンプルである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、つまりエラーのセルであれば、該当するセルのアドレスをイミディエイトウィンドウに表示していきます。
サンプルデータくらいのボリュームなら目視でチェックできるけどね。
サンプルマクロを実行した結果は以下のとおりです。
実行結果
$C$3
$C$5
$C$7
$C$9
$C$11
サンプルデータのエラーが表示されているセルのアドレスを取得することができました。
エラーのセルは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 |
6回目は0で割り算をするので、エラーとなります。実行結果は以下のとおりです。
実行結果
1
1
1
1
1
6回くり返して6回目はエラーになるよ。
こちらのプロシージャで利用した配列やUBoundとLBound関数については、以前の記事で解説しています。配列をつかった処理を詳しく知りたい人は以下のリンクの記事を参考にしてください。
\データをまとめてあつかえる配列の使い方や利用方法はコチラ/
PR
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
IsError関数のような値や変数を判定する関数はほかにもある
ここまで紹介したIsError関数は指定した値や式がエラーであるかの判定をする関数です。
IsError関数以外にもIs〇〇関数というものは多数存在しています。これらの関数は特定の条件や、特定の型を判定することができるので、用途に応じてうまく利用することで目の前の課題が解決する可能性があります。
さいごにほかの判定関数をいくつか紹介します。
気になる関数があれば、それらについての記事をご覧ください。
そのほかの判定につかえる関数について
VBAには数値以外にも値や変数を判定する関数があります。
値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が日付であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数にNullが含まれるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数がオブジェクトかどうかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント