今日仕事でハマったのでメモ。

やりたいこと

複数のブックを、ひとつの新規ブックにまとめるマクロを作ったけど、
ひとつひとつのブックのデータ量が多くなってきたせいか、
途中でマクロが落ちるようになった。
なので高速化すべく、以下のように改良する

現行

For 1 to (ファイル数)
    'ブックを開く
    'データの範囲を新規ブックにコピペ
    'ブックを閉じる
Next

改良案

'描画を停止する
Application.ScreenUpdating = False

For 1 to (ファイル数)
    'ブックを開く
    'データの範囲を配列に保持
    'ブックを閉じる
Next

'新規ブックに配列の中身を一括ペースト

とまあここまではいいとして。
(さりげなくApplication.ScreenUpdating = Falseも導入)

配列のイメージはこんな感じ。
で、xをReDimで増やしていけばいいかなと思っていた。

Dim array As Variant
ReDim Preserve array(x, 3)

' 番号    名前    データ
' 1      name1   1
' 2      name2   2
' 3      name3   3
' :      :       :
' x      namex   x

ReDim Preserveで要素数を変更できるのは、最後の要素に限られるとのこと。
つまり、2次元の場合は「列」しか増やせない…

https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/redim-statement

じゃあ行列をひっくり返して、横方向にデータを突っ込んでいけばいいな!
っていうことで来週改修します。