配列の行または列を切り出し(Index関数)

配列の行または列の切り出しについて、知識があいまいなまま使っていた。
確認してみよう。
f:id:Infoment:20200812094119p:plain

Excel VBAにおいて二次元配列の一次元目を行、二次元目を列に準えるとき、
配列のr行c列目の値は以下の式で取得できる。

WorksheetFunction.Index(配列, 行番号r, 列番号c)

f:id:Infoment:20200812094830p:plain

ここで、例えば行番号に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

結果、以下のことが分かった。

行の切り出しについて

f:id:Infoment:20200812101655p:plain

① 一次元配列となる。
f:id:Infoment:20200812101819p:plain

② 指定した添え字は、絶対値ではなく相対値。
元々の行の添え字は、2~4。しかし、Index関数で指定した「2」は、添え字の2(つまり1行目)ではなく、2行目を切り出している。
f:id:Infoment:20200812102450p:plain

③ 切り出された配列の添え字は、1始まりとなる。
f:id:Infoment:20200812102547p:plain

列の切り出しについて

f:id:Infoment:20200812102948p:plain

① 二次元配列となる(複数行1列)
f:id:Infoment:20200812103122p:plain

② 指定した添え字は、絶対値ではなく相対値。
行の場合と同様のため、省略。

③ 切り出された配列の添え字は、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. 一次元から一次元を切り出すことは可能。
    ただし、添え字は1始まりに矯正される。
  2. 元がIntegerやLong型の数値であっても、切り出すとDouble型になる。
  3. 列で切り出した場合、要素が一つの配列となる。

f:id:Infoment:20200812103910p:plain

今回は、色々と整理できて有意義だった。

ただし上記の結論は
「特殊解としてそのように見えるだけで、一般解ではない」
恐れもあるので、間違っていたら直ぐ訂正します。

参考まで。