和風スパゲティのレシピ

日本語でコーディングするExcelVBA

配列(Array)の次元数を取得する

配列の次元数を取得する方法を紹介します。

一発で取得するプロパティはありませんので、
エラーが出るまで次元を上げてみるという方法で取得します。

ソースコード

' 配列の次元数の取得
Function Get配列の次元数(Arr As Variant) As Long

    ' 渡された変数が配列ではない場合は0を返すこととする
    If IsArray(Arr) = False Then Get配列の次元数 = 0: Exit Function

    ' エラーが出るまでUBoundを取得してみる
    Dim tmp
    Dim 次元数 As Long: 次元数 = 0
    On Error Resume Next
    Do While Err.Number = 0
        次元数 = 次元数 + 1
        tmp = UBound(Arr, 次元数)
    Loop
    On Error GoTo 0

    ' エラーが出たひとつ前の次元が求める次元数
    Get配列の次元数 = 次元数 - 1
    
End Function
' 実行テスト
Sub 配列の次元数を求める()

    ' 普通に配列で宣言した変数
    Dim 配列(10, 10, 10)
    Debug.Print Get配列の次元数(配列) ' ← 3
    
    ' 間違って配列ではないものを渡した場合
    Dim 文字列 As String
    Debug.Print Get配列の次元数(文字列) ' ← 0

    ' Variant型に配列を入れた場合
    Dim Variant配列
    Variant配列 = Array(1, 2, 3)
    Debug.Print Get配列の次元数(Variant配列) ' ← 1
    
    ' セル範囲.Valueで配列を入れた場合
    Variant配列 = Range("A1:C20").Value
    Debug.Print Get配列の次元数(Variant配列) ' ← 2
    
    ' 直接セル範囲を入れた場合(.Valueなら配列だがRangeそのままは配列ではない)
    Debug.Print Get配列の次元数(Range("A1:C20").Value) ' ← 2
    Debug.Print Get配列の次元数(Range("A1:C20")) ' ← 0
    
End Sub

解説

配列の次元を求めるGetDimensionのような組込関数はありませんので、
地道にループを回し、Uboundがエラーになる次元-1を取得します。


この手のループをマクロ本体に書くと邪魔になるので、
上記のように関数化してメインコードでは1行にしてしまいましょう。


なお、上記のコードでは「配列でないものが渡ったら0」としていますが、
意図せず渡った場合は通知してほしいということであれば、

If IsArray(Arr) = False Then
    Call Err.Raise(1000, , "配列でないものが渡されました。")
End If

こんな風にエラーで止めるのもアリです。

Range.Valueが配列をくれると思っていたら、
意図せず「1セル」が渡ってしまった!

みたいなときに止まってくれるのも便利ですので、
お好きな方で実装してください。