t-hom’s diary

主にVBAネタを扱っているブログです。

VBAでジャグ配列(多段階配列)を作るには

私の愛読ブログ、定時にカエルVBA(既に閉鎖)にジャグ配列を判定する関数を作成したいという記事が。

どうも引数としてジャグ配列を取るために、渡されたものがジャグ配列かどうかを判定しようとしているらしい。

VBAにジャグ配列ってあるの?って疑問を持たれた方もいるかと思う。
いや、そもそもジャグ配列とは何かを先に説明しておく。

ジャグ配列とは、配列を格納した配列のことで、二次元配列と違ってそれぞれの要素数が異なっても良い。
(多段階配列ともいう)

こんなイメージ。

【二次元配列】

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

【ジャグ配列】

1 2 3 4 5
6 7 8
9
10 11 12 13

素数の異なる配列というのは特殊なケースでしか使われないようだけれど、配列の中身を一列だけごそっと入れ替えたりするのが楽といったメリットがある。

で、VBAのジャグ配列であるが、結論から言うとVBAにジャグ配列という機能は無い。
じゃあどうやるかというと、何でも入るVariant型の出番である。
Variant型には、配列も入れることが出来る。

従って、バリアント型の配列をバリアント型の配列の要素に設定してやれば良い。

Dim Arr() As Variant
Arr() = Array(Array(1, 2, 3, 4, 5), Array(6, 7, 8), Array(9), Array(10, 11, 12, 13))

これで、疑似ジャグ配列の完成だ。
しかし、通常は二次元配列で事足りてしまうので、VBAでジャグ配列というキーワードで検索してもあまり情報は多くないと思う。

そして、ジャグ配列かどうかを判定するというニーズであるが、VBAでは上記のとおりジャグ配列自体があまり知られていない。一方、言語としてジャグ配列をサポートしているC#VB.NETでは、そもそも判定の必要性が無いというのが答えではないかと思う。

ためしにVB.Netで書いてみた。以下はDouble型のジャグ配列を引数に取るtestプロシージャにただの配列を渡すサンプルである。

Module Program
    Sub Main()
        Console.WriteLine("Hello World!")
        
        ' TODO: Implement Functionality Here
        
        Dim sales() As Double = New Double(11) {}
        call test(sales)
        
        Console.ReadKey(True)
    End Sub
    
    Sub test(x As Double()())
        Console.Write("Dummy")
    End Sub
    
End Module

すると、次のようなエラーでコンパイルできない。
'Double' は 'Double の 1 次元配列' から派生していないため、型 'Double の 1 次元配列' の値を 'Double の 1 次元配列 の 1 次元配列' に変換できません。

これがホントのジャグ配列型。つまり、引数の型指定でジャグ配列しか取れないように指定できるため、判定する必要が無いということだと推測される。

VBAではこれが出来ないので、自前で判定が必要になる。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。