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

VBA|IsArray関数で変数が配列かどうかを判定するマクロをつくる

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

IsArray関数について

VBAのIsArray関数は、引数に指定した変数が配列であるかを判定する関数です。

これまでに紹介したIsNumeric関数IsDate関数といった数値や日付を判定するものと比較すると一般的な作業では使用頻度はすくない印象ですので、VBAにはこういった関数があるといった感覚で知っておいてもらえたら幸いです。

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

配列っていうのは変数のかたまりみたいなものだよ。

配列がわからない人は配列を取り上げた記事があるので良ければご覧になってください。

\エクセルVBAの配列についての記事はこちら/

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

IsArray関数がつかえる場面

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

指定した変数が配列であるかの判定

引数に指定した変数が配列であるかの判定を実行します。

関数の引数として利用

関数(Function)プロシージャの引数として利用します。配列を操作するまえに引数が配列であるかを判定し、そのあとの処理が正常に実行できるかを確認します。

エラーハンドリングとして利用

配列を操作する処理のまえに実行しておくことでエラーの発生を予防できます。

IsArray関数の使いかた

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

IsArray関数の構文

IsArray(値または変数)

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

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

IsArray関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。

指定した値や変数が配列である場合はTrue、それ以外と判定された場合や変数が複数の場合はFalseが返ってきます。

VBAにすこしなれてきたステップアップにおすすめです♪

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

ここではIsArray関数をつかったマクロを紹介します。

IsArray関数で指定した変数が配列であるかを確認する

以下のサンプルマクロは変数が配列であるかを確認します。

IsArray関数をつかって配列の変数であるMy_Arrayが配列であるかの確認をします。以下のマクロである場合は変数名My_Arrayは3つの要素をもった配列なので、Trueの処理が実行されます。

IsArray関数で宣言した変数を判定する

  
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

06行目

変数My_Arrayを配列を宣言します。

変数(配列)の宣言でカッコに数字を指定すると静的配列になるよ。

09行目から13行目

IsArray変数をつかって、My_Arrayが配列であるかを判定します。判定の結果によって、イミディエイトウィンドウに表示するメッセージが変化します。

実行結果(イミディエイトウィンドウ)

My_Arrayは配列です。

My_Arrayは配列だと判定されたってことだね。

IsArray関数でセル範囲を代入した変数を判定する

  
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

06行目

変数My_Areaをバリアント型で宣言します。

08行目から10行目

変数My_Areaにシート1のA1セルからC3セルの範囲を代入します。

13行目から17行目

IsArray変数をつかって、My_Areaが配列であるかを判定します。判定の結果によって、イミディエイトウィンドウに表示するメッセージが変化します。

実行結果(イミディエイトウィンドウ)

My_Area は配列です。

9 行目の代入式がなければ、実行結果はFalseになるよ。

IsArray関数でさまざまなデータ型の変数を判定する

  
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

05行目から16行目

さまざまなデータ型の変数を宣言します。

19行目から20行目

宣言した変数に対してまとめてくり返し処理をしたいので、それらをまとめるためのコレクションオブジェクトであるVar_Collectionを宣言します。

38行目から41行目

ForEachステートメントをつかってコレクションオブジェクトVar_Collectionのすべての要素に対して処理を実行するように指定しています。処理内容は、IsArray関数でVar_Collectionのすべての要素を判定して、結果をイミディエイトウィンドウに表示します。

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、そうでないものがFalseと判定されます。

IsArray関数を関数(Function)の引数として利用する

こちらのマクロは関数(Functionプロシージャ)のなかで、IsArray関数をつかって変数が配列かどうかを判定して、配列であれば値の代入と合計をします。SubプロシージャとFunctionプロシージャの2つのプロシージャを利用した書きかたをしています。

  
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

03行目

Subプロシージャとなります。変数を宣言して、Functionプロシージャに渡して処理を実行してもらって結果を表示します。肝心のIsArray関数による判定処理はFunctionプロシージャのなかで実行するようにしています。

06行目

数値型の変数としてMy_ArrayAnsを宣言しています。My_Arrayは動的配列になります。

09行目

CallステートメントをつかってFunctionプロシージャのIsArray_Function_macro2を呼び出します。宣言していた変数であるMy_ArrayAnsを引数として渡します。

19行目

IsArray関数をつかってMy_Arrayが配列であるかの判定をします。My_Arrayが配列だったときとそうでないときでそのあとの処理を分岐しています。

21行目

My_Arrayを再定義しています。これによりMy_Arrayは、3つの要素数をもつ配列になります。

25行目から28行目

ForNextステートメントでくり返しを指定します。回数はLBound関数とUBound関数でから取得し、サンプルマクロでは1~3回くり返しますことになります。ここでは、変数iに代入した値が変数Ansに加算されていきます。

回数 変数iの値 変数Ansの値
1 1 1
2 2 3
3 3 6
※変数iは1~3になるため合計値は6になります。

31行目

FunctionプロシージャのIsArray_Function_macro2の戻り値に変数Ansの値を代入します。

35行目

19行目の分岐でMy_Arrayが配列ではなかったときは、何も処理をおこなわずに変数Ansを戻り値として代入します。

「My_Array」が配列でなければ変数「Ans」は0のままだよ。

IsArray関数をつかってエラーハンドリングをする

エラーハンドリングとは、プログラムの実行を妨げるエラーが発生したときの処理のことです。

こちらのサンプルマクロでは、ほかのプロシージャから渡された変数が配列かどうかを確認し、配列であれば代入された文字列を表示します。変数が配列でなければ処理を終了します。さきほどのサンプルマクロと同じように2つのプロシージャに分けて作成しています。

  
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

05行目

変数My_Arrを配列として宣言しています。

06行目

VBAコードをコメントアウトしていますが、変数My_Arrをバリアント型で宣言しています。5行目をブロックして、こちらのコメントアウトを解除することで、エラーが発生したときの分岐になります。

08行目

Callステートメントで別のプロシージャIsArray_macro5を呼び出します。

※このサンプルマクロでは、戻り値の指定がないためSubプロシージャしています。

11行目から13行目

ForNextステートメントでくり返しの指定しています。呼び出したSubプロシージャIsArray_macro5のなかで、IsArray関数の判定がTrueだったときはこちらに戻って配列My_Arrに代入されている値をイミディエイトウィンドウに表示します。

19行目から26行目

IsArray関数で変数My_Arrを判定します。判定の結果によってそのあとの処理を分けています。My_Arrが配列であったときは、要素に文字列を代入していきます。一方、My_Arrが配列ではなかったときはエラーメッセージを表示してマクロを終了します。

判定の結果が配列でなかったときのエラーを回避しているよ。

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

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

また、VBAには数値以外にも値や変数を判定する関数があります。関数名をクリックするとそちらの記事にジャンプします。

IsNumeric関数

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

IsDate関数

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

IsEmpty関数

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

IsError関数

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

IsNull関数

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

IsObject関数

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

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

コメント