配列を扱うための必須の知識、 Lbound、Ubaound、OptionBase
動画で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個ずつ取り込んでいきました。A1:A10まで brancharr という配列に入れましょう。配列は0から始まるので、Dim brancharr(9) と書いてあるのは要素が10個の意味になります。
brancharr(0) = Range("A1").Value
のように、セルの値を配列に代入していきます。
確実に配列が何かがわかるのコードです。上記ですと、手間がかかりすぎるのと、データが多い時には非常に長くなってしまうので、For文でループを使用して配列にデータを格納することもできます。rという変数を繰り返し処理のために追加しています。
配列のインデックスを1から始める方法
配列が0から始まるというのが扱いにくいのであれば、これを1から始めることもできます。モジュールの宣言部分に、Option Base 1と記載します。
もう一つの方法は、配列変数の宣言時に、かっこの中のインデックスを1 to 10のように、明示的に1から始まると書く方法です。
Split関数を使用して配列を作成する場合、Option Baseステートメントはインデックスの番号付けに影響を与えず、常に0から始まります。
Split関数は例外Option Base 1 が効かない
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関数
LBound関数とUBound関数を使用すると、 配列の最小インデックスと最大インデックスを求めることができます。LBound(arrayname, dimension)は最小インデックスを返し、UBound(arrayname)は最大インデックスを返します。
インデックスの最小値0は、LBound(brancharr,1)に書き換えることができます。
同様にインデックスの最大値9は、UBound(brancharr,1)に書き換えることができます。dimension次元を省略すると、1次元とみなされます。
配列をローカルウィンドーで確認する
シートから1次元配列を取得するマクロを実行しましょう。マクロの実行中に取得し配列に格納される様子を、ローカルウィンドーで確認することができます。
配列を使いたい時には通常、Dim brancharr(9) As Variantのように宣言します。
しかし「配列のコード、要素数がわからない時は、使えないのか?」というとそんなことはありません。
そのために、動的配列があります。宣言時は、要素数を指定しないで宣言することができます。
Dim brancharr() As Variant
シートから取得する場合は、要素数となるデータがいくつあるか、行数を数えればいいのです。変数にmaxubというLong型を宣言しました。これはインデックスの最大値を取得するための変数です。
maxub = Range("A1", Range("A1").End(xlDown)).Cells.Count
Range("A1")から、データのある最終行までのセルをカウントします。
最初の宣言時には、brancharr()は要素数が決まっていませんでしたが、 maxub でセルの個数が分かりましたから、当然配列のサイズも決まります。
ReDimステートメント を使って配列のサイズを宣言します。
サイズを宣言したことにより、LBound関数とUBound関数が使えるようになりました。
ReDim brancharr(1 To maxub)このようにデータをシートから取得する場合は、データの数を求めることで配列のサイズを調べることができます。
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