「配列には割り当てられません」

エラー

配列の初期化で発生するエラー

 配列の初期化を行うときに「配列には割り当てられません」というエラーが発生する時があります。VBAに慣れた人でも目にすることがあるのではないでしょうか?
 今回は原因と注意点についてまとめてみます。

配列の初期化でエラーが発生する例

 静的な配列の初期化をする際、以下のようなコードを書くと「配列には割り当てられません」とエラーが発生します。

Sub macro()
    Dim Arr(3) As Long    
    Arr = Array(0.1, 2, 3)    'error
    Debug.Print Arr(3)
End Sub

 原因は、Array関数が返すのはVariant型なので、型の不一致ということになります。

静的配列の初期化は1個づつ

 上記のように、静的なLong型の配列を初期化する場合には、1個づつ値を入れていくしかないようです。

Sub macro2()
    Dim Arr(3) As Long
    Arr(0) = 0
    Arr(1) = 1
    Arr(2) = 2
    Arr(3) = 3   
    Debug.Print Arr(3)
End Sub

 数が多いと冗長になって恰好が悪いですね、、、
 次はFor文を使った例です。

Sub macro3()
    Dim Arr(3) As Long
    Dim v As Variant, i As Long
    i = 0
    v = Array(0, 1, 2, 3)
    For i = 0 To 3
        Arr(i) = v(i)
    Next i
    
    Debug.Print Arr(3)
End Sub

 要素を一行で書けますが、変数の数が多くなってしまします。
 もっと簡単な方法は無いの?と調べたのですがダメそうですね、、、

Splitを使う方法

 Variant型でなく、文字列型限定なら以下のような書き方ができます。
 ただ、Split関数は動的配列を返してくるので静的配列の変数は受け付けてくれません。

Sub macro4()
    Dim Arr() As String
    
    Arr = Split("0,1,2,3", ",")
    Debug.Print Arr(3)
End Sub

Rangeを配列に入れる方法

 Rangeを直接配列に入れる事もできます。
 この時、受け取る配列はVariant型でなければエラーとなります。
 また、二次配列として受け取る性質があるので、その辺も考慮しないといけません。

Sub macro5()
    Dim Arr() As Variant  
    Arr = Range("A1:D1")
    Debug.Print Arr(1, 4)
End Sub

結論

 これまでの例から、以下のような印象を受けました。

 ・Variant型以外で、要素数の決まった静的配列1個づつ値を入れていくしかない。
 ・VBAは動的配列を使うと便利なように出来ている。

 VBAの配列系の関数は、動的配列として受けるものが殆どなので、動的配列を扱うようなプログラムにすればスマートな書き方ができるのだと感じました。

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