2025/09/13

配列の次元数を取得する方法

今回は超個人的な備忘録です。

通常の業務アプリで必要となるシーンは思い浮かばないのですが、先日、汎用的なツールを作成しているときに必要となった処理です。それは、Variant 型変数に配列が入っていた時にその配列の次元数を確認する方法です。


配列であるかの確認

Variant 型 に配列が入っているかは、IsArray 関数で判定できます。

If IsArray(vUnknown) = True Then
   'vUnknown は配列
Else
   'vUnknown は配列ではない
End If


要素数の確認と次元

上記関数では、配列かどうかの判定はできますが、その次元数は判定できません。LotusScript にそれを取得する関数がないようなので、自作することにしました。

利用したのは UBound(LBound でも可)関数です。配列の要素数の最大値(最小値)を取得する関数なのですが、2 つ目の引数に次元を指定できます。

UBound ( arrayName [ , dimension ] )

例えば、3 次元配列の場合、以下のように記述すれば各次元の要素数の最大値が取得できます。

Dim aiArray(5, 3, 15) As Integer
Dim iMax1 As Integer
Dim iMax2 As Integer
Dim iMax3 As Integer
iMax1    = UBound(aiArray, 1)     ' 5
iMax2    = UBound(aiArray, 2)     ' 3
iMax3    = UBound(aiArray, 3)     ' 15


次元数の確認

UBound で存在しない次元数を指定した場合、エラーが発生します。これを利用して Variant 変数内の次元数を確認します。

次元数を返す関数のサンプルは次の通りです。

Function GetDimension(vaArray As Variant) As Integer
   Dim i As Integer
   Dim j As Integer

   On Error GoTo GeneralError

   For i = 1 To 8
      ' 存在しない次元を指定するとここでエラーになる
      j = UBound(vaArray, i)

      'エラーがないのその次元は存在
      GetDimension = i
   Next

ExitFunc:
   Exit Function

GeneralError:
   Resume ExitFunc
End Function


もし引数に配列でない値がセットされた場合には、初回の UBound でエラーが発生するので、0 が返されます。


0 件のコメント:

コメントを投稿