Excel VBAで配列を扱い始めると、ほぼ確実に登場するのが
LBound関数 と UBound関数 です。
しかし実務では、
- なぜLBoundやUBoundが必要なのか分からない
- For文の開始値・終了値を感覚で書いている
- Splitや配列処理でエラーが頻発する
- 配列の要素数が合わずに処理が止まる
といった悩みを抱えたまま、
「なんとなく動いているコード」を使い続けている方が非常に多いのが現実です。
この記事では、
LBound関数・UBound関数の意味、役割、実務で必須となる使い方を、
配列の基礎から応用・設計思想まで含めて体系的に解説します。
目次
- ✅ LBound関数・UBound関数が重要になる理由
- ・配列の範囲は固定ではない
- ・「決め打ち」は実務では通用しない
- ✅ VBAにおける配列の基本的な考え方
- ・配列とは何か
- ・なぜ配列を使うのか
- ✅ LBound関数・UBound関数とは何か
- ・LBound関数の役割
- ・UBound関数の役割
- ✅ なぜ「0始まり」と「1始まり」が混在するのか
- ・0始まりの配列
- ・1始まりの配列
- ✅ LBound・UBoundを使わない危険なコード例
- ✅ LBound・UBoundを使った安全なループ処理
- ・この書き方のメリット
- ✅ Split関数とLBound・UBoundの関係
- ✅ 動的配列とLBound・UBound
- ✅ 多次元配列でのLBound・UBoundの使い方
- ・次元を指定する
- ✅ LBound・UBoundを使った実務的な配列処理例
- ✅ 配列の要素数を取得する方法
- ✅ エラーを防ぐための存在チェック
- ✅ よくある誤解と失敗パターン
- ✅ RPA・自動化でLBound・UBoundが必須な理由
- ✅ 実務向け:配列処理を関数化する設計
- ✅ パフォーマンス面での注意点
- ✅ まとめ:LBound・UBoundを理解すると配列処理が安定する
✅ LBound関数・UBound関数が重要になる理由
配列処理でトラブルが起きる原因の多くは、
**「配列の範囲を正しく理解していないこと」**にあります。
LBoundやUBoundを使わずに処理を書くと、
データ件数が変わった瞬間にエラーが発生します。
特に自動化やRPAでは、
この種のエラーは業務停止につながりかねません。
まずは、なぜこの2つの関数が重要なのかを整理しましょう。
・配列の範囲は固定ではない
配列の開始位置・終了位置は、
作り方や返り値によって変わります。
・「決め打ち」は実務では通用しない
配列サイズを想定で書くコードは、
長期運用に耐えません。
✅ VBAにおける配列の基本的な考え方
LBoundやUBoundを理解する前に、
VBAにおける配列の考え方を整理しておきます。
ここを曖昧にしたまま進むと、
後半の内容が理解しづらくなります。
・配列とは何か
配列とは、
複数の値をひとまとめにして扱うための変数です。
・なぜ配列を使うのか
- 処理速度が速い
- コードが簡潔になる
- 大量データに強い
参考:【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・Array・動的配列すべて対応
参考:【VBA】配列(Array)の基礎を徹底解説|1次元配列・2次元配列の仕組みと実務での使い方
✅ 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
この式は、
実務で非常によく使われます。
✅ エラーを防ぐための存在チェック
配列が初期化されていない場合、
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配列処理の土台となる重要な関数です。
ここを正しく理解して使えるようになると、
配列処理に対する不安やエラーは大幅に減り、
より高度な自動化処理へ安心して進めるようになります。