見出し画像

[プログラミング: VBA] 配列変数の次元数を求める

VBAでコードを書いてて配列の次元数を求めたかったことありませんか?

 VBAでは配列かどうかをチェックする関数はありますが、配列の次元数を求める関数は用意されていません。

 そこで、配列の次元数を求める Functionプロシージャを自分で作ってみました。

 今回、Functionプロシージャにさせたいこと、して欲しい事は下記の通りです。

< させたいこと、して欲しいこと(想定されること) >
1.配列かどうかを判断して欲しい
2.配列だったら次元数を返して欲しい
3.要素が無い配列を渡してもエラーにしないで欲しい
3-(1).Dim varTmp() As Variant のように宣言しただけの状態の変数を渡すかもしれない
3ー(2).Array関数 で引数をしてしないで代入された変数の場合(要素無し)もあるかもしれない

< 戻り値をどうする?>

・1次元以上だったら・・・1以上の値を返す
・配列だけど要素が無かったら・・・0を返す
・配列じゃなかったら・・・-1を返す


< コード >

'***** 配列の次元数を求める
' 引数1   : vlArray        / 対象の変数
' 戻り値  : [Integer]       / -1:配列ではない, 0:初期化されていないか要素無し, 1以上:配列の次元数
Function Get_ArrayDim(ByVal vlArray As Variant) As Integer
'===== 変数宣言 ============================================================
 Dim i As Integer
 Dim varTmp As Variant
'==========================================================================
 
 i = 0
 
 On Error GoTo ErrLine
 
 If Not IsArray(vlArray) Then GoTo ErrLine
 
 Do
   i = i + 1
   
   varTmp = UBound(vlArray, i)
   
   If varTmp = -1 Then GoTo ErrLine
 Loop
 
 
ErrLine:
 
 If Err.Number <> 0 Then Err.Clear
 
 Get_ArrayDim = i - 1
End Function

 まず、してほしい事 1.IsArray関数 で判断できます。
 次に 2. UBound関数で要素数を求めようとした時にエラーにならなければ、その次元は存在していることがわかります。ただ、配列が何次元まであるのかわからないので、無限ループ(Do Loop)にして、エラーが発生したらループを抜ける(飛ぶ)ようにします。
 3.(1)(2) のパターンに分かれます。
 3-(1)IsArray関数 で調べるともちろん配列なので、True が返されます。ただし、要素を持っていないので、UBound関数では1つの次元も要素数を調べることができないでエラーになります。
 3-(2) は、”[変数] = Array()" のようにした場合です。この場合もIsArray関数 では True が返されます。ただ、3-(1) と違って、UBound関数 を使うと -1 が返ります
 という事で、上のコードとなりました。

< 使い方 >

[戻り値: Integer] = Get_ArrayDim([変数])

戻り値: -1 : 配列ではない
     0 : 配列だけど要素が無い
    >=1 : 1次元以上の配列

< サンプル >

Sub test()
 Dim ret As Integer
 
 '----- テスト内容 ----------------------------------------------------
'<↓ いずれか1行のクォーテーションを削除してから実行してください >
'  Dim varList As Variant:     '何もしない                     'テスト1
'  Dim varList As Variant:     varList = Array(1, 2, 3)        'テスト2
'  Dim varList As Variant:     ReDim varList(1 To 1, 1 To 2)   'テスト3
'  Dim varList() As Variant:   '何もしない                     'テスト4
'  Dim varList() As Variant:   varList = Array()               'テスト5
 '--------------------------------------------------------------------
 
 '配列の次元数を求める
 ret = mdlFunc.Get_ArrayDim(varList)
 
 Select Case ret
 Case -1:        Debug.Print "配列ではありません"
 Case 0:         Debug.Print "配列ですが要素がありません"
 Case Is >= 1:   Debug.Print ret & "次元数の配列です"
 Case Else:
 End Select

End Sub

・・・ということで、僕は自作したTranspose関数とセットで使っています。

noteを見てくれてありがとうございました (`・ω・´)ゞ

この記事が気に入ったらサポートをしてみませんか?