配列の次元数を取得する方法を紹介します。
一発で取得するプロパティはありませんので、
エラーが出るまで次元を上げてみるという方法で取得します。
ソースコード
' 配列の次元数の取得 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セル」が渡ってしまった!
みたいなときに止まってくれるのも便利ですので、
お好きな方で実装してください。