VBAで自動化 VBA一覧 配列 配列・データ操作

【VBA】ExcelVBAのLBound関数・UBound関数を使用する配列の基本

Excel VBAで配列を扱い始めると、ほぼ確実に登場するのが
LBound関数UBound関数 です。

しかし実務では、

  • なぜLBoundやUBoundが必要なのか分からない
  • For文の開始値・終了値を感覚で書いている
  • Splitや配列処理でエラーが頻発する
  • 配列の要素数が合わずに処理が止まる

といった悩みを抱えたまま、
「なんとなく動いているコード」を使い続けている方が非常に多いのが現実です。

この記事では、
LBound関数・UBound関数の意味、役割、実務で必須となる使い方を、
配列の基礎から応用・設計思想まで含めて体系的に解説します。

✅ LBound関数・UBound関数が重要になる理由

配列処理でトラブルが起きる原因の多くは、
**「配列の範囲を正しく理解していないこと」**にあります。
LBoundやUBoundを使わずに処理を書くと、
データ件数が変わった瞬間にエラーが発生します。
特に自動化やRPAでは、
この種のエラーは業務停止につながりかねません。
まずは、なぜこの2つの関数が重要なのかを整理しましょう。

・配列の範囲は固定ではない

配列の開始位置・終了位置は、
作り方や返り値によって変わります。

・「決め打ち」は実務では通用しない

配列サイズを想定で書くコードは、
長期運用に耐えません。


✅ VBAにおける配列の基本的な考え方

LBoundやUBoundを理解する前に、
VBAにおける配列の考え方を整理しておきます。
ここを曖昧にしたまま進むと、
後半の内容が理解しづらくなります。

・配列とは何か

配列とは、
複数の値をひとまとめにして扱うための変数です。

・なぜ配列を使うのか


✅ LBound関数・UBound関数とは何か

ここで本題に入ります。
LBound関数・UBound関数は、
配列の範囲を取得するための関数です。

・LBound関数の役割

配列の 最小インデックス を返します。

LBound(配列)

・UBound関数の役割

配列の 最大インデックス を返します。

UBound(配列)

✅ なぜ「0始まり」と「1始まり」が混在するのか

VBAの配列で混乱が起きやすい最大の理由が、
配列の開始インデックスが一定ではない点です。

・0始まりの配列

  • Split関数の戻り値
  • Array関数で作成した配列

・1始まりの配列

  • Dim arr(1 To 10) のように明示した配列

この違いを意識しないと、
配列処理はほぼ確実に壊れます。

参考:【VBA】データ型はなぜ必要?処理速度・メモリ・エラー観点から徹底解説


✅ LBound・UBoundを使わない危険なコード例

まずは、
よくあるNG例を確認します。

For i = 0 To 5
    Debug.Print arr(i)
Next i

このコードは、

  • 要素数が変わる
  • 開始インデックスが変わる

といった場合に、
簡単にエラーになります。


✅ LBound・UBoundを使った安全なループ処理

次に、
正しい書き方を見ていきます。

Dim i As Long

For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i)
Next i

・この書き方のメリット


✅ Split関数とLBound・UBoundの関係

実務でLBound・UBoundが最も使われるのが、
Split関数の戻り値を扱う場面です。

Dim arr As Variant
arr = Split("A,B,C", ",")

この場合、

  • LBound(arr) → 0
  • UBound(arr) → 2

になります。

ここを決め打ちで書くと、
非常に危険です。


✅ 動的配列とLBound・UBound

次に、
動的配列での使い方を解説します。

Dim arr() As String
ReDim arr(1 To 5)

この場合、

  • LBound(arr) → 1
  • UBound(arr) → 5

となります。

動的配列では、
ReDimによって範囲が変化するため、
LBound・UBoundは必須です。


✅ 多次元配列でのLBound・UBoundの使い方

配列は1次元だけとは限りません。
2次元配列でもLBound・UBoundは活躍します。

Dim arr(1 To 3, 1 To 4) As Long

・次元を指定する

LBound(arr, 1) ' 行方向
UBound(arr, 2) ' 列方向

この指定を忘れると、
意図しない範囲を取得してしまいます。

参考:【VBA】2次元配列を使用して一括で格納・格納データをループで処理する方法


✅ LBound・UBoundを使った実務的な配列処理例

ここでは、
実務でよくある配列処理を例に解説します。

Sub OutputArray()

    Dim arr As Variant
    Dim i As Long

    arr = Array("東京", "大阪", "名古屋")

    For i = LBound(arr) To UBound(arr)
        Cells(i + 1, 1).Value = arr(i)
    Next i

End Sub

✅ 配列の要素数を取得する方法

LBound・UBoundを使うと、
配列の要素数も取得できます。

Dim count As Long
count = UBound(arr) - LBound(arr) + 1

この式は、
実務で非常によく使われます。

参考:【VBA】ExcelVBAの配列の要素数とは


✅ エラーを防ぐための存在チェック

配列が初期化されていない場合、
LBound・UBoundはエラーになります。

If IsArray(arr) Then
    Debug.Print UBound(arr)
End If

このチェックを入れることで、
処理の安定性が大きく向上します。


✅ よくある誤解と失敗パターン

ここで、
LBound・UBoundに関する代表的な誤解を整理します。

  • 配列は必ず0始まりだと思っている
  • For文の開始値を決め打ちしている
  • 要素数とインデックスを混同している

これらはすべて、
LBound・UBoundを正しく使えば回避できます。


✅ RPA・自動化でLBound・UBoundが必須な理由

RPAやバッチ処理では、
入力データの件数が毎回異なるのが前提です。

  • 配列サイズが変わる
  • Split結果が変動する
  • 条件抽出で件数が減る

こうした状況で、
LBound・UBoundを使わないコードは
ほぼ確実に停止します。


✅ 実務向け:配列処理を関数化する設計

LBound・UBoundを前提にした関数設計は、
再利用性・保守性を大きく高めます。

Function GetArrayCount(arr As Variant) As Long

    If IsArray(arr) Then
        GetArrayCount = UBound(arr) - LBound(arr) + 1
    Else
        GetArrayCount = 0
    End If

End Function

✅ パフォーマンス面での注意点

LBound・UBound自体は軽量ですが、
ループ内で何度も呼び出すのは避けた方が良いです。

Dim startIdx As Long
Dim endIdx As Long

startIdx = LBound(arr)
endIdx = UBound(arr)

For i = startIdx To endIdx
    ' 処理
Next i

 

✅ まとめ:LBound・UBoundを理解すると配列処理が安定する

  • 配列の範囲は決め打ちしない
  • ループは必ずLBound〜UBoundで回す
  • Splitや動的配列では必須
  • 多次元配列では次元指定を忘れない
  • RPA・自動化では安全設計の要

LBound関数・UBound関数は、
一見地味ですが VBA配列処理の土台となる重要な関数です。

ここを正しく理解して使えるようになると、
配列処理に対する不安やエラーは大幅に減り、
より高度な自動化処理へ安心して進めるようになります。

参考:【VBA】Split関数で文字列を分割する方法を完全解説【区切り文字・配列の基本】

    -VBAで自動化, VBA一覧, 配列, 配列・データ操作