配列のインデックス番号を1から始めるには
シートからデータをFor文を使って配列として取得するケースを説明します。
取得している状態を調べるには、ローカルウィンドウを見るのがおすすめです。
下記の図がローカルウィンドウで配列にデータが取得されていることを確認している場面です。
マクロ 88回
データをFor文を使って配列として取得する
シートの表からデータを配列として取得する場合に、配列の要素を1から始めるようにする方法を説明します。
またシートから配列が取り込まれる様子をローカルウィンドウから確認する方法も紹介しています。
データを配列として取得する
1. シート上のデータを通常のやり方でマクロに取り込む場合
配列は0から始まるので、brancharr(0)=”支店名”、brancharr(1)=”あわしま”というようにデータを入れていくわけです。
2. 例えば1次元配列としてA1:A10 までの範囲を配列に入れる。
その場合1個々入れる場合は、このようなコードです。
データ数は10だと目視でわかるのでこの場合は、配列の宣言は”Dim brancharr(9) As Variant”となります。
3.For文でデータを取り込む
1個ずつ入れるかわりに、FOR文でデータの数だけ繰り返して取り込みます。For文で回すために、変数”r”を追加してやります。
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からはじめる方法
4. 配列が0から始まることに抵抗があったり、あとで使いづらい場合は、配列を1からはじめることができます。その方法は2つです。
1.Option Base 1を利用する。
1番目は、モジュールの宣言セクションにOption Base 1と記載します。
2.配列変数の宣言時にIndexの指定でToキーワードを使う
Indexの指定でToキーワードを使います。
”Dim brancharr(1 To 10) As Variant ”のように明示的に1から始まるとわかるように記載します。
例外と補足説明
3. Option Base 1を使うか、配列変数の宣言時にToキーワードを使うかの、どちらかの方法で、配列を1からはじめる
上記のどちらかの方法で、配列を1から始めることができます。
4.Split関数を使った配列は例外
Split関数をつかって配列を作成した場合は、 Option Base 1の影響はうけず、必ず0から始まります。
配列の要素数を求める LBound UBound
5. LBound関数とUBound関数を使う
配列のインデックス番号の最小値、最大値を返すLBound関数、UBound関数を使うことで、インデックス(要素番号)の最小値と最大値を取得することができます。
たとえば、先ほどの1次元配列を取り込むプロシージャも、For文で、For r = 0 To 9としてる部分をLBound関数、UBound関数を使用して変更すると次のように書き換えることができます。
Sub oneDimension() Dim brancharr(9) As Variant Dim r As Long For r = LBound(brancharr) To UBound(brancharr) brancharr(r) = Cells(r + 1, 1).Value Next r End Sub
ローカルウィンドウで配列を確認する
6.ローカルウィンドウの表示
ローカルウィンドウはメニューの表示から、
Alt → V → Sでローカルウィンドウを表示させ、配列を取得する様子を確認します。
7. ブレークポイントを設定する
End Subの頭にブレークポイントをつけます。プロシージャが終わってしまうと見れないので、ブレークポイントが必要です。
ステップ実行していくと、配列にデータが入っていくのを目視で確認できます。
8. 配列のデータを確認する
図のように変数が変わるたびに、配列のデータが取り込まれる様子を確認できました。
配列のインデックス番号の最大値が不明な場合の対処法
9.最大値が不明な場合のコード
配列のインデックス番号の最大値が目視でわかる場合はいいですが、最大値が不明の時はどうすればいいのかと思う場合があります。
最大値は行数からわかるので、取り込む行数(データ数)をエクセルに数えさせます。
行数を自動で取得すると、配列の最大値も自動的に決まります。
変数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 = 1 To maxub brancharr(r) = Cells(r, 1).Value Next r End Sub