配列の受け渡し

中級VBA

配列の受け渡し

 ExcelVBAではプロシージャの引数や戻り値に配列を指定して受け渡しを行う事ができます。
基本的には他の変数と同じですが少々コツが必要になります。
 ここでは使い方を見ていきます。

配列を引数で受ける

 プロシージャの引数に配列を指定して受け取る場合は、以下のようにします。
 引数に配列の()を付けますが、括弧の中に数値は書きません。
 動的配列として指定している感じです。

Sub ArrayTest(ByRef arr() As Long)
             'ByRefは省略してもOK
    arr(0) = 1
    arr(1) = 2
    
End Sub

Sub macro0()
    Dim lArr(4) As Long '要素が5個の配列を定義
    Dim i As Long
        
    For i = 0 To 4
        lArr(0) = 0
    Next i
    
    Call ArrayTest(lArr())
    
    '表示
    Debug.Print lArr(0)    '結果は1
End Sub

 引数の ByRef は「参照渡し」の指定ですが、VBAではデフォルトで参照渡しとなるので省略してもOKです。

 ※「参照渡し」とはプロシージャの引数となった値が、呼び出したプロシージャ内で呼び出された後も値が変化したままになる状態を言います。

 尚、呼び出し側の Call ArrayTest( lArr() ) の lArr() を lArr と括弧を外してもエラーとはなりません。

Variant型で配列を受け取る

 配列をバリアント型として受け取る方法もあります。
 この場合は、変数名のみで()は付けません。
 ()を付けると、Variant型の配列を指定する事になってしまうので間違いです。

'引数をVariant型で受ける例
Sub ArrayTestV(ByRef arr)
    arr(0) = 1
    arr(1) = 2
End Sub

Sub macro1()
    Dim lArr(4) As Long
    Dim i As Long
        
    For i = 0 To 4
        lArr(0) = 0
    Next i
    
    Call ArrayTestV(lArr())
    
    '表示
    Debug.Print lArr(0)    '結果は1
End Sub

 呼び出し側の Call ArrayTestV( lArr() ) の lArr() を lArr と括弧を外してもエラーとはなりません。

配列を戻り値で渡す

 今度はFunctionで配列を渡す方法です。
 Function ではプロシージャ名の後に返す値の型を書きますが、この時、変数型の後ろに()を書きます。
 尚、プロシージャ内で返り値を渡す sendArray = mArr() の括弧は省略してもエラーとなりません。

Function sendArray() As Long()
    Dim mArr(4) As Long
    mArr(0) = 1
    mArr(1) = 2
    
    sendArray = mArr()
End Function

 配列を返すプロシージャを使用する時は、受け取る変数を動的配列として宣言します。
 静的配列として宣言するとエラーとなります。
 
 代入を行う際は、()を付けなくてもエラーにはなりません。

Sub macro2()
    Dim lArr() As Long '受け取る配列は動的配列を使う
    Dim i As Long
        
    lArr() = sendArray
    'lArr = sendArray    '()は無くてもOK
    
    '表示
    Debug.Print lArr(0)    '結果は1
End Sub

Variant型で配列を受け取る

 macro3の例のように、値をVariant型として受け取ることもできます。
 ただし、この場合は、 lArr = sendArray とします。
 ()を付けるとエラーとなります。

Function sendArray() As Long()
    Dim mArr(4) As Long
    mArr(0) = 1
    mArr(1) = 2
    
    sendArray = mArr()
End Function

Sub macro3()
    Dim lArr    'Variant型で受ける事も可能
    Dim i As Long
        
    lArr = sendArray
    
    '表示
    Debug.Print lArr(0)    '結果は1
End Sub

まとめ

 配列の受け渡しでは、配列の()を省略できるケースもあります。
 ただ、後から見直す時に明示的に()を付けておいた方がわかりやすくなると思いますので()を付けるべきところには付けておいた方が良いと思います。
 書き方を変更できないところは赤線。書き方が複数ある場合は青線を表記しましたので参考にしてください。

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