ポイント
- 2次元配列から1次元目の要素 (配列) を取り出すことはできない。
- Variant を使用して、擬似的なジャグ配列を作成すれば可能
- 多次元配列とジャグ配列は異なり、同様に扱うことができない。
- 例えば、Range にジャグ配列を代入しても、シートにジャグ配列の要素は反映されない。
具体例
Option Explicit
Public Sub Test()
' 2次元配列
Dim strArray(2, 2) As String
strArray(0, 0) = "縦1横1"
strArray(0, 1) = "縦1横2"
strArray(0, 2) = "縦1横3"
strArray(1, 0) = "縦2横1"
strArray(1, 1) = "縦2横2"
strArray(1, 2) = "縦2横3"
strArray(2, 0) = "縦3横1"
strArray(2, 1) = "縦3横2"
strArray(2, 2) = "縦3横3"
' 配列から取り出す
' これはOK
Debug.Print strArray(0, 0)
' これらはエラー → [配列の次元が一致していません。]
Dim v1 As Variant
' v1 = strArray(0)
' Debug.Print strArray(0)(0)
' シートへ配列を反映する
' これはOK。シートに値は反映される。
Range("A1:C3") = strArray
' 擬似ジャグ配列
Dim jagArray As Variant
jagArray = Array(Array("a1", "b1", "c1"), Array("a2", "b2", "c2"), Array("a3", "b3", "c3"))
' 配列から取り出す。
' これはOK
Dim w As Variant
w = jagArray(0)
Debug.Print jagArray(0)(0)
' これはエラー → [インデックスが有効範囲にありません。]
' Debug.print jagArray(0, 0)
' シートへ配列を反映する。
' エラーにはならないが、シートに値は反映されない。
Range("A1:C3") = jagArray
End Sub
おわりに
配列から1次元目を取り出して関数の引数に割当、、、とやろうとしたところいつまでたってもできませんでした><。
なぜかしら?と随分と悩みました。。。
他のプログラム言語を触っていて、ジャグ配列というものを意識したことがありませんでした。そもそも、配列は固定長でサイズを管理しなければなりません。少しでも制御する要素を減らしたいと思って大抵はリストなどのコレクションを使用しておりました。
ですので、こんなにも悩むことになったのだと存じます。
今回することができて、そしてまとめることができて、嬉しく思います♪
最後に、参考ページです♪ありがとうございました!
- Excel VBA で多次元配列から複数の要素を抽出する方法についての質問 – VBA … – Yahoo!知恵袋
配列の1次元目は取り出せないと思うきっかけに、配列とジャグ配列は同様に扱えないと思うきっかけなった。 - Visual Basic におけるジャグ配列
ジャグ配列とは?、そのイメージがつかめた。 - VBAでの2次元配列の初期値定義
セルに反映させるには、ジャグ配列はNG、2次元配列はOKを確認できた。以上です。
