目次
アレイ
ExcelVBA の配列のテストとして、既存のマクロを、配列を使用したマクロに書き換えてみたいと思います。
配列を使用すると、書き換え前のソースコードの内容によっては、マクロのコードを多少短く出来るようです。
今回の場合、処理の種類が増えるので簡略化とはいかないかもしれません。配列の生成には Array 関数を使用しています。
書き換え前のマクロ
下記のマクロは前回の投稿で作成したものです。ワークシートの表示倍率を 3 回設定する内容になっています。
Sub ワークシートの表示倍率を変更するマクロ()
Dim a As Variant '「設定」に使用する自由な名前の変数です。
Dim b As Variant '「取得」に使用する自由な名前の変数です。
'1 回目
a = 50 'パーセント単位の表示倍率
ActiveWindow.Zoom = a '設定
b = ActiveWindow.Zoom '取得
MsgBox "表示倍率を " & b & "% に変更しました。" ’メッセージ表示
'2 回目
a = 200
ActiveWindow.Zoom = a
b = ActiveWindow.Zoom
MsgBox "表示倍率を " & b & "% に変更しました。"
'3 回目
a = 100
ActiveWindow.Zoom = a
b = ActiveWindow.Zoom
MsgBox "表示倍率を " & b & "% に変更しました。"
End Sub
書き換え後のマクロ
書き換えたマクロは下記のようになりました。書き換え前のマクロと比較すると、マクロの行数が少なく済んでいます。 Array 関数を使用した効果が表れたようです。
Sub ワークシートの表示倍率を変更するマクロ_配列のテストとして()
Dim a As Variant
Dim b As Variant
For Each a In Array(50, 200, 100)
ActiveWindow.Zoom = a
b = ActiveWindow.Zoom
MsgBox "表示倍率を " & b & "% に変更しました。"
Next
End Sub
コメントを入れると長くなってしまいましたが、上記マクロの説明付きのコードです。
Sub ワークシートの表示倍率を変更するマクロ_配列のテストとして()
Dim a As Variant 'ループの都度この変数に数値が格納されます。自由な名前の変数です。
Dim b As Variant '取得した値を格納するための自由な名前の変数です。
For Each a In Array(50, 200, 100) ’配列の各要素を左から順番にループします。 3 回処理を行います。
ActiveWindow.Zoom = a '設定
b = ActiveWindow.Zoom '取得
MsgBox "表示倍率を " & b & "% に変更しました。" 'Excel の画面にメッセージを表示します。
Next ’For まで戻ります。配列の次の要素を処理します。
'配列の全ての要素が処理されると、この行に来ます。
End Sub
上記マクロの「Array(50, 200, 100)」の部分で配列を生成しています。配列は複数の値をグループ化したもののようです。
ここで生成した配列は、マクロが完了するまでの間、パソコン内部に一時的に記録されているようです。
私の場合は、文字をコピー、ペーストする際に、コピーした文字がパソコンのどこかに保存されているのと同様のイメージで捉えています。
「For Each Next」ステートメントのループ処理で、配列の中の数字を左から順番に処理しています。ループの都度、変数「a」に数字が代入されるようです。
ループ回数 | ループ中の a の値 |
---|---|
1 回目 | 50 |
2 回目 | 200 |
3 回目 | 100 |
配列の中身を見てみる
配列の中身を VBE(Visual Basic Editor)のローカルウィンドウで確認するマクロも作成してみました。
Sub 配列の中身をVBEのローカルウィンドウで確認するマクロ()
Dim a As Variant 'バリアント型。この時点では中身は空( Empty 値)です。
a = Array(50, 200, 100) 'a に 3 つの要素が生成されて 3 つの数字がそれぞれ格納されるようです。
End Sub ’この行にブレークポイントを設定しておきました。この行に文字入力のカーソルを合わせて「F9」キーを押すとブレークポイントが設定されると思います。
上記マクロの実行結果は以下の画像のようになりました。
配列の値を利用する
配列の値を利用するマクロも作成してみました。配列の中の各要素の値を VBE のイミディエイトウィンドウに表示する内容になっています。
Sub 配列の値を利用するマクロ()
Dim a As Variant 'バリアント型です。名前は自由です。
a = Array(50, 200, 100) '変数 a の中に a(0) , a(1) , a(2) の要素が生成されます。
’「配列名(配列のインデックス番号) 」の書式で配列内の各要素の値を取得出来るようです。
Debug.Print a(0) '50 と表示されるはずです。
Debug.Print a(1) '200 と表示されるはずです。
Debug.Print a(2) '100 と表示されるはずです。
End Sub
上記マクロの実行結果は以下の画像のようになりました。
配列 a をそのまま出力してみるマクロも作成しましたが、実行するとエラーが発生してしまいました。
Sub 配列をDebugPrintで出力してみるマクロ()
Dim a As Variant
a = Array(50, 200, 100)
Debug.Print a
End Sub
上記マクロの実行結果は以下の画像のようになりました。
Join 関数を使用すると、配列の各要素の値を指定の文字列で連結して、連結した結果を文字列として取得する事が出来るようです。
Sub join関数で配列内の各値を連結して出力するマクロ()
Dim a As Variant
a = Array(50, 200, 100)
Debug.Print Join(a, ",") '配列をカンマ( , )で区切って出力します。
Debug.Print Join(a, vbNewLine) '配列を改行で区切って出力します。
End Sub
上記マクロを実行すると、イミディエイトウィンドウに以下の内容が出力されました。
50,200,100
50
200
100
テスト環境
- Windows 10(64 ビット)
- Microsoft Office Excel 2003
あとがき
Array の読み方は「アレイ」となるようです。鉄アレイというものが有りますが、鉄アレイの言葉をインターネットで英語に翻訳してみると iron array となりました。
array を日本語に翻訳してみると「配列」「勢揃い」のような意味が出てきました。もしかすると、鉄アレイのアレイは配列というイメージに由来しているのかもしれません。
定かではありませんので、マクロの完了と同時に消去される配列のように、当投稿を見終わった時点で記憶から消去して頂きたいと思います。
以上、閲覧ありがとうございました。