配列を配列の要素にする

配列の配列を作ってみる

配列の要素を配列にすることはできるのか。

やってみた。

準備

Split関数をラップしたFunctionを作って、簡単にString型の配列を作れるようにした。

リスト1 標準モジュール
Private Function setArray( _
                   ByVal spaceSeparatedWords As String) _
                                                As String()
  Dim ar As Variant
  ar = Split(spaceSeparatedWords)
  setArray = ar
End Function

単語ごとに半角スペースで区切った文字列を渡したら、それらの単語を格納した配列を返すFunction。

配列を返り値として受け取るときのルールがイマイチよくわかっとらんので、たぶん変なことをしているのだと思う。

これで準備はおしまい。

配列を配列にぶちこんでみる

次のようなコードで実験してみた。

スト2 標準モジュール
Public Sub test()
  Dim ar1() As String    '……(1)'
  ar1 = setArray("アホ ボケ カス")
  Dim ar2() As String
  ar2 = setArray("クズ ドロボー ロクデナシ")
  Dim ar3() As String
  ar3 = setArray("デコスケ ボーフラ ウジムシ")
  Dim ars(2) As Variant    '……(*)'
  ars(0) = ar1    '……(2)'
  ars(1) = ar2
  ars(2) = ar3
  Dim i As Long    '……(3)'
  Dim j As Long
  For i = 0 To 2
    For j = 0 To 2
      Debug.Print ars(i)(j)
    Next
    Debug.Print String(10, "=")
  Next
End Sub

(*)のところでは、

Dim ars(2) As String

とすると、「型が一致しません」エラーになる。

ぶち込みたいのはString型の値なのではなく、String型の配列なのだから当り前だ。

かといって、

Dim ars(2) As String()

としたのではもっとダメ。そもそもコンパイルが通らない。

そんなわけで、今のところVariantにしている。

見てもらったらわかると思うけれど、(1)からの6行

Dim ar1() As String    '……(1)'
ar1 = setArray("アホ ボケ カス")
Dim ar2() As String
ar2 = setArray("クズ ドロボー ロクデナシ")
Dim ar3() As String
ar3 = setArray("デコスケ ボーフラ ウジムシ")

では、「ar1」、「ar2」、「ar3」というString型の配列を作っている。

それを(2)からの3行

ars(0) = ar1
ars(1) = ar2
ars(2) = ar3

Variant型の配列にぶち込んでいる。

あとは、(3)からの8行

Dim i As Long
Dim j As Long
For i = 0 To 2
  For j = 0 To 2
    Debug.Print ars(i)(j)
  Next
  Debug.Print String(10, "=")
Next

の二重Forループで、それぞれの配列の値をイミディエイト・ウインドウに出力する。

実行結果

f:id:akashi_keirin:20190101174222j:plain

ご覧の通り。

配列に配列をぶち込むことも可能。

さて、どんな用途があるのかのう……。