Excel VBA 配列について(2)1次元配列の別類型

Excel マクロ、VBA

スポンサーリンク

配列をArrayで作成する

Excel VBA 配列について(1)1次元配列の基本

2020年3月20日

前回の記事で、配列arrに「Excel」「VBA」「マクロ」という3要素を格納する例を書いた。
これは、Arrayという関数を使って、次のように書くこともできる。

前回の例では

arr(1) = “Excel”
arr(2) = “VBA”
arr(3) = “マクロ”

と改行区切りして書いたが、それを1行で一気に書いたわけだ。

Arrayは必ずVariant型で宣言

そして前回の例では、配列の型はVariant型以外で宣言しても動作すると書いたが、このArrayを使う方法ではそれは駄目だ。

Arrayを使う方法では、必ず配列はVariant型で宣言しないとエラーになる。今回の例だと、変数arrは必ずVariant型にしないといけない。

それもあるから配列は、あらゆる場面でVariant型で宣言しておくのが無難だ。

配列の要素数とか、どういう要素を配列に入れるのかが予め明らかな場合は、私はこのArrayを使うことが比較的多い。
もっともそういうケース自体が、少ないけどね。

Arrayの要素数

そしてこのArrayを使う方法、先程とは違って、最初で配列arrの要素数を宣言していない。
ではarrの要素数を宣言して

などとすると、「配列には割り当てられません」とエラーになる。

エラーメッセージ

arrを、Variant型で宣言し、なおかつ要素数を最初で宣言しないようにしないと、Arrayとしては使えないということだ。

さてそうなると、配列arrの要素数を宣言していないということは、arrの開始添字を明言していないということで、添字は強制的に0始まりになってしまうということだ。

添字を1開始にする方法

ではこれ、添字を1開始にするためにはどうすれば良いか。

こういう場合は

arr = Array(“”,“Excel”, “VBA”, “マクロ”)

というように、何もないデータを擬似的に、最初に挿入しておくという方法が最も有効だと考えられる。

この方法では、実際にArrayの添字が0開始になったわけではない。
これを用いた下記のソースコードを、前回扱ったようにF8キーでステップ実行してみる。

そしてローカルウィンドウでarrの中身を見ると、最初のarr(0)に何もない文字列が入っている。

ローカルウィンドウ

この何もない文字列が配列の中に存在するにはするが、それは無視してarr(0)は無いものと扱い、arr(1)から始まるものとみなそうということだ。

そういうArrayを作って、具体的にどういう場面で使うかと言うと例示が難しいが、次のSplit関数の方がイメージしやすいのでそちらで説明する。

Split関数で1次元配列を生成

VBAで必ず覚えておきたいSplit関数は、(1次元)配列を生成することになる関数だ。

これは、文字列を、カンマとかの文字列で区切った配列を生成する。たとえば

Split(“1,2,3,4” , ,)

とすれば、文字列
1,2,3,4
をカンマ,で区切った「1」「2」「3」「4」を配列として返すことになる。

では、このSplit関数の結果を、次のように変数arrに代入してみる。

そしてローカルウィンドウでarrの中身を見ると、

ローカルウィンドウ

このようにarr(0)~arr(3)までに、カンマ区切りした文字列が格納されている。

そしてここで強調しておきたいのが、Split関数で生成された1次元配列は、必ず添字が0開始になるということだ。

Split関数で生成される配列の添字は扱いが難しい

前回、配列の添字を1開始にするには「Option Base 1」という記述を使う方法があるとチラッと言ってお勧めせずスルーしたが、実はSplit関数にはこの「Option Base 1」が通用しない。

つまり「Option Base 1」なんて書こうとも、Split関数で生成された1次元配列の添字が0開始なのは変えられない(Arrayなら一応変えられるが)。
それが、私が「Option Base 1」をお勧めしない大きな理由だ。

では次のように、arrの添字を1開始と明言したらどうなるか。

これはもう、Arrayのときと同じように「配列には割り当てられません」エラーになるだけだ。

エラーメッセージ

だから、Split関数の添字を1開始に物理的変更すること自体はできないので、先ほどの説明と同様

arr = Split(“ ,1,2,3,4” , ,)

と、最初(「1」の前)にカンマ文字を追加しておいて、カンマ区切りしたとき「1」が2番目に来るようにすれば良い。

Split関数を使ってみる

ちょっとスマートでない例だが、このSplit関数を使った処理を示してみる。

下図のA列にある年月日を、「/」文字列で分割してB列・C列・D列に記入するのに、Split関数を使ってやってみる。

年月日情報をSplit関数で「/」文字で分け、年・月・日に分割する

ソースコードはこんな感じになる(実際の業務ではもっとスマートに処理するが)。

区切り文字の「/」文字を最初に追加することで、arrの開始添字を1とみなしているわけだ。

この処理により、年・月・日が分割されてB列・C列・D列に書き込まれる。

分割後

さて、1次元配列の勉強に時間を掛けすぎても仕方がない。
Excel VBAの配列は、2次元配列が本番だ。次回から2次元配列を扱う。

スポンサーリンク