ひっくり返して、もう一回ひっくり返す

世の中には、頭のいい人が居るもんだ。というお話。
f:id:Infoment:20200722221107p:plain

例えばこのような、5行3列の二次元配列があるとする。
f:id:Infoment:20200722221204p:plain

配列のサイズを変更(Redim)する場合、最大次元のみ変更可能だ。
従って、上記の例に於いては、このようになる。
f:id:Infoment:20200722221511p:plain

二次元配列に於いては、これをテーブルに見立て、レコードを追加するイメージで一次元のサイズを変更したくなる場面が多々ある。しかし、変更できない。そこで昔はいつも、サイズ変更後の配列を別に準備し、そちらに引っ越すという、非常に面倒な手段をとっていた。
f:id:Infoment:20200722222130p:plain

ところがその後、このような方法があることを知った。
まず、Transpose関数で行と列を入れ替える。
f:id:Infoment:20200722222402p:plain

次いで、最大次元のサイズを一つ増やす。
f:id:Infoment:20200722222518p:plain

最後に、もう一度行と列を入れ替える。
f:id:Infoment:20200722222615p:plain

これで、一次元のサイズが変更できてしまった。
コードにするなら、こんな感じだろうか。

Sub ArrayTest()
    ' 5行3列の範囲を、配列として変数arrに格納。
    Dim arr As Variant
        arr = Range("A1:C5")
    ' arrの行列を反転させた配列を、TempArrayに格納。
    Dim TempArray As Variant
        TempArray = WorksheetFunction.Transpose(arr)
    ' TempArrayの二次元サイズを5から6に変更。
    ReDim Preserve TempArray(1 To 3, 1 To 6)
    ' TempArrayの行列を反転させた配列を、arrに格納。
        arr = WorksheetFunction.Transpose(TempArray)
End Sub

結果、希望通りのサイズ変更が出来た。
f:id:Infoment:20200722223159p:plain

初めてこれを目にしたとき、その鮮やかさに感動した。
まさに、コロンブスの卵とはこのこと。種明かしされれば何ということもないが、思いつくのは至難の業。

当たり前の話ですが世の中には、到底かなわないほど頭のいい人がたくさんいる
ものだと、改めて思った次第です。

参考まで。