スポンサーリンク
配列をArrayで作成する
前回の記事で、配列arrに「Excel」「VBA」「マクロ」という3要素を格納する例を書いた。
これは、Arrayという関数を使って、次のように書くこともできる。
1 2 3 |
Dim arr As Variant arr = Array("Excel", "VBA", "マクロ") |
前回の例では
arr(2) = “VBA”
arr(3) = “マクロ”
と改行区切りして書いたが、それを1行で一気に書いたわけだ。
Arrayは必ずVariant型で宣言
そして前回の例では、配列の型はVariant型以外で宣言しても動作すると書いたが、このArrayを使う方法ではそれは駄目だ。
Arrayを使う方法では、必ず配列はVariant型で宣言しないとエラーになる。今回の例だと、変数arrは必ずVariant型にしないといけない。
それもあるから配列は、あらゆる場面でVariant型で宣言しておくのが無難だ。
配列の要素数とか、どういう要素を配列に入れるのかが予め明らかな場合は、私はこのArrayを使うことが比較的多い。
もっともそういうケース自体が、少ないけどね。
Arrayの要素数
そしてこのArrayを使う方法、先程とは違って、最初で配列arrの要素数を宣言していない。
ではarrの要素数を宣言して
1 2 3 |
Dim arr(1 To 3) As Variant arr = Array("Excel", "VBA", "マクロ") |
などとすると、「配列には割り当てられません」とエラーになる。
arrを、Variant型で宣言し、なおかつ要素数を最初で宣言しないようにしないと、Arrayとしては使えないということだ。
さてそうなると、配列arrの要素数を宣言していないということは、arrの開始添字を明言していないということで、添字は強制的に0始まりになってしまうということだ。
添字を1開始にする方法
こういう場合は
というように、何もないデータを擬似的に、最初に挿入しておくという方法が最も有効だと考えられる。
この方法では、実際にArrayの添字が0開始になったわけではない。
これを用いた下記のソースコードを、前回扱ったようにF8キーでステップ実行してみる。
1 2 3 4 |
Dim arr As Variant arr = Array("", "Excel", "VBA", "マクロ") Debug.Print arr(0) |
そしてローカルウィンドウでarrの中身を見ると、最初のarr(0)に何もない文字列が入っている。
この何もない文字列が配列の中に存在するにはするが、それは無視してarr(0)は無いものと扱い、arr(1)から始まるものとみなそうということだ。
そういうArrayを作って、具体的にどういう場面で使うかと言うと例示が難しいが、次のSplit関数の方がイメージしやすいのでそちらで説明する。
Split関数で1次元配列を生成
VBAで必ず覚えておきたいSplit関数は、(1次元)配列を生成することになる関数だ。
これは、文字列を、カンマとかの文字列で区切った配列を生成する。たとえば
とすれば、文字列
1,2,3,4
をカンマ,で区切った「1」「2」「3」「4」を配列として返すことになる。
では、このSplit関数の結果を、次のように変数arrに代入してみる。
1 2 3 4 |
Dim arr As Variant arr = Split("1,2,3,4", ",") Debug.Print arr(0) |
そしてローカルウィンドウで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開始と明言したらどうなるか。
1 2 3 |
Dim arr(1 To 4) As Variant arr = Split("1,2,3,4", ",") |
これはもう、Arrayのときと同じように「配列には割り当てられません」エラーになるだけだ。
だから、Split関数の添字を1開始に物理的変更すること自体はできないので、先ほどの説明と同様
と、最初(「1」の前)にカンマ文字を追加しておいて、カンマ区切りしたとき「1」が2番目に来るようにすれば良い。
Split関数を使ってみる
ちょっとスマートでない例だが、このSplit関数を使った処理を示してみる。
下図のA列にある年月日を、「/」文字列で分割してB列・C列・D列に記入するのに、Split関数を使ってやってみる。
ソースコードはこんな感じになる(実際の業務ではもっとスマートに処理するが)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub Test Dim arr As Variant Dim ws As Worksheet: Set ws = ActiveSheet Dim r As Long Dim c As Long For r = 2 To 10 '最初に「/」文字を追加した上で、「/」文字で区切る arr = Split("/" & ws.Cells(r, 1).Value, "/") 'B列~D列に配列の値をセット 'arrの添字に当たるcを1開始にできる For c = 1 To 3 ws.Cells(r, c + 1).Value = arr(c) Next c Next r End Sub |
区切り文字の「/」文字を最初に追加することで、arrの開始添字を1とみなしているわけだ。
この処理により、年・月・日が分割されてB列・C列・D列に書き込まれる。
さて、1次元配列の勉強に時間を掛けすぎても仕方がない。
Excel VBAの配列は、2次元配列が本番だ。次回から2次元配列を扱う。
スポンサーリンク