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関数を使用して有効な数値をエラー値に変換することによっても作成ができます。
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
判定する値がエラーであったときに「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のダイナミック配列機能において、結果がセル範囲の外に広がりすぎる場合に表示されます。 |
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
エクセル関数の結果で表示されるものだね。
エラー値は定義することもできる
ここから少し余談になりますので、IsError関数をつかったサンプルマクロなどを参考にしたい方は、次の見出しである「IsError関数をつかったサンプルマクロ」まで読み飛ばしてください。
さきほど紹介したセルのエラー以外にも、ユーザーが定義するエラー値を引数にしてCVErr関数を使うことで任意のエラーを作成することができます。このときの引数として指定可能なエラー番号の範囲は0から65535です。
これらのユーザー定義のエラーは、通常、プロシージャ内で特定の条件が満たされない場合に、エラーを発生させたい場合に使用されます。
例えば、関数が予期しない引数を受け取った場合や、想定外の状況が発生した場合などで規定のエラーでは未対応なものを作っておきたいときに利用することができます。
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
エラーを定義するときはCVErr関数をつかうんだね。
以下にユーザ定義したエラーをIsError関数で判定するマクロを掲載します。任意でエラーを作成する場合は参考にしてください。
VBAのIsError関数を利用したサンプルコード
Option Explicit
Sub IsError_UserError()
'CVErr関数の戻り値を受けとる変数を宣言する(CVErr関数の戻り値はバリアント型)
Dim UserErrorVar As Variant
UserErrorVar = CVErr(65535) '0~65535の範囲で指定する
Debug.Print IsError(UserErrorVar)
End Sub
06行目
ユーザー定義したエラーを代入するための変数UserErrorVarを宣言します。
08行目
変数UserErrorVarにCVErr関数を利用して定義したエラー値を代入します。
09行目
IsError関数をつかって、変数UserErrorVarにがエラーであるかの判定して、結果を表示します。
実行結果
マクロ内にも記載していますが、CVErr関数で指定する数値の範囲は0~65535となります。ただし、すでに規定されている数値を指定した場合は、規定のエラーとなります。
たとえば、CVErr関数の引数を2000を指定した場合は、すでに存在するエラーのxlErrNull(#NULL!)になります。
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
すでに準備されているもの以外にもエラーが作れるわけだね。
IsError関数をつかったサンプルマクロ
ここでは、IsError関数をつかったサンプルマクロを紹介します。
IsError関数で引数がエラーであるかを判定する
もっともシンプルなIsError関数を利用したマクロです。
サンプルマクロのVBAコード
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
06行目
IsError関数をつかって指定した値のエラー判定をします。
09行目
IsError関数をつかって指定した値のエラー判定をします。さきほどと異なる点として、CVErr関数の引数にエラー定数のxlErrDiv0を渡したものを判定しています。
14行目
A1セルに認識できない関数が入力されているため、IsError関数をつかってエラー判定して、結果を表示します。
サンプルマクロを実行した結果は以下のとおりです。
実行結果
True
True
06行目のエラー判定結果ですが、引数のxlErrDiv0が数値の2007として扱われるため、エラーとみなされずにFalseが返ってきます。一方、09行目ではCVErr関数でxlErrDiv0をエラー型に変換しているので、判定結果が変化し、Trueが返ってきます。
14行目では、ワークシート関数である「=SUMLike()」をセルに入力した場合、認識できない関数名が入力された結果、xlErrName(エラー 2029)となり、ワークシートでも以下の画像のように「#NAME?」が表示されます。
![A1セルに実在しない関数が入力したときのセルのエラー表示](https://kodamanomori.com/wp-content/uploads/2024/03/VBEIsError_Worksheet.cellA1_.jpg)
これをIsError関数で判定しているため、実行結果はTrueとなります。
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
認識できない関数が使われていることで表示されるエラーだね。
関数の結果がエラーを返すマクロ
このサンプルマクロでは、2つのプロシージャを作成しています。
簡単に説明をすれば、呼び出しもとになるSubプロシージャの値を、Functionプロシージャに渡してそのなかで数値に変換する処理をします。変換処理が完了すると呼び出しもとに戻したあとでIsError関数で判定するながれになっています。
結論だけ言ってしまえば、呼び出しもとのプロシージャである「CheckIsError」の実行で表示される入力ボックスで数値に変換できない文字列を入力した場合は、エラーが判定される結果となります。
(※Functionプロシージャとは、戻り値を設定することができるプロシージャです。)
サンプルマクロのVBAコード
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
03行目
CheckIsErrorという名前のプロシージャを作成します。こちらのSubプロシージャからFunctionプロシージャであるConvertToIntを呼び出して結果によって処理する動作が変わるように作成しています。
06行目、07行目
Functionプロシージャからの戻り値を受け取るための変数としてresultを、判定する引数を代入する変数としてValを宣言しています。
10 行目
InputBoxメソッドを利用して、入力ボックスを表示します。ユーザーによって入力された値を変数Valに受け取ります。
13行目
Functionプロシージャ(ConvertToInt)を呼び出します。このときに引数として変数Valをわたすように指定しています。また、呼び出したFunctionプロシージャ(ConvertToInt)の処理結果を変数resultで受け取るようにしています。
16行目
IsError関数をつかってFunctionプロシージャ(ConvertToInt)からの戻り値である変数resultで判定します。判定結果によって表示するメッセージを分岐しています。
24行目
ConvertToIntという名前のプロシージャを作成します。こちらはFunctionプロシージャのため、処理の結果を戻り値に代入して呼び出しもとのプロシージャに返します。
29行目
エラーが発生してもスキップさせる処理です。通常、宣言した変数のデータ型と異なる値を代入しようとすると型が一致しないエラーが発生しますが、On Error Resume Nextを書くことでエラーが発生しても次の処理を継続します。
30行目
CInt関数により、呼び出しもとから渡された変数ValをInt型に変換します。変換後の値を変数intValueに代入します。
32行目
ErrオブジェクトのNumberプロパティでエラーが0ではない(エラーが発生している)と判定されると、CVErr関数を使って2015という値のエラーを戻り値に設定します。このときにエラーでなければ数値に変換されたintValueの値が戻り値に設定されます。
サンプルマクロを実行した結果は以下のとおりです。
![渡された引数が数値に変換できない値であり、整数型の変数に代入を試みてエラーが判定された実行結果](https://kodamanomori.com/wp-content/uploads/2024/03/VBEIsError_msgbox1-1.jpg)
![渡された引数が数値に変換可能な値であり、整数型の変数に代入したエラーではないと判定された実行結果](https://kodamanomori.com/wp-content/uploads/2024/03/VBEIsError_msgbox2-1.jpg)
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
入力された値が数値に変換できるかで結果がかわってくるよ。
こちらのサンプルであるIsError関数でエラーを判定するマクロでは、Functionプロシージャからの戻り値を判定することでエラーの回避をしています。
エラーを回避する方法はさまざまな場面でできます。例えばインプットボックスに入力された時点で意図しないものが入力されたかを判定し、有効な値が入力されるまでそのあとの処理に進まないようにする方法もあります。
期待しない値が入力されないようにする処理のヒントについては、ほかの記事で紹介した内容が参考になるかと思いますので、以下のリンクからそちらを参考にしてください。
\インプットボックスで数値以外を受け付けないようにする方法はコチラ/
セルの範囲内のエラーを検出するマクロ
続いてはワークシート上のセルにエラーがあるかを判定するマクロです。
マクロで処理するサンプルデータとして以下の表があるとします。
![セル値に表示されたエラーを判定するマクロで利用するサンプルデータ](https://kodamanomori.com/wp-content/uploads/2024/03/VBEIsError_table1.jpg)
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
この表のC列をIsError関数で判定していくよ。
こちらの表のA列にはあるゲームのモンスターたちのわざの名前、わざのタイプが入力されていて、C列にはわざ名が重複していないかをチェックするエクセルの「COUNTIF関数」が入力されています。
2・4・6・8・10行目は関数の処理が正常に行われ、A列のわざ名が重複しているかを数値であらわしています。しかし、3・7・9・11行目はそれぞれ理由でエラーが表示されています。
これをマクロで判定し、エラーとなっているセルのアドレスを出力してみます。
サンプルマクロのVBAコード
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
06行目
判定するセル範囲をオブジェクトにする変数としてTRangeを宣言します。
09行目
変数TRangeにC2からC11セルのセル範囲を代入します。
15行目から20行目
ForEachステートメントをつかって、TRangeに含まれるすべてのセルを対象に、IsError関数でエラー判定します。判定の結果としてTrueが返ってきたものは、イミディエイトウィンドウにセルのアドレスを表示します。
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
サンプルデータくらいのボリュームなら目視でチェックできるけどね。
サンプルマクロを実行した結果は以下のとおりです。
実行結果
$C$5
$C$7
$C$9
$C$11
エクセルシートでエラーが表示されているセルのアドレスを取得することができました。
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
エラーのセルは5つあって、どのセルかがわかったね。
こちらのサンプルマクロでは、くり返し処理の方法としてForEachステートメントを利用しています。くり返し処理の実現方法については、以下の記事でくわしい内容を掲載しています。
ForEachステートメント以外のくり返し処理については以下のリンクをクリックして記事をご確認ください。
\くり返し処理は使い方しだいでエクセルの業務は劇的に変わる/
配列操作時のエラーを判定するマクロ
このサンプルでは、配列のmyArrayに値を代入し、くり返し処理のなかで割り算を実行します。割り算の結果がエラーであるかの判定をIsError関数で判定し、エラー(True)となればプロシージャの処理を終了します。
サンプルマクロのVBAコード
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
プロシージャの解説
12行目
Array関数をつかって、配列のmyArrayに0、10、20、30、40、50の6つの値を代入します。myArrayの中身がどのようになっているかは、以下の表を参考にしてください。
myArrayのインデックスと代入した値については以下のとおりです。
変数(配列)名 | インデックス | 代入する値 |
---|---|---|
myArray | 0 | 0 |
1 | 10 | |
2 | 20 | |
3 | 30 | |
4 | 40 | |
5 | 50 |
15行目
ForNextステートメントでくり返しを指定しています。くり返す回数はUbound・Lbound関数で配列のインデックスの上限値と下限値で指定しています。
サンプルマクロの場合、myArrayにおけるインデックスの上限値は5、下限値は0となるため、全6回のくり返すことになります。また、ForNextステートメントにStep-1を記述することでくり返しを逆順にしています。具体的には変数iが5からはじまり、0のときまでくり返すことになります。
17行目
On Error Resume Nextを利用してエラーが発生しても処理を継続できるようにしています。
18行目
IsError関数をつかってmyArrayの値のわり算をしています。具体的な処理の内容は以下の表のとおりです。
くり返しの回数 | 変数 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回目から5回目まで)
1
1
1
1
実行結果(6回目)
![](https://kodamanomori.com/wp-content/uploads/2024/03/VBEIsError_msgbox3.jpg)
![](https://kodamanomori.com/wp-content/uploads/2023/06/blog_toppage_image.png)
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)を返す
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント