
[プログラミング: 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を見てくれてありがとうございました (`・ω・´)ゞ