【基礎から実用まで】Array関数を完全解剖

Uncategorized

配列の宣言には、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関数でしか使えないジャグ配列が使える。

コメント

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