先日はお疲れ様でした。
VBA for EXCELの高速化
珍しくパブリックに向けて。知っている人なら当たり前のことですが、困ってる人が見てくれることを期待して。
いろんなサイトがあると思いますが、VBA for EXCELで最も遅いのはワークシートへのアクセスです。これは、ワークシートに変更が生じた場合、再計算しようとするからだと思ってます。再計算の実施は参照元セルが変更された場合のみのはずですがなぜか遅くなります。なので、再計算を手動にすると少し早くなります。
ただし、揮発性関数(indirect、offset等)は別です。これらは少しでも変更が生じた場合、すべて再計算されます。そのため、手動にすると劇的に速度が上がります。
本題は以下で、ワークシートにアクセスする回数を減らせばいいじゃんという話です。サンプルは以下です。
通常版
Sub t1() For ir = 1 To 1000 For ic = 1 To 250 Cells(ir, ic) = "A" Next Next End Sub
高速化
Sub t2() Dim c(1 To 1000, 1 To 250) As Variant For ir = 1 To 1000 For ic = 1 To 250 c(ir, ic) = "A" Next Next Range(Cells(1, 1), Cells(1000, 250)) = c End Sub
100倍以上の速度だと思います。インプットの際も同様です。