配列の行または列を切り出し(Index関数)
配列の行または列の切り出しについて、知識があいまいなまま使っていた。
確認してみよう。
Excel VBAにおいて二次元配列の一次元目を行、二次元目を列に準えるとき、
配列のr行c列目の値は以下の式で取得できる。
WorksheetFunction.Index(配列, 行番号r, 列番号c)
ここで、例えば行番号に2を指定し、列番号を0とすると、
2行目全体を配列として切り出すことが出来る。
そこで、次のようなテスト用サブプロシージャを作成してみた。
Sub Test1() ' 元の配列。 Dim arr1(2 To 4, 3 To 5) As Variant Dim i As Long Dim j As Long Dim counter As Long: counter = 1 For i = 0 To 2 For j = 0 To 2 arr1(i + 2, j + 3) = Chr(64 + counter) counter = counter + 1 ' なまくらしてみた。普段はやらない書き方。 Next j, i ' 元の配列をシートに貼り付け。 Range("A1").Resize(3, 3) = arr1 ' 2行目を切り出してシートに貼り付け。 Dim arr2 As Variant arr2 = WorksheetFunction.Index(arr1, 2, 0) Range("A5").Resize(, 3) = arr2 ' 2列目を切り出してシートに貼り付け。 Dim arr3 As Variant arr3 = WorksheetFunction.Index(arr1, 0, 2) Range("E1").Resize(3) = arr3 End Sub
結果、以下のことが分かった。
行の切り出しについて
① 一次元配列となる。
② 指定した添え字は、絶対値ではなく相対値。
元々の行の添え字は、2~4。しかし、Index関数で指定した「2」は、添え字の2(つまり1行目)ではなく、2行目を切り出している。
③ 切り出された配列の添え字は、1始まりとなる。
列の切り出しについて
① 二次元配列となる(複数行1列)
② 指定した添え字は、絶対値ではなく相対値。
行の場合と同様のため、省略。
③ 切り出された配列の添え字は、1始まりとなる。
これも、行の場合と同様のため省略。
ついでに、一次元配列から一次元配列を切り出したらどうなるか、確認してみた。
Sub Test2() Dim arr1(2 To 4) arr1(2) = 1 arr1(3) = 2 arr1(4) = 3 Dim arr2 As Variant arr2 = WorksheetFunction.Index(arr1, 1, 0) Dim arr3 As Variant arr3 = WorksheetFunction.Index(arr1, 0, 2) End Sub
結果、以下のことが分かった。
- 一次元から一次元を切り出すことは可能。
ただし、添え字は1始まりに矯正される。 - 元がIntegerやLong型の数値であっても、切り出すとDouble型になる。
- 列で切り出した場合、要素が一つの配列となる。
今回は、色々と整理できて有意義だった。
ただし上記の結論は
「特殊解としてそのように見えるだけで、一般解ではない」
恐れもあるので、間違っていたら直ぐ訂正します。
参考まで。