私の愛読ブログ、定時にカエル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ではこれが出来ないので、自前で判定が必要になる。