ひっくり返して、もう一回ひっくり返す
世の中には、頭のいい人が居るもんだ。というお話。
例えばこのような、5行3列の二次元配列があるとする。
配列のサイズを変更(Redim)する場合、最大次元のみ変更可能だ。
従って、上記の例に於いては、このようになる。
二次元配列に於いては、これをテーブルに見立て、レコードを追加するイメージで一次元のサイズを変更したくなる場面が多々ある。しかし、変更できない。そこで昔はいつも、サイズ変更後の配列を別に準備し、そちらに引っ越すという、非常に面倒な手段をとっていた。
ところがその後、このような方法があることを知った。
まず、Transpose関数で行と列を入れ替える。
次いで、最大次元のサイズを一つ増やす。
最後に、もう一度行と列を入れ替える。
これで、一次元のサイズが変更できてしまった。
コードにするなら、こんな感じだろうか。
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
結果、希望通りのサイズ変更が出来た。
初めてこれを目にしたとき、その鮮やかさに感動した。
まさに、コロンブスの卵とはこのこと。種明かしされれば何ということもないが、思いつくのは至難の業。
当たり前の話ですが世の中には、到底かなわないほど頭のいい人がたくさんいる
ものだと、改めて思った次第です。
参考まで。