配列を扱うための必須の知識、 Lbound、Ubaound、OptionBase 102回

配列を扱うための必須の知識、 Lbound、Ubaound、OptionBase

マクロ講座 動画編 102回
マクロ講座

動画でExcel 配列を扱うための必須の知識、 LBound、UBound、OptionBase

配列を扱うための必須の知識、LBound・UBound・Option Base

このページは、動画版「マクロ講座 102回:配列を扱うための必須の知識」の解説記事です。
Excel VBA では、データをまとめて扱うために配列を使うことがとても重要です。配列を正しく理解できると、コード量が大幅に減り、処理速度も向上します。
ここでは、配列を扱う上で必ず知っておくべき基礎知識として、次の3つを解説します。

  • 配列のインデックス(添字)の仕組みと、0 始まり・1 始まりの違い
  • LBound / UBound を使って「配列の最小値・最大値」を取得する方法
  • データ数が分からない場合に、セル範囲から配列を作る方法

(サンプルファイルは、こちらです。 配列を扱うための必須の知識、LBound、UBound、OptionBase、サンプル102回

マクロ動画 配列を扱うための必須の知識、 Lbound、Ubaound、OptionBase

1. まずは 1 次元配列を作ってみよう

この記事と動画で学べる内容

  • セル範囲の値を配列に取り込む基本パターン
  • 配列のインデックスの仕組み(0 始まり・1 始まり)
  • Option Base と To 指定によるインデックスの変更方法
  • LBound / UBound を使って配列サイズを動的に扱う方法
  • データ件数が不明なときに、セル範囲から配列を作る実践的な方法
  • ローカルウィンドウで配列の中身を確認する方法

■ 配列の基本:0 から始まる理由

配列を宣言するとき、次のように書くとします。 Dim brancharr(9) As Variant

この配列は「10 個」の要素を持っています。 なぜなら VBA の配列は基本的に **0 から始まる** からです。
最小インデックス → 0
最大インデックス → 9
要素数 → 10
このように理解すると、配列の仕組みが見えてきます。

配列を扱うための必須知識、タイトル01

■ セル範囲の値を配列に入れる基本パターン

  1. 次のように書けば、コードは一気に短くなります。

      Dim brancharr(9) As Variant
      Dim r As Long
    
      For r = 0 To 9
          brancharr(r) = Cells(r + 1, 1).Value
      Next r
    
  2. ■ 配列を 1 始まりにする方法

  3. 配列のインデックスを「1 から始めたい」場合は次の2つの方法があります。
    ① Option Base 1 を使う
    モジュールの先頭に次の 1 行を書きます。
    Option Base 1
    すると、
    Dim brancharr(9)
    は 1~9 の配列になります。

  • To を使って宣言する

    もう一つの方法は、配列変数の宣言時に、かっこの中のインデックスを1 to 10のように、明示的に1から始まると書く方法です。

    Dim brancharr(1 To 10) As Variant
    これは Option Base の設定に関係なく、必ず 1 始まり になります。

    配列を扱うための必須知識、タイトル05
  • Split関数は例外Option Base 1 が効かない

  • Split 関数は Option Base の影響を受けません。

    Split関数を使用して配列を作成する場合、Option Baseステートメントはインデックスの番号付けに影響を与えず、常に0から始まります。

    配列を扱うための必須知識、タイトル06
  • ■ LBound・UBound で安全に配列を扱う

      Sub oneDimension()
      Dim brancharr(9) As Variant
      Dim r As Long
          For r = 0 To 9
              brancharr(r) = Cells(r + 1, 1).Value
          Next r
      End Sub
      
    1. LBound関数とUBound関数を使用すると、 配列の最小インデックスと最大インデックス安全に取得できます。
      配列の範囲を自動で判断してくれるので、数字を手書きする必要がありません。

      LBound(arrayname, dimension)は最小インデックスを返し、UBound(arrayname)は最大インデックスを返します。

      配列を扱うための必須知識、タイトル07
    2. For 文をすべて LBound / UBound に置き換える

          For r = LBound(brancharr) To UBound(brancharr)
          Debug.Print brancharr(r)
          Next r
        

      インデックスの最小値0は、LBound(brancharr,1)に書き換えることができます。
      同様にインデックスの最大値9は、UBound(brancharr,1)に書き換えることができます。dimension次元を省略すると、1次元とみなされます。

      配列を扱うための必須知識、タイトル08

    配列をローカルウィンドーで確認する

    1. シートから1次元配列を取得するマクロを実行しましょう。 マクロをステップ実行すると、配列の「今どんな値が入っているか」をローカルウィンドウで確認できます。 これは配列を扱うときに非常に役立つツールです。

      配列を扱うための必須知識、タイトル09
    2. ■ データ件数が不明なときの配列作成(動的配列)

    3. 配列を使いたい時には通常、Dim brancharr(9) As Variantのように宣言します。
      しかし、配列を宣言するときに「要素数が分からない」というケースはよくあります。 その場合は、まずデータ件数を調べ、その数だけ配列を作ります。
      そのために、動的配列があります。宣言時は、要素数を指定しないで宣言することができます。
      Dim brancharr() As Variant
      シートから取得する場合は、要素数となるデータがいくつあるか、行数を数えればいいのです。

      配列を扱うための必須知識、タイトル10
    4. 「データが何件あるか」を数える

    5. 変数にmaxubというLong型を宣言しました。これはインデックスの最大値を取得するための変数です。
      maxub = Range("A1", Range("A1").End(xlDown)).Cells.Count
      Range("A1")から、データのある最終行までのセルをカウントします。


      ② 動的配列として再宣言する(ReDim)
      ReDim brancharr(1 To maxub)
      配列を扱うための必須知識、タイトル01
    6. Sub oneDimension_ubcount()
      Dim brancharr() As Variant
      Dim r As Long, maxub As Long
          maxub = Range("A1", Range("A1").End(xlDown)).Cells.Count
          ReDim brancharr(1 To maxub)
      '    For r = LBound(brancharr) To UBound(brancharr)
          For r = 1 To maxub
              brancharr(r) = Cells(r, 1).Value
          Next r
      End Sub
      

      ポイント:動的配列として再宣言する(ReDim)

    7. 最初の宣言時には、brancharr()は要素数が決まっていませんでしたが、 maxub でセルの個数が分かりましたから、当然配列のサイズも決まります。
      ReDimステートメント を使って配列のサイズを宣言します。
      サイズを宣言したことにより、LBound関数とUBound関数が使えるようになりました。
      ReDim brancharr(1 To maxub)

      このようにデータをシートから取得する場合は、データの数を求めることで配列のサイズを調べることができます。

    まとめ

    配列を使いこなすことは、VBA のスキルアップに直結します。 特に LBound / UBound や動的配列の考え方は、実務で配列を扱う際に欠かせません。

    • 配列のインデックスは基本 0 から始まるが、1 に変える方法もある
    • Option Base と「To」は用途が異なる
    • LBound / UBound を使えば、配列の範囲を安全に扱える
    • セルのデータ数を数えれば、配列サイズを動的に決められる
    • ローカルウィンドウで配列の中身を確認できる

    これらを理解すると、配列を使った処理がぐっと楽になります。ぜひ動画と合わせて学習してみてください。