今回はlibreoffice(リブレオフィス)のcalcを使用して、VBAマクロを実行する際の処理速度向上・高速化のために設定すべき項目を紹介します。(※使用しているのはlibreoffice Basicではありません。)
といっても簡単でExcelと同様に時間のかかる処理の前に下記の項目を設定するだけです。
・画面描画停止
・イベント抑制
・手動計算に切り替え
では、具体的な設定方法を見ていきましょう。(どれくらい速くなるか?のサンプルも最後に紹介してます。)
前提として
今回はlibreoffice Basicというlibreoffice特有の仕組みではなくExcelと同様のVBAマクロを使用します。
ですので、VBAマクロサポートが有効になるようにコードの先頭に次の1行を追加してください。
Option VBASupport 1 ' VBAマクロサポートの有効化
項目の設定
項目の設定は次のように行います。具体的なコードで紹介します。
Application.ScreenUpdating = False ' 画面描画停止
Application.EnableEvents = False ' イベント抑制
Application.Calculation = xlCalculationManual ' 手動計算に切り替え
' ここに処理を書く
' 例としてテキストファイルをセルに設定する処理
reVal = fnTextToCell(szInFile, nX, nY, szStsFile)
Application.ScreenUpdating = True ' 画面描画停止解除
Application.EnableEvents = True ' イベント抑制解除
Application.Calculation = xlCalculationAutomatic ' 自動計算に切り替え
こんな形で時間のかかる処理をサンドイッチするように各項目を設定します。
今回は例として大量のテキストファイルをセルに設定するサブルーチンを呼び出しています。
画面の描画を停止する
Application.ScreenUpdating = True/False ' 画面描画の停止/解除
VBAマクロ実行中の画面の描画を停止できます。Falseに設定することで、解除するまでは画面に変化は起きません。
イベント抑制
Application.EnableEvents = True/False ' イベント抑制/解除
Falseに設定することで、セルに書き込む度に発生するイベントを抑制できます。
※もし、何らかのイベントで動作するマクロを設定している場合はこの項目は除いて下さい。
手動計算/自動計算
Application.Calculation = xlCalculationManual ' 手動計算
Application.Calculation = xlCalculationAutomatic ' 自動計算
自動計算のままだとセルの値が変更される度に計算が行われます。それを手動計算にすることで、一時的に自動で計算しないようにできます。その分だけ処理速度が向上します。
※もし、計算結果が必要な処理をする場合にはその直前に「Application.Calculate」を書いて再計算する必要があります。
この設定でどれくらい速くなるのか?
サンプルとして今回実行した処理は「6列×5,000行のテキストデータをセルに設定する」という処理です。結果はこのようになりました。
設定①:何も設定せずに実行
設定②:画面描画の停止のみ
設定③:画面描画/イベント抑制
設定④:画面抑制/イベント抑制/手動計算
設定 | ① | ② | ③ | ④ |
処理時間 | 2分49秒 | 13.92秒 | 13.72秒 | 12.96秒 |
画面描画の停止の効果が断トツですね。笑
ちなみにExcelはlibreofficeよりも50倍近く処理が速いそうです...Microsoft恐るべし。
コメント