配列の宣言には、Dim関数を使う方法と、Array関数を使う方法の二種類があります。「Dim宣言文があるのに、なぜArray関数があるんだろうか?」そんな疑問を持ったことがあると思います。謎に包まれたArray関数を徹底解説します!
Array関数は、要素から要素数が決まる
Dim宣言文のおさらいからします。配列の宣言をするためには、
①Dim 変数名(要素数)として、要素を入れる箱を作る
②変数名(要素)として、①で用意した箱に要素を入れる
というようにします。
イメージ
コード
Dim 変数名(2) as variant '要素数の宣言
変数名(0) = "A" '要素の決定
変数名(1) = "B" '要素の決定
変数名(2) = "C" '要素の決定
一方、Array関数では、
①要素の決定
②要素数の決定(自動で要素数が決定する)
という流れになります。
イメージ
コード
Dim 変数名 as variant
変数名 = Array("A","B","C") '要素の決定
宣言方法
①Dim 変数名 as variant
②変数名 = Array(要素1,要素2,要素3,…)
というようにします。
注意することは、変数名の型は必ずVariant型にする必要があることです。
変数の型は必ずVariant型にする
試しに、要素が全て文字列だったとして、次のコードを実行してみます。
Dim Myarray As String
Myarray = Array("文字列1", "文字列2", "文字列3")
MsgBox Myarray(0)
結果
コンパイルエラーが発生しました。
同じコードを、Variant型に変更して実行します。
結果
今度は正常に動きました。
要素には型が混在しても大丈夫
Array関数はVariant型にする必要がありますので、Dim宣言文と同様、要素にあらゆる型が混在してもエラーになりません。
Sub 型を混在させる()
Dim Myarray As Variant
Myarray = Array("A", 2, 2025 / 1 / 1)
End Sub
間違った説明がよくなされるが、OptionBaseの影響は受ける
Dim宣言文と同様、デフォルトでは配列のインデックス番号は0から始まる仕様となっていますが、OptionBaseの影響も、同じように受けます。
OptionBaseを1に設定し、以下のコードを実行してみます。
結果
要素数の開始が、1からになっていることが確認出来ます。
しかし、「Array関数のインデックス番号は必ず0から始まる」「OptionBaseの影響は受けない」という間違えた説明がよくされます。この原因は、Excelのバージョンによっては、ヘルプに間違えた記述がされており、そのヘルプを参考に解説をしているためです。
Array関数はArray関数で上書き出来る
Array関数で変数に要素を格納した後、同じ変数にArray関数を使うことで要素の上書きが出来ます。
コード
Sub 要素を上書きする()
Dim Myarray As Variant
Myarray = Array("文字列1", "文字列2", "文字列3")
Myarray = Array("上書き1", "上書き2")
MsgBox Myarray(1)
End Sub
結果
ReDimでも変数の上書きが可能
動的配列を使う場合は、「Dim変数() ReDim変数(要素数)」を使います。
Dim宣言文のときと同様、Array関数でもReDim宣言文を使うことが出来ます。
Sub ReDimを使う()
Dim Myarray As Variant
Myarray = Array("文字列1", "文字列2", "文字列3")
ReDim Myarray(2)
MsgBox UBound(Myarray)
End Sub
結果
要素の最大数が3から2に変更されました。要素の内容をリセットしたくない場合は、Preserveを宣言してください。
多次元配列は使えない
Array関数は1次元配列しか使えないため、多次元配列はDim宣言文で行う必要があります。
次元ごとに要素数を変えることが出来る、ジャグ配列を使える
Array関数に出来て、Dim宣言文では出来ないこととして、ジャグ配列があります。
ジャグ配列とは、次元ごとに要素数を変えることが出来る配列のことです。
ジャグ配列を使うには、Array関数にArray関数を入れ子にします。
Sub ジャグ配列()
Dim Myarray As Variant
Myarray = Array(Array(1, 2, 3), Array(4, 5), Array(6, 7, 8, 9))
End Sub
コードの解説
Myarray = Array(Array(1, 2, 3), Array(4, 5), Array(6, 7, 8, 9))
Myarray(0)の要素は、Array(1,2,3)
Myarray(1)の要素は、Array(4,5)
Myarray(2)の要素は、Array(6,7,8,9)
例えば、Myarray(2)であれば、3行目の要素にアクセスすることになります。
さらに、3行目の4列目、要素「9」にアクセスする場合は、次のように記述します。
Myarray(2)(3)
この記事を読んだあなたが得たこと(まとめ)
- Array関数はまず要素を格納して、自動的に要素数が決まる
- Array関数にはVariant型しか使えない。要素はあらゆる型が混在させることが出来る。
- OptionBaseの影響は受ける。よく間違えられて解説されるので注意する。
- Array関数はArray関数かReDimで上書き出来る。
- Array関数では多次元配列は使えない。
- Array関数でしか使えないジャグ配列が使える。
コメント