For Each文

For 変数 In 配列orコレクション
Exit For
Next
Dim a
Dim v(3)
v(0)=1
v(1)=10
v(2)=30
For Each a In v
Debug.Print a
Next
と書くと配列の中身を順次aに入れながらループします。
但し、その順番は言語仕様上は不定となっています。

コレクションというのはオブジェクトの集合オブジェクトです。
例えばセルのある範囲を示して、セルを順番に処理していくようなことができます。
Dim a As Range
For Each a In Range("A1:A4")
Debug.Print a.Value
Next
細かい解説は省きますが、こんな風に書けます。
セル4つ分の値を出力していきます。

また、ArrayやSplitは配列と見なせるので次のような書き方も可能です。
Dim a,sum
For Each a In Array(1,2,3,4,5,6,7,8,9,10)
sum = sum + a
Next
Debug.Print sum
-

配列連係

連係というのは今ひとつの表現だが、
配列に値を設定する、逆に配列から値を作る、
という時に一行くらいでスマートにできる方法を例示していく。

配列をある初期値で設定することはよくある。
やり方をいくつか考えてみよう。

array Array(vanum,num,...)

まず普通なのはArray関数を使って引数列を配列に変換します。

Dim a
a = Array("First","Second","Third")
MsgBox a(2)

変数名宣言がa()ではなく、aと言う名前のみというのが気持ち悪い(a()とするとエラーになる)。
また、型名はVariant以外を指定してはならない(だからここでは無指定にしている)。
もっと気持ち悪いのが、Arrayの前に例えばa="abc"のように代入してもエラーにはならない。
一体どういうポリシーで動いているのだろうか。

array Split(str1,str2)

PerlのSplitに似ている。
文字列str1を区切り文字str2で区切って配列を作る。

Dim a As Variant
a = Split("Excel,Word", ",")

Arrayと同じく“a”のところは“a()”とするとエラーになる。

文字列を入れる場合はこのArrayを使うよりこのSplitのほうが楽に書ける。
先の例で言えば

Dim a As Variant
a = Split("First,Second,Third",",")
MsgBox a(2)

とすれば結果は同じになる。

よくある、曜日を漢字で配列に入れるときなどは

Dim a As Variant
a = Split("日,月,火,水,木,金,土",",")

とすればArrayで書くよりかなり楽だ。
なお、区切り文字を空白文字にしても良いだろう。
その時は区切り文字の指定を省略できる。

str Join(array[,str])

次に配列から文字列を作る方法。

配列を区切り文字列で結合して文字列にする。
区切り文字を省略時は空白一文字。

Dim a(1)
a(0)="Excel"
a(1)="Word"
Debug.Print Join(a,",")

結果は 

Excel,Word

PerlのJoinに似ているがVBAの配列の使い勝手の悪さ故、使い勝手は良くない。
配列の数が“合っていない”とあまりうまくない。

Dim a(3)
a(0)="Excel"
a(1)="Word"
Debug.Print Join(a,",")

結果は 

Excel,Word,,

という残念な結果になる。
これを回避するにはきちんとDim a(1)とするか、Redimで修正が必要。

-