当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【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ステートメントを使うと、同じプロシージャの中で配列変数の使い回しができたりしますけど … やっぱり使い回しはしないほうがいいです。

コメント

  1. あとりえこばと より:

    【AI解説】VBAの静的配列

    [ChatGPT] VBAの静的配列とは、複数のデータをまとめて管理するためのデータ構造のことです。イメージとしては、複数のデータを入れるための箱のようなものです。静的配列では、あらかじめ指定した大きさ(要素数)で作成されます。例えば、10個のデータを入れるための静的配列を作る場合、最初からその大きさで作成します。静的配列を使うと、まとめて管理したいデータを、一度にたくさん入れることができます。たとえば、クラスの生徒の名前を管理したい場合、静的配列を使えば、複数の名前を一度に入れることができます。静的配列の作り方は簡単です。以下のようなコードで作成することができます。

    Dim 配列名(要素数) As データ型

    例えば、10個の整数を入れるための静的配列を作る場合は、次のようになります。

    Dim numbers(9) As Integer

    このようにすると、numbersという名前の静的配列が作られ、整数型のデータを10個入れることができます。要素番号は0から始まるので、0番目から9番目までの要素を使うことができます。静的配列は、あらかじめ指定した大きさで作成されるため、後から大きさを変更することができません。そのため、データの数が変わる可能性がある場合には、動的配列という別の方法を使う必要があります。静的配列は、複数のデータを一度に管理するために使われる便利なデータ構造です。大量のデータを効率的に処理したり、整理したりする場合に役立ちます。

    【AI討論】VBAのOption Base

    キャラクター:
    トム(Tom):経験豊富な開発者で、Option Baseの熱狂的な支持者。
    ジェニー(Jenny):現場の実務に精通したエンジニアで、Option Baseに懐疑的な意見を持つ。
    マイク(Mike):新入社員で、Option Baseについて初めて聞く。
     
    シーン:
    オフィスの休憩スペース

    トム:みんな、Option Baseについて議論しようぜ!これはVBAの世界を変える素晴らしい機能なんだ!
     
    ジェニー:まあ、トム、そこまで熱くなることはないでしょう。Option Baseはあまり重要ではないと思いますよ。
     
    マイク:えっ、Option Baseって何ですか?初めて聞いたんですが。
     
    トム:マイク、君にも説明するとするか。Option Baseは配列のインデックスの基準を設定するオプションなんだ。
     
    ジェニー:そう、例えばOption Base 1だと、配列の最初の要素のインデックスが1になるわけだ。
     
    トム:だから、直感的にわかりやすくなるんだよ!0から始まるインデックスが苦手な人にとって、Option Baseは救世主なんだ。
     
    ジェニー:でもトム、他の言語では0から始まるインデックスが主流だし、多くの開発者はそれに慣れているんだよ。
     
    トム:でも、VBAではOption Baseのおかげで自分の好きなようにインデックスを設定できるんだ!自由の精神だよ!
     
    マイク:私はまだどちらがいいのかわかりませんが、Option Baseがあると選択肢が広がるんですね。

    ジェニー:まあ、そうかもしれないけど、Option Baseを使うと他の人との互換性も考えなければならないから、コードを共有する場合は注意が必要だよ。
     
    トム:でも、Option Baseの柔軟性は魅力的だし、自分のスタイルでコーディングできるんだ。
     
    ジェニー:確かにその点は魅力的だけど、開発チームでの一貫性を保つためには、Option Baseを統一することも大切だと思うんだ。
     
    マイク:なるほど、Option Baseは選択肢があるけど、チームとしての方針や他の言語との互換性も考えながら使う必要があるんですね。
     
    トム:そういうことだ!Option BaseはVBA開発の面白いディスカッションの一つだよ!
     
    ジェニー:まあ、ディスカッションが盛り上がるのはいいことだけど、最終的には現場のニーズやチームの方針に合わせて適切な選択をするのが大切だよね。
     
    マイク:了解しました!Option Baseについて、さまざまな視点から考える必要があるんですね。ありがとうございます!