目次

アレイ

ExcelVBA の配列のテストとして、既存のマクロを、配列を使用したマクロに書き換えてみたいと思います。

配列を使用すると、書き換え前のソースコードの内容によっては、マクロのコードを多少短く出来るようです。

今回の場合、処理の種類が増えるので簡略化とはいかないかもしれません。配列の生成には Array 関数を使用しています。

VBE(Visual Basic Editor 。マクロの編集画面の事です。) のローカルウィンドウの画面です。変数「a」が配列になっています。配列に 3 つの要素が存在していて 50 , 200 , 100 の数字が格納されています。
VBE(Visual Basic Editor 。マクロの編集画面の事です。) のローカルウィンドウの画面です。変数「a」が配列になっています。配列に 3 つの要素が存在していて 50 , 200 , 100 の数字が格納されています。

目次まで戻る

書き換え前のマクロ

下記のマクロは前回の投稿で作成したものです。ワークシートの表示倍率を 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 のローカルウィンドウの画面です。変数「a」が配列になっています。 a(0) , a(1) , a(2) の 3 つの要素が内包されています。コードウィンドウでは、ブレークポイントを設定した行で処理が一時停止しています。黄色の着色をされた行です。
VBE のローカルウィンドウの画面です。変数「a」が配列になっています。 a(0) , a(1) , a(2) の 3 つの要素が内包されています。コードウィンドウでは、ブレークポイントを設定した行で処理が一時停止しています。黄色の着色をされた行です。
ローカルウィンドウの拡大図です。
ローカルウィンドウの拡大図です。

目次まで戻る

配列の値を利用する

配列の値を利用するマクロも作成してみました。配列の中の各要素の値を 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

上記マクロの実行結果は以下の画像のようになりました。

VBE のイミディエイトウィンドウの画面です。debug.print a(配列のインデックス番号) の結果が表示されています。
VBE のイミディエイトウィンドウの画面です。debug.print a(配列のインデックス番号) の結果が表示されています。
イミディエイトウィンドウの拡大図です。
イミディエイトウィンドウの拡大図です。

配列 a をそのまま出力してみるマクロも作成しましたが、実行するとエラーが発生してしまいました。

Sub 配列をDebugPrintで出力してみるマクロ()

Dim a As Variant

a = Array(50, 200, 100)

Debug.Print a

End Sub

上記マクロの実行結果は以下の画像のようになりました。

Debug.Print a の実行結果の画面です。「実行時エラー '13' 型が一致しません。」のエラーが発生してしまいました。
Debug.Print a の実行結果の画面です。「実行時エラー '13' 型が一致しません。」のエラーが発生してしまいました。

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 を日本語に翻訳してみると「配列」「勢揃い」のような意味が出てきました。もしかすると、鉄アレイのアレイは配列というイメージに由来しているのかもしれません。

定かではありませんので、マクロの完了と同時に消去される配列のように、当投稿を見終わった時点で記憶から消去して頂きたいと思います。

以上、閲覧ありがとうございました。

 

目次まで戻る

同じカテゴリの投稿(Excel VBA)

前後の投稿