『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】静的配列とOption Baseステートメント

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

【VBA】静的配列

配列について説明するために簡単なマクロを作ってみます。

'[VBA] 静的配列サンプルコード(1)

Sub Sweets_A()

  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

Sweets_A() を実行すると数値の入力が促されます。たとえば「0」を入力すると「チョコケーキ」が返ってきます。「2」を入力すると「アップルパイ」が戻ってきます。こんな美味しそうなマクロが作れてしまうのも、配列変数を使っているからこそなのです。使わなくてもできますが、長くて見た目の悪いマクロになってしまいます。
 
上のマクロで何をやっているかといえば、何も入っていない「番号のついた空箱」を 5 つもってきて 1 つ 1 つに文字列を入れてます。必ずしも全部の箱を使わなくてもかまいませんよ。空のままにしておいても別にどうってことないのです。まあとにかく、空であろうと中身が入っていようと、この箱のことを「配列変数」とよびます。それぞれの箱についている番号のことを「インデックス番号」、箱の数のことを「要素数」とよびます。配列変数を使うときは

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

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

【VBA】Option Baseステートメント

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

Option Base 1

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

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

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

'[VBA] 静的配列サンプルコード(2)

Option Base 1

Sub Sweets_B()

  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」から順に入れていきます。

【VBA】To キーワード

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

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

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

'[VBA] 静的配列サンプルコード(3)

Option Base 1

Sub Kobato_Mari_Suzune()

  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

Kobato_Mari_Suzune() を実行すると、イミディエイトウィンドウに

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

と並びます。

【VBA】Eraseステートメント

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

'[VBA] 静的配列サンプルコード(4)

Option Base 1

Sub Kobato_Mari_Suzune_2()

  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 は初期化されて空になっているので、Kobato_Mari_Suzune_2() を実行しても何も表示されないはずです。Eraseステートメントを使うと、同じプロシージャの中で配列変数の使い回しができたりしますけど … やっぱり使い回しはしないほうがいいです。

コメント