HOWTO · VBA

VBA で配列の長さを取得する

このチュートリアルでは、VBA で配列の長さを取得するさまざまな方法を示します。

このページの内容

VBA 配列の要素数は、最大インデックスから最小インデックスを引き、1 を加えて求めます: UBound(array) - LBound(array) + 1。両端のインデックスを含めるために + 1 を加えます。この式は、配列の開始位置が 0、1、または別の宣言済み下限値の場合にも使えます。UBound だけでは最大インデックスしか分からず、必ずしも要素数にはなりません。配列の容量ではなく空でない値の数を数えたい場合に限り、COUNTA を使います。

VBA で UBound と LBound を使って配列の長さを求める

たとえば、Dim names(5 To 9) As String は、インデックス 5 から 9 までの 5 つの要素を宣言します。その長さは UBound(names) - LBound(names) + 1、つまり 9 - 5 + 1 = 5 です。境界値を明示すると、上限値だけでは要素数にならないことが分かります。次の完全な VBA プロシージャでは、Debug.Print と & でラベルと計算結果を連結しています: Sub ShowArrayLength(): Dim names(5 To 9) As String: Debug.Print "Array length: " & (UBound(names) - LBound(names) + 1): End Sub。Debug.Print は計算結果を VBA エディターのイミディエイトウィンドウに出力します。提示された実行証拠は、後述する別の Python 算術例を対象としており、この VBA プロシージャが実行されたことを示すものではありません。

複数のプロシージャで同じ計算を使う場合は、標準モジュールにヘルパー関数を置き、必要な場所から呼び出せます: Public Function ArrayLength(ByRef values As Variant) As Long: ArrayLength = UBound(values) - LBound(values) + 1: End Function。すでに割り当てられた配列を渡してください。この関数は境界値を取得できることを前提としており、未割り当ての動的配列には対応しません。Variant 型の引数には配列を渡せます。また、UBound と LBound を使うため、下限値が 0 以外の場合も含め、配列の実際の境界値に基づいて計算できます。

Array が返す配列にも同じ式を使えます。たとえば、Variant に Array("Glen", "Yumi", "Myla") を代入した場合も、特定の下限値を前提にせず、境界値から長さを求めます。VBA の既定の下限値は Option Base の影響を受けることがあります。また、Array や配列宣言ではそれぞれ異なる動作をする場合があるため、LBound を使えば下限値を決めつけずに計算できます。

次の Python 算術例を実行すると、同じ計算結果を確認できます。これは VBA プロシージャの実行ではありません。コード内のラベルと出力は英語のままです。

lower_bound = 5
upper_bound = 9
length = upper_bound - lower_bound + 1
print(f"Array length: {length}")
Array length: 5

動的配列と未割り当て配列を扱う

動的配列は、たとえば Dim values() As String のように境界値を指定せずに宣言し、後から ReDim values(1 To 4) で境界値を割り当てます。割り当て後は、同じ UBound と LBound の式を使います。固定サイズ配列の境界値は宣言時に決まりますが、動的配列の境界値は現在の割り当てによって決まります。

未割り当ての動的配列には使用できる境界値がありません。その配列に対して LBound または UBound を呼び出すと、実行時エラーになります。IsEmpty が確認するのは、Variant が特殊な Empty 値かどうかであり、動的配列が割り当て済みかどうかではありません。未割り当ての配列を受け取る可能性がある場合は、LBound と UBound の呼び出しを限定的なエラー処理の範囲に置き、境界値に関するエラーを未割り当ての場合として扱います。無関係なエラーを割り当て確認と取り違えないよう、ほかの処理はその範囲の外に置いてください。ReDim で割り当てた後は通常の式を使えます。前述のプロシージャは固定サイズ配列を使うため、常に境界値があります。

COUNTA で空でない配列要素を数える

Excel VBA の WorksheetFunction.CountA(values) は、Excel の COUNTA の規則に従って、配列内の空でない値を数えます。値が入っている項目数を知りたい場合に便利です。ただし、配列の長さを求める一般的な方法の代わりにはなりません。割り当て済みの配列に値の入っていない要素があると、空でない要素の数はインデックス数より少なくなることがあります。すべての要素に値が入っていれば両者が一致する場合もありますが、容量や使用可能な位置の数を知りたい場合は、境界値を使う式で求めてください。

COUNTA はワークシート関数の呼び出しであり、VBA の境界値を取得する操作ではありません。また、配列はワークシート関数が受け取れる形式である必要があります。この方法に 30 要素の上限を設ける必要はありません。下限値が 0 以外の配列も含め、配列の要素数を求めるには UBound と LBound を使います。COUNTA を使うのは、空でない値の数を測りたい場合に限ります。