1. 導入:なぜ配列の次元数を知る必要があるのか
実務でExcel VBAを扱う際、Rangeオブジェクトから値を一括取得すると、データは自動的に「2次元配列」として格納されます。しかし、処理の過程で外部から渡された配列が「1次元なのか2次元なのか不明」な場合、そのままループ処理を行うと「添字が範囲外です」というエラーに直面することがあります。この課題を解決するため、プログラム側で動的に配列の構造(次元数)を判定するテクニックは、堅牢なツールを作る上で非常に重要です。
2. 基礎知識:UBound関数の特性
通常、UBound関数は配列の指定した次元における「最大添字」を取得するために使います。ここで重要なのが、「存在しない次元を指定すると実行時エラーが発生する」という仕様です。このエラーを逆手に取り、エラーが発生する手前の数値を確認することで、その配列が何次元であるかを特定できます。
3. 実装/解決策:エラーハンドリングを活用した判定
具体的には、On Error Resume Nextを使用してプログラムを一時的にエラー無視状態にします。ループ内でUBoundの次元指定引数(第2引数)を1から順に増やしていき、エラーが発生した瞬間にループを抜けます。エラーが発生した時の添字から1を引いた値が、その配列の次元数となります。
4. サンプルプログラム
以下のコードは、セル範囲のデータが何次元配列かを判定する実用的な例です。
Sub GetArrayDimension()
Dim TargetData As Variant
Dim DimCount As Long
‘ A1:B5の範囲を配列に格納(自動的に2次元配列になる)
TargetData = Range(“A1:B5”).Value
‘ エラーが発生しても処理を継続させる
On Error Resume Next
‘ 次元数を1から順にテストしていく
Do
DimCount = DimCount + 1
‘ 存在しない次元を指定すると Err.Number が 0 以外になる
Call UBound(TargetData, DimCount)
Loop While Err.Number = 0
‘ エラー発生時はその次元が存在しないため、直前の数値を次元数とする
On Error GoTo 0
MsgBox “現在の配列は ” & DimCount – 1 & ” 次元です。”, vbInformation
End Sub
5. 応用・注意点:現場での運用
注意点:
この方法は「動的配列」や「Variant型の配列」に対して有効です。固定長配列や、そもそも配列ではない変数に対して実行すると意図しない挙動になることがあります。必ず判定前に「IsArray関数」を使って、対象が配列であることを確認する処理を挟むのがプロの現場での鉄則です。
応用:
実務では、この判定結果をIf文で分岐させ、「1次元なら横並びのループ、2次元なら入れ子のループ」といった形で、汎用的なデータ処理関数を作成する際に非常に役立ちます。ぜひ、自作のライブラリに組み込んで活用してください。
