読者です 読者をやめる 読者になる 読者になる

趣味で計算流砂水理

Computational Sediment Hydraulics for Fun

VBA for EXCELの高速化とか

R

先日はお疲れ様でした。

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倍以上の速度だと思います。インプットの際も同様です。

その他

  • LESのコーディングはやってみましたが発散してしまいます。収束計算がまずいのかな。。。
  • fortranのインプットファイル名を動的に決めれないかなと思い、書いてましたがあまりの煩雑さに断念しました。最近pythonばかりだったので辛いです。プロの方はどうやっているのでしょうか。。。