Excel VBAを学び始めて、最初につまずきやすい概念のひとつが「配列の要素数」です。
配列自体は理解しているつもりでも、「何個入っているのか」「どこまでループすればいいのか」が分からず、エラーや想定外の結果に悩んだ経験がある方は多いのではないでしょうか。
特に実務では、
- データ件数が毎回変わる
- 空白行が混ざる
- 動的に配列サイズが変わる
といった状況が当たり前に発生します。
このとき「配列の要素数」を正しく理解していないと、処理漏れ・エラー・無限ループといった致命的な問題につながります。
この記事では、Excel VBAにおける
「配列の要素数とは何か」を軸に、
- 基本概念
- LBound / UBound の正しい考え方
- 静的配列と動的配列の違い
- 実務で壊れないループ設計
- 配列要素数を使った実践テンプレート
までを、実務目線で徹底的に解説します。
目次
- ✅ 配列の要素数を理解しないと何が問題なのか
- ・要素数を誤解すると起きる典型的な問題
- ・実務では配列サイズは固定されない
- ✅ ExcelVBAにおける「配列の要素数」とは何か
- ・配列の要素とは
- ・要素数とは
- ✅ LBound と UBound が要素数理解のカギになる理由
- ・LBound / UBound とは何か
- ・要素数の基本的な求め方
- ✅ Option Base と要素数の関係
- ・Option Base とは
- ・Option Base 0 の場合
- ・Option Base 1 の場合
- ✅ 静的配列と動的配列で要素数の考え方はどう変わるか
- ・静的配列の要素数
- ・動的配列の要素数
- ・ReDim Preserve 使用時の注意点
- ✅ 二次元配列・多次元配列の要素数の考え方
- ・二次元配列の構造
- ・行数・列数の取得方法
- ・実務での重要ポイント
- ✅ For文と配列要素数の正しい関係
- ・よくある間違い
- ・安全な書き方
- ✅ 配列が空かどうかを要素数で判定する方法
- ・エラーになる例
- ・安全な判定方法
- ✅ 要素数を意識した実務テンプレート例
- ・Range → 配列 → ループ処理の基本テンプレート
- ✅ 配列の要素数を意識すると処理速度が改善する理由
- ・やってはいけない設計
- ・要素数ベース設計のメリット
- ✅ UiPath・RPAと連携する場合の要素数設計
- ✅ まとめ:配列の要素数を理解するとVBAは一気に安定する
✅ 配列の要素数を理解しないと何が問題なのか
配列の要素数は、「分かっていなくてもなんとなく動く」ケースがあるため、軽視されがちです。
しかし実務では、この理解不足が最もトラブルを生みやすい原因になります。
なぜ要素数の理解が必須なのか、まずは全体像を整理します。
ここを曖昧にしたまま進むと、後半のコードも本質的に理解できません。
配列を“使える知識”に変えるための土台として、しっかり押さえてください。
・要素数を誤解すると起きる典型的な問題
- For文の上限がズレる
- 最後のデータが処理されない
- 存在しない要素を参照してエラーになる
- 空配列なのに処理を回してしまう
これらはすべて、「要素数の捉え方」が原因です。
・実務では配列サイズは固定されない
教本では固定サイズの配列がよく使われますが、
実務では「何件入るか分からない」配列がほとんどです。
だからこそ、要素数を動的に把握する考え方が重要になります。
✅ ExcelVBAにおける「配列の要素数」とは何か
ここで一度、言葉の定義を整理します。
曖昧な理解のまま使っていると、後で混乱します。
・配列の要素とは
配列の要素とは、配列の中に格納されている1つ1つの値のことです。
Dim arr(1 To 5) As Long
この場合、
- arr(1)
- arr(2)
- arr(3)
- arr(4)
- arr(5)
の 5つ が要素です。
・要素数とは
要素数とは、配列に存在する要素の個数を指します。
上記の例では、要素数は 5 です。
重要なのは、
「インデックスの最大値 = 要素数」ではない場合がある
という点です。
✅ LBound と UBound が要素数理解のカギになる理由
Excel VBAでは、配列の要素数を直接返す関数はありません。
代わりに使うのが LBound と UBound です。
・LBound / UBound とは何か
LBound(配列) ' 配列の最小インデックス
UBound(配列) ' 配列の最大インデックス
これらを使って、要素数を算出します。
・要素数の基本的な求め方
Dim elementCount As Long
elementCount = UBound(arr) - LBound(arr) + 1
この「+1」が非常に重要です。
ここを忘れると、要素数が1つ少なくなります。
✅ Option Base と要素数の関係
配列の要素数を混乱させる原因のひとつが Option Base です。
これを正しく理解していないと、LBound / UBound の意味がズレます。
・Option Base とは
Option Base 0
Option Base 1
これは、配列の最小インデックスを指定する宣言です。
・Option Base 0 の場合
Option Base 0
Dim arr(5) As Long
- インデックス:0 ~ 5
- 要素数:6
・Option Base 1 の場合
Option Base 1
Dim arr(5) As Long
- インデックス:1 ~ 5
- 要素数:5
この違いを理解せずに使うと、
「なぜ1件多い/少ないのか分からない」状態になります。
参考:【VBA】Option Base 0と1の違い|配列の基底はどちらが良い?
✅ 静的配列と動的配列で要素数の考え方はどう変わるか
実務では、ほぼ必ず動的配列を使うことになります。
それぞれの特徴を整理します。
・静的配列の要素数
Dim arr(1 To 10) As String
- 要素数は常に10
- 変更不可
・動的配列の要素数
Dim arr() As String
ReDim arr(1 To 10)
- ReDim によって要素数が変わる
- 実行時に決まる
・ReDim Preserve 使用時の注意点
ReDim Preserve arr(1 To 20)
- 最終次元しか変更できない
- 処理速度に影響する
要素数を頻繁に変更する設計は、
パフォーマンス低下の原因になります。
参考:【VBA】配列(Array)の基礎を徹底解説|1次元配列・2次元配列の仕組みと実務での使い方
✅ 二次元配列・多次元配列の要素数の考え方
Excel VBAでは、Rangeを配列に格納すると
二次元配列になるケースが非常に多いです。
・二次元配列の構造
Dim arr As Variant
arr = Range("A1:C10").Value
- arr(行, 列)
- 行数と列数を別々に考える必要がある
・行数・列数の取得方法
Dim rowCount As Long
Dim colCount As Long
rowCount = UBound(arr, 1) - LBound(arr, 1) + 1
colCount = UBound(arr, 2) - LBound(arr, 2) + 1
・実務での重要ポイント
- 「要素数 = 行数 × 列数」とは限らない
- 行方向・列方向を意識してループを組む
参考:【VBA】配列と変数の違いを初心者向けにわかりやすく徹底解説
✅ For文と配列要素数の正しい関係
配列の要素数を理解する最大の目的は、
For文を安全に回すことです。
・よくある間違い
For i = 1 To UBound(arr)
この書き方は、LBoundが1でない場合に破綻します。
・安全な書き方
Dim i As Long
For i = LBound(arr) To UBound(arr)
' 処理
Next i
この形を基本形として覚えてください。
参考:【VBA】ExcelVBAのLBound関数・UBound関数を使用する配列の基本
✅ 配列が空かどうかを要素数で判定する方法
実務では「配列が空の可能性」を必ず考慮する必要があります。
・エラーになる例
If UBound(arr) >= 0 Then
配列が未初期化だとエラーになります。
・安全な判定方法
If Not IsEmpty(arr) Then
' 配列が初期化されている
End If
または、エラーハンドリングと組み合わせる方法もあります。
参考:【VBA】IsEmpty / IsNull / IsNothing の違いを徹底解説|未初期化・Null・Nothingを正しく見分けよう
✅ 要素数を意識した実務テンプレート例
・Range → 配列 → ループ処理の基本テンプレート
Dim arr As Variant
Dim i As Long
arr = Range("A2:A100").Value
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i, 1) <> "" Then
' 処理
End If
Next i
このテンプレートの強み
- 要素数に依存しない
- 空白行に強い
- データ件数が変わっても壊れない
✅ 配列の要素数を意識すると処理速度が改善する理由
要素数を正しく把握すると、
無駄なループを回さずに済むようになります。
・やってはいけない設計
- 固定回数でループ
- 実データ件数を無視
・要素数ベース設計のメリット
- 処理時間の短縮
- メモリ消費の最適化
- RPA連携時の安定性向上
✅ UiPath・RPAと連携する場合の要素数設計
RPAとExcel VBAを組み合わせる場合、
配列の要素数を正しく扱えるかどうかが、自動化の成否を分けます。
- VBAで配列処理
- RPAは件数に依存しないフロー
この役割分担をすると、保守性が大きく向上します。
✅ まとめ:配列の要素数を理解するとVBAは一気に安定する
- 配列の要素数は「インデックス数」とは違う
- LBound / UBound の理解が最重要
- Option Base によって要素数は変わる
- 動的配列では要素数は実行時に決まる
- 二次元配列は次元ごとに考える
- For文は必ず LBound ~ UBound を使う
- 要素数設計は処理速度と安定性に直結する
配列の要素数は、Excel VBAの基礎でありながら最重要ポイントです。
ここを正しく理解できると、
配列・ループ・条件分岐が一気につながって見えるようになります。
この記事をベースに、自分のコードを見直してみてください。
きっと「なぜ今まで不安定だったのか」が見えてくるはずです。