IsArray関数について
VBAのIsArray関数は、引数に指定した変数が配列であるかを確認する関数です。
これまでに紹介したIsNumeric関数やIsDate関数といった数値や日付を判定するものと比較すると一般的な作業では使用頻度はすくない印象ですので、VBAにはこういった関数があるといった感覚で知っておいてもらえたら幸いです。
なお、判定結果はほかのIs〇〇関数と同じく、真偽(Boolean)となるため、TrueまたはFalseで返します。
配列っていうのは変数のかたまりみたいなものだよ。
配列がわからない人は配列を取り上げた記事があるので良ければご覧になってください。
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験
IsArray関数がつかえる場面
IsArray関数の利用が想定される場面では、以下のようなものがあります。
指定した変数が配列であるかの判定
引数に指定した変数が配列であるかの判定を実行します。
関数の引数として利用
関数(Function)プロシージャの引数として利用します。配列を操作するまえに引数が配列であるかを判定し、そのあとの処理が正常に実行できるかを確認します。
エラーハンドリングとして利用
配列を操作する処理のまえに実行しておくことでエラーの発生を予防できます。
IsArray関数の使いかた
IsArray関数の構文と戻り値について紹介します。
IsArray関数の構文
構文
IsArray(値または変数)
※値または変数(expression)の指定は必須のため、省略した場合はエラーが発生します。
IsArray関数の判定結果について
IsArray関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。
指定した値や変数が配列である場合はTrue、それ以外と判定された場合や変数が複数の場合はFalseが返ってきます。
IsArray関数をつかったサンプルマクロ
ここではIsArray関数をつかったマクロを紹介します。
IsArray関数で指定した変数が配列であるかを確認する
以下のサンプルマクロは変数が配列であるかを確認します。
サンプルマクロ1
Option Explicit Sub IsArray_macro1() '指定した変数が配列であるかの確認 '配列を宣言する Dim My_Array(2) As String '変数が配列であるかの確認 If IsArray(My_Array) Then Debug.Print "My_Array は配列です。" 'Tureの処理 Else Debug.Print "My_Array は配列ではありません。" 'Falseの処理 End If End Sub
IsArray関数をつかって配列の変数である「My_Array」が配列であるかの確認をします。上記のマクロである場合は変数名「My_Array」は3つの要素をもった配列なので、Trueの処理が実行されます。
変数(配列)の宣言でカッコに数字を指定すると静的配列になるよ。
サンプルマクロ2
Option Explicit Sub IsArray_macro2() '指定した変数が配列であるかの確認 '配列を宣言する Dim My_Area As Variant With ThisWorkbook.Worksheets("Sheet1") 'Withステートメントでシート1をまとめる My_Area = .Range("A1:C3") 'A1セルからC3セルの範囲を代入する End With '変数が配列であるかの確認 If IsArray(My_Area) Then Debug.Print "My_Area は配列です。" 'Tureの処理 Else Debug.Print "My_Area は配列ではありません。" 'Falseの処理 End If End Sub
こちらはバリアント型で宣言した変数「My_Area」に、シート1のセルA1~C3セルを代入しています。代入したあとの「My_Area」をIsArray関数で配列か確認しています。
実行結果はTrueが返ってきます。
My_Areaに何も代入してなければ、実行結果はFalseで返ってくるよ。
サンプルマクロ3
Option Explicit Sub IsArray_macro3() '指定した変数が配列であるかの確認 Dim Var1 As Integer Dim Var2 As Double Dim Var3 As String Dim Var4 As Boolean Dim Var5 As Date Dim Var6 As Object Dim Var7 As Variant Dim Var8 'データ型の指定をしないとVariant型となる Dim Var9() Dim Var10(1 To 3) Dim Var11 As Variant Set Var11 = Nothing 'くり返し処理用にコレクションを宣言する Dim Var_Collection As collection Set Var_Collection = New collection Var_Collection.Add Item:=Var1 '数値 Var_Collection.Add Item:=Var2 '小数値 Var_Collection.Add Item:=Var3 '文字列値 Var_Collection.Add Item:=Var4 '真偽値 Var_Collection.Add Item:=Var5 '日付値 Var_Collection.Add Item:=Var6 'オブジェクト変数 Var_Collection.Add Item:=Var7 'バリアント変数(データ型明記) Var_Collection.Add Item:=Var8 'バリアント変数(データ型なし) Var_Collection.Add Item:=Var9 'バリアント配列(動的) Var_Collection.Add Item:=Var10 'バリアント配列(静的) Var_Collection.Add Item:=Var11 'バリアント変数(Nothing) 'くり返し処理用の変数を宣言する Dim X As Variant Dim i As Long: i = 1 For Each X In Var_Collection Debug.Print i & " コめの変数は " & IsArray(X) i = i + 1 Next X End Sub
各種データ型で宣言した変数を、IsArray関数をつかって配列であるかを確認します。
このマクロでは、複数の変数をまとめて処理するためにコレクションオブジェクトを宣言し、変数をコレクションに追加する処理をしています。
デバッグプリントなので、結果はイミディエイトウィンドウにTrueかFalseを表示します。表示された結果は以下のとおりです。
変数をまとめるために利用しているコレクションや、くり返しに利用しているForEachステートメントについては、以前の記事で紹介しており、以下のリンクから該当の記事を読むことができます。詳しい内容につきましてはそちらを参考にしてください。
\データ型の異なる変数を要素としてまとめて処理できるコレクションオブジェクトはコチラ/
\ForEacnステートメントの詳しい解説はコチラ/
実行結果(イミディエイトウィンドウ)
1 コめの変数は False
2 コめの変数は False
3 コめの変数は False
4 コめの変数は False
5 コめの変数は False
6 コめの変数は False
7 コめの変数は False
8 コめの変数は False
9 コめの変数は True
10 コめの変数は True
11 コめの変数は False
くわしい結果は以下のとおりです。
No | 判定する変数名 | 説明 | 判定結果 (True or False) |
---|---|---|---|
1 | Var1 | Dim Var1 As Integerで宣言した変数 | False |
2 | Var2 | Dim Var2 As Doubleで宣言した変数 | False |
3 | Var3 | Dim Var3 As Stringで宣言した変数 | False |
4 | Var4 | Dim Var4 As Booleanで宣言した変数 | False |
5 | Var5 | Dim Var5 As Dateで宣言した変数 | False |
6 | Var6 | Dim Var6 As Objectで宣言した変数 | False |
7 | Var7 | Dim Var7 As Variantで宣言した変数 | False |
8 | Var8 | Dim Var8で宣言した変数 | False |
9 | Var9 | Dim Var9()で宣言した変数 | True |
10 | Var10 | Dim Var10(1 To 3)で宣言した変数 | True |
11 | Var11 | Dim Var11 As Variantで宣言した変数 Set Var11 = Nothing ※Nothingが代入されている |
False |
静的・動的に関係なく配列はTrueと判断されているね。
IsArray関数を関数(Function)の引数として利用する
こちらのマクロは関数(Functionプロシージャ)のなかで変数が配列かどうかを確認して、配列であれば値の代入と合計をします。
Option Explicit Sub IsArray_Function_macro1() '配列と関数の戻り値を受けとる変数の宣言 Dim My_Array() As Integer, Ans As Integer '関数の呼び出し(引数の指定がある) Call IsArray_Function_macro2(My_Array, Ans) '関数に戻り値(合計値)を出力する Debug.Print Ans End Sub Function IsArray_Function_macro2(My_Array, Ans) As Integer 'IsArray関数による配列の確認 If IsArray(My_Array) Then ReDim My_Array(1 To 3) As Integer '配列の場合は要素数を再定義する Dim i As Integer 'くり返し用変数の宣言 '配列の要素の数だけくり返す For i = LBound(My_Array) To UBound(My_Array) My_Array(i) = i '配列に値を代入する Ans = Ans + My_Array(i) '計算結果を変数Ansに代入する Next i '関数に戻り値(合計値)を代入する IsArray_Function_macro2 = Ans Else '配列でない場合は初期値のまま IsArray_Function_macro2 = Ans End If End Function
それぞれのプロシージャの解説だよ。
IsArray_Function_macro1
こちらのプロシージャでは、配列と合計値を代入することを想定して2つの変数(My_ArrayとAns)を宣言しています。その後、関数(Functionプロシージャ)を呼び出して、戻り値で返された変数(Ans)をイミディエイトウィンドウに表示します。
IsArray_Function_macro2
呼び出しもとから受けとった「My_Array」が配列であるかIsArray関数をつかって確認します。配列であった場合は要素数を指定した再定義を実行して、For文によるくり返しで値を代入しています。
さいごに関数の戻り値を呼び出しもとから受けとったもうひとつの変数である「Ans」に代入します。
「My_Array」が配列でなければ変数「Ans」は0のままだよ。
なお、本題のIsArray関数の話からはそれますが、このサンプルマクロでは配列の添え字の最小値を返すLBound関数や、最大値を返すUBound関数をつかって、くり返し回数や値の代入をしています。動的配列を宣言しただけの状態でこれらの関数を使うと値の取得ができずにエラーが発生します。
IsArray関数で配列であることが確認できたとしても、そのあとの処理でエラーが発生しないようにRedimステートメントをつかって添え字を指定しています。
サンプル以外にも、On Error GoTo 〇〇をつかう方法もあるよ。
IsArray関数をつかってエラーハンドリングをする
エラーハンドリングとは、プログラムの実行を妨げるエラーが発生したときの処理のことです。
こちらのサンプルマクロでは、ほかのプロシージャから渡された変数が配列かどうかを確認し、配列であれば代入された文字列を表示します。変数が配列でなければ処理を終了します。
Option Explicit Sub IsArray_macro4() Dim My_Arr(1 To 3) As Variant '配列の宣言 'Dim My_Arr As Variant Call IsArray_macro5(My_Arr) '別のプロシージャを呼び出す Dim i As Integer For i = 1 To 3 Debug.Print My_Arr(i) '配列に代入された値を出力する Next i End Sub Sub IsArray_macro5(My_Arr As Variant) If IsArray(My_Arr) Then 'IsArray関数をつかって配列であるかの確認 My_Arr(1) = "これは配列の1つめの要素" My_Arr(2) = "これは配列の2つめの要素" My_Arr(3) = "これは配列の3つめの要素" Else MsgBox "エラー: 配列が渡されていません。" End '処理を終了する End If End Sub
変数が配列でなければ処理をとめることでエラーを回避できるよ。
変数を宣言している、Dim My_Arr(1 To 3) As Variantの行をコメントアウトして、Dim My_Arr As Variantのコメントアウトを解除すると結果が変わるので、サンプルマクロをコピーして動作を試してみてください。
コメントアウトの方法は以下の記事を参考にしてね。
IsArray関数のような値や変数を判定する関数はほかにもある
そのほかの判定につかえる関数について
また、VBAには数値以外にも値や変数を判定する関数があります。
値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が日付であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数がエラーであるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数にNullが含まれるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数がオブジェクトかどうかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント