はじめに
VBAの配列は、デフォルトではインデックス番号(各要素を識別する番号)が 0
から始まります。しかし、例えば「1月〜12月」のデータのように、1
から始まる番号で管理したい場合も多いですよね。
VBAでは、配列を宣言する際にインデックスの開始番号と終了番号を自由に指定できます。さらに、LBound
(下限)と UBound
(上限)という関数を使うことで、その配列の開始番号と終了番号をプログラムで自動的に取得でき、より安全で柔軟なループ処理を記述することが可能です。
この記事では、配列のインデックス番号を 1
から始める方法と、LBound
/UBound
を使った確実なループの作り方を解説します。
インデックスを1から始める配列のサンプルコード
このマクロは、インデックスが 1
から 5
までの5つの要素を持つ配列を宣言し、その内容をループで C2
セルから下方向に書き出します。
完成コード
' 配列のインデックスを1から始める方法
Sub CustomIndexArrayExample()
'--- 1. インデックスが1から5までの配列を宣言 ---
Dim cityList(1 To 5) As String
Dim i As Long ' ループカウンター用の変数
'--- 2. 配列の各要素に値を代入 ---
cityList(1) = "札幌"
cityList(2) = "仙台"
cityList(3) = "横浜"
cityList(4) = "神戸"
cityList(5) = "那覇"
'--- 3. LBoundとUBoundを使ってループ処理 ---
' LBound(cityList)は 1 を、UBound(cityList)は 5 を返す
For i = LBound(cityList) To UBound(cityList)
' インデックス番号とセルの行番号を合わせるため、(i - 1)でオフセットを調整
Worksheets("Sheet1").Range("C2").Offset(i - 1, 0).Value = cityList(i)
Next i
MsgBox "配列の内容をセルに書き出しました。"
End Sub
ご提示のコードでは、Dim myList(1 To 3)
で宣言した配列の myList(0)
にアクセスしようとしているため、「インデックスが有効範囲にありません」というエラーが発生します。このサンプルコードでは、宣言とループの範囲を正しく合わせています。
コードの解説
1. Dim cityList(1 To 5) As String
配列を宣言する際に、インデックスの範囲を (開始番号 To 終了番号)
の形式で指定します。
(1 To 5)
と記述することで、インデックスが1, 2, 3, 4, 5
の5つの要素を持つ配列が作成されます。- もちろん、
(101 To 105)
のように、1
以外から始めることも可能です。
2. LBound
と UBound
関数
これらの関数は、配列のインデックス範囲を気にすることなく、安全にループ処理を行うための鍵となります。
LBound(配列名)
: その配列の最小のインデックス番号(Lower Bound)を返します。この例では1
が返されます。UBound(配列名)
: その配列の最大のインデックス番号(Upper Bound)を返します。この例では5
が返されます。
For i = 1 To 5
のように数値を直接書く(ハードコーディングする)代わりに For i = LBound(cityList) To UBound(cityList)
と書くことで、将来 Dim cityList(1 To 10)
のように配列のサイズを変更しても、ループのコードを修正する必要が一切なくなります。これは、メンテナンス性の高いコードを書くための非常に重要なテクニックです。
まとめ
今回は、VBAの配列でインデックスの開始番号を 1
にする方法と、LBound
/UBound
関数について解説しました。
- 配列の宣言時に
Dim 配列名(開始 To 終了)
と記述することで、インデックス範囲を自由に設定できる。 LBound
とUBound
を使ってループの範囲を指定すれば、配列のサイズ変更に強い、柔軟で安全なコードになる。
データの性質に合わせてインデックスの開始番号を 1
に設定し、LBound
/UBound
を活用することで、より直感的でミスの少ないプログラミングが可能になります。