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

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

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

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

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

動画版「マクロ講座102回配列を扱うための必須の知識」の記事解説です。
マクロ上級者になるために、配列の知識は必須です。
今回は配列を扱う上での必須の知識について解説しています。
1.配列の括弧の中の数字は配列の要素数を表します。
インデックス番号の最大値です。通常は0から始まりますが、インデックスが0から始まることで分かりづらいという場合は、1から始めることができます。
OptionBaseステートメントを使う方法と、Toキーワード‘を使って、インデックス番号の最小値と量大値を指定する方法です。
2.配列のインデックス番号の最大値、最小値 Lbound、Ubaoundを使って、コードを簡略化
3.不明な要素の数は、数えてしまえばよい!
さらに要素数が不明な配列をセル範囲から取得するコードを紹介します。
4.配列に必須のローカルウィンドーの使い方
(サンプルファイルは、こちらです。 配列を扱うための必須の知識、 Lbound、Ubaound、OptionBase、サンプル102回

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

1次元配列の作り方

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

  • 配列を使用してセル範囲のデータを効率的に取り込む方法
  • 配列の要素に対応するセルの値を取得する方法
  • Forループを使用して配列にデータを格納する方法
  • 配列のデフォルトのインデックス(0から始まる)と、1から始まるインデックスの設定方法
  • LBound関数とUBound関数を使用して配列の最小値と最大値を取得する方法
  • 配列変数のデータ型の指定方法と、適切なデータ型の選択
  • プログラムのステップ実行とローカルウィンドウの活用による変数の値を確認する方法
  1. セル範囲を配列に取り込む場合には、1個ずつ取り込んでいきました。A1:A10まで brancharr という配列に入れましょう。配列は0から始まるので、Dim brancharr(9) と書いてあるのは要素が10個の意味になります。

    配列を扱うための必須知識、タイトル01
  2. brancharr(0) = Range("A1").Value
    のように、セルの値を配列に代入していきます。
    確実に配列が何かがわかるのコードです。

    配列を扱うための必須知識、タイトル02
  3. 上記ですと、手間がかかりすぎるのと、データが多い時には非常に長くなってしまうので、For文でループを使用して配列にデータを格納することもできます。rという変数を繰り返し処理のために追加しています。

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

配列のインデックスを1から始める方法

  1. 配列が0から始まるというのが扱いにくいのであれば、これを1から始めることもできます。モジュールの宣言部分に、Option Base 1と記載します。

    配列を扱うための必須知識、タイトル04
  2. もう一つの方法は、配列変数の宣言時に、かっこの中のインデックスを1 to 10のように、明示的に1から始まると書く方法です。

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

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

    配列を扱うための必須知識、タイトル06
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

LBound関数とUBound関数

  1. LBound関数とUBound関数を使用すると、 配列の最小インデックスと最大インデックスを求めることができます。LBound(arrayname, dimension)は最小インデックスを返し、UBound(arrayname)は最大インデックスを返します。

    配列を扱うための必須知識、タイトル07
  2. インデックスの最小値0は、LBound(brancharr,1)に書き換えることができます。
    同様にインデックスの最大値9は、UBound(brancharr,1)に書き換えることができます。dimension次元を省略すると、1次元とみなされます。

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

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

  1. シートから1次元配列を取得するマクロを実行しましょう。マクロの実行中に取得し配列に格納される様子を、ローカルウィンドーで確認することができます。

    配列を扱うための必須知識、タイトル09
  2. 配列を使いたい時には通常、Dim brancharr(9) As Variantのように宣言します。
    しかし「配列のコード、要素数がわからない時は、使えないのか?」というとそんなことはありません。
    そのために、動的配列があります。宣言時は、要素数を指定しないで宣言することができます。
    Dim brancharr() As Variant
    シートから取得する場合は、要素数となるデータがいくつあるか、行数を数えればいいのです。

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


    配列を扱うための必須知識、タイトル01
  4. 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
    
  5. 最初の宣言時には、brancharr()は要素数が決まっていませんでしたが、 maxub でセルの個数が分かりましたから、当然配列のサイズも決まります。
    ReDimステートメント を使って配列のサイズを宣言します。
    サイズを宣言したことにより、LBound関数とUBound関数が使えるようになりました。
    ReDim brancharr(1 To maxub)

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

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