[VBA] 静的配列と Option Base ステートメント

 VBA で本格的なプログラミングをしようと思ったら、配列変数 は欠かせません。これがないと、大きなマクロの高速処理ができません。もう必須中の必須知識と言ってもいいぐらいです。「配列変数」と聞くと、なんだか難しそうなイメージがありますが、実は VBA のなかでも、どちらかといえば簡単な概念なので、名称に惑わされずにさっさと使い方を覚えてしまいましょう。漢字って必要以上に人を警戒させますよね。
 

静的配列を用いたマクロ

 まずは簡単なマクロを書いてみますよ~。

 'スイーツマクロA

 Sub SweetsA()

 Dim i As Integer
 Dim mymsg As String
 Dim mysweet(4) As String

 mymsg = "0 ~ 4 の番号を入力してくださいな"
 i = Application.InputBox(prompt:=mymsg, Type:=1)

 mysweet(0) = "チョコケーキ"
 mysweet(1) = "バニラアイス"
 mysweet(2) = "アップルパイ"
 mysweet(3) = "パンケーキ"
 mysweet(4) = "お汁粉"

 MsgBox mysweet(i)

 End Sub

 このマクロを実行すると数値の入力が促されます。
 たとえば「 0 」を入力すると「チョコケーキ」が返ってきます。
 「 2 」を入力すると「アップルパイ」が戻ってきます。
 楽しいのねー♪ 愉快なのねー♪
 こんな素晴らしいマクロが作れちゃうのも、配列変数を使っているからこそなのです。そりゃ使わなくてもできるけど、長くて見た目の悪いマクロになってしまいます。上のマクロで何をやっているかといえば、

Dim mysweet(4) As String

という宣言文で

mysweet(0)
mysweet(1)
mysweet(2)
mysweet(3)
mysweet(4)

という 5 つの文字列型変数を用意しているのです。要するに何も入っていない「番号のついた空箱」を 5 つもってきて「 1 つ 1 つに好きな物を入れましょー♪」てことです。必ずしも全部の箱を使わなくてもかまいませんよ。空のままにしておいても別にどうってことないのです。それでは、この箱にこばとの大好きなものを入れますよー。

 mysweet(0) = "チョコケーキ"
 mysweet(1) = "バニラアイス"
 mysweet(2) = "アップルパイ"
 mysweet(3) = "パンケーキ"
 mysweet(4) = "お汁粉"

 これで完成ねー。あとはユーザーさんが入力した数値に応じて、お菓子が取り出されるということです。愉快ねー。まあとにかく、空であろうと中身が入っていようと、この箱のことを「配列変数」とよびます。それぞれの箱についている番号のことを「インデックス番号」、箱の数のことを「要素数」とよびます。配列変数を使うときは

Dim 変数名(インデックス番号の上限値) As データ型

という形で変数が配列であることを明言しておきます。インデックス番号は 0 から始まっていて、要素数は [インデックス番号の上限値 + 1] となることに注意してくださいな。基本はそうなっていますが、以下で説明する Option Base ステートメントを記述したときには要素数が変わってしまいます。ちなみに、宣言によって予め要素数が決まっている配列のことを 静的配列 とよびます。それに対して要素数が可変である配列のことを動的配列といいます。
 

Option Base ステートメント

 配列のインデックス番号が 0 から始まることに違和感を覚える人も多いかもしれません。こばともそうです。そのままの形ではコードを書くときに勘違いが生じて、繰り返し処理などで思わぬミスが生じるかもしれません。そこで宣言セクションに

Option Base 1

と書いておくと、インデックス番号の下限値は 1 となります。この場合、配列を

Dim 変数名(インデックス番号の上限値) As データ型

と宣言したときに、配列の要素数は [インデックス番号の上限値] に一致するので、マクロが見やすくなります。さきほどの Sweetsマクロを書き直すと次のようになりますよ。

 Option Base 1

 'スイーツマクロB

 Sub SweetsB()

 Dim i As Integer
 Dim mymsg As String
 Dim mysweet(5) As String

 mymsg = "1 ~ 5 の番号を入力してくださいな"
 i = Application.InputBox(prompt:=mymsg, Type:=1)

 mysweet(1) = "チョコケーキ"
 mysweet(2) = "バニラアイス"
 mysweet(3) = "アップルパイ"
 mysweet(4) = "パンケーキ"
 mysweet(5) = "お汁粉"

 MsgBox mysweet(i)

 End Sub

 インデックス番号の下限値を 1 にしたので、

Dim mysweet(5) As String

と書いて、インデックス番号の上限値を「 5 」としておきます。また配列変数にデータも

mysweet(1) = "チョコケーキ"

のようにインデックス番号 1 から順に入れていきます。
 

To キーワードで配列を宣言します

 インデックス番号の下限値と上限値を To キーワードで設定することもできます。

Dim 変数名(下限値 To 上限値) As データ型

 この場合の配列の要素数は「上限値 - 下限値 + 1 」となります。仮に宣言セクションで Option Base 1 を設定していても、To キーワードによる設定は影響を受けません。また、この書き方は他の人がマクロを読むときにも、誤解が生じにくいというメリットがあります。

 'Toキーワードのテストですよ

 Option Base 1

 Sub WBOX()

 Dim i As Integer
 Dim wordbox(2 To 4) As String

 wordbox(2) = "こばとちゃん"
 wordbox(3) = "マリちゃん"
 wordbox(4) = "涼音さん"

 For i = 2 To 4
  Debug.Print wordbox(i),
 Next i

 End Sub

 マクロを実行すると、イミディエイトウィンドウに

こばとちゃん、マリちゃん、涼音さん

と並びます。
 

Eraseステートメントで配列変数を初期化します

 中身の入った配列を全部初期化して空にしたいときは Eraseステートメントを使います。さきほどの WBOX マクロの中に Eraseステートメントを入れてみましょう。

 'Erase のテストですよ

 Option Base 1

 Sub WBOX()

 Dim i As Integer
 Dim wordbox(2 To 4) As String

 wordbox(2) = "こばとちゃん"
 wordbox(3) = "マリちゃん"
 wordbox(4) = "涼音さん"

 Erase wordbox

 For i = 2 To 4
  Debug.Print wordbox(i),
 Next i

 End Sub

 配列変数 wordbox は初期化されて空になっているので、このマクロを実行しても何も表示されないはずです。Eraseステートメントを使うと、同じマクロの中で配列変数の使い回しができたりしますけど ...... やっぱり使い回しはしないほうがいいです。

スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)