【VBA】配列のインデックス番号を1から始める方法と LBound/UBound の使い方

目次

はじめに

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. LBoundUBound 関数

これらの関数は、配列のインデックス範囲を気にすることなく、安全にループ処理を行うための鍵となります。

  • 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 終了) と記述することで、インデックス範囲を自由に設定できる。
  • LBoundUBound を使ってループの範囲を指定すれば、配列のサイズ変更に強い、柔軟で安全なコードになる。

データの性質に合わせてインデックスの開始番号を 1 に設定し、LBound/UBound を活用することで、より直感的でミスの少ないプログラミングが可能になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次