配列からの値貼り付けに関する覚書 ① Transpose関数とIndex関数は極力使用しない
ここ一週間ほど、(私にとっての)大規模マクロを作成していて、泥沼に
はまっている(絶賛継続中)。
そこから抜け出そうとして得た教訓を一つ二つ、覚書として残しておこう。
例えば、こんなテーブル。
これについて「品名列をF2~F4に転記したい」とする。その際、各品名の頭に
「品名:」を追加したい。↓ 完成形は、こんな感じだ。
今までは、Index関数を用いて配列をスライスし、編集して貼り付けていた。
Sub Test() Dim Tb As Excel.ListObject Set Tb = ActiveSheet.ListObjects(1) Dim SourceArray As Variant SourceArray = Tb.DataBodyRange Dim arr As Variant arr = WorksheetFunction.Index(SourceArray, 0, 1) Dim i As Long For i = 1 To UBound(arr) arr(i, 1) = "品名:" & arr(i, 1) Next Range("F2").Resize(UBound(arr)) = arr End Sub
ところがレコード数が増えていくうち、何かの都合でIndex関数がエラーを
起こすようになった。
※実際問題が発生したのは、1万行×100列ほどのテーブル。
しかも、昨日までは正常に動いていたのに、何切っ掛けでそうなったか
分からない。
ということで、安定的な動作を目的として、エラー時の原因が特定しにくい
関数は使用しないこととした。
Sub Test() Dim Tb As Excel.ListObject Set Tb = ActiveSheet.ListObjects(1) Dim SourceArray As Variant SourceArray = Tb.DataBodyRange Dim arr() As Variant ReDim arr(1 To UBound(SourceArray), 1 To 1) Dim i As Long For i = 1 To UBound(arr) arr(i, 1) = "品名:" & _ SourceArray(i, Tb.ListColumns("品名").Index) Next Range("F2").Resize(UBound(arr)) = arr End Sub
1列しかないのに複数行1列の二次元配列にしたのも、Index関数と同じ理由。
1次元配列を縦に貼り付ける際は、Transpose関数で縦横の入れ替えを行って
いたのだが、この関数もどうやらIndex関数と同じ原因でエラーとなるようだ。
以上はあくまで、「自分ルール」。
どこかで躓いたとき、思い出して頂けたら幸いです。
参考まで。