VBATips

「マクロ処理を高速化する」をパーツ化する【ExcelVBA】

パーツ化とは

ExcelVBAマクロ初級者からの脱却が、処理のパーツ化(プロシージャの分割)と考えています。
マクロを作る上で基本機能をパーツ化する事で、開発時間の削減に繋がります。
処理はパーツ単位で分ける事を心掛けましょう。

分かりやすく説明すると、エクセルの「関数」と同様です。
SUM関数であれば セル内に「=SUM(1+2+3)」と記載すれば、セルには「6」と表示されますよね。
値を渡せば正しい値で返ってくる動きです。

このコードをコピペでOK

'■処理の高速化
Public Function Call_SpeedUp(flg As Boolean)
  
    If flg Then
        '■■画面更新を停止する
        Application.ScreenUpdating = False
        '■■セルの計算を手動にする
        Application.Calculation = xlCalculationManual
    Else
        '■■画面更新を再開する
        Application.ScreenUpdating = True
        '■■セルの計算を自動に戻す
        Application.Calculation = xlCalculationAutomatic
    End If
End Function

上記関数を使用する事で、

・エクセルの画面更新を停止します。
・セル計算を自動から手動に変更します

結果、マクロ計算処理が早くなります。
If flg Then のコード記載方法に疑問を思った方はこちらのページを参考にしてください。

使い方

上記をお好きなモジュール内にコピペしてください。
実際に使用する時は以下のような形で使用してください。

     '■画面更新停止、セルをマニュアル計算する
   Call Call_SpeedUp(True)
 
     '■画面更新再開、セルを自動計算する 
   Call Call_SpeedUp(False) 

注意点

マクロ実行時間が上記関数を使用して大幅に時間短縮できるようであれば、少し考え物かもしれません。

マクロ実行速度があがった!でも注意必要

大幅短縮されるケースは以下のパターンです。

  • 画面を頻繁に切り替えるような場合(いろんなブックを開いて何度も何度も切り替える場合)
  • セルを何度も選択する場合(Cells(1.1).Selectのようなコード記載の場合)
  • セル内で、計算を多くしている場合(マクロでセル内で計算させている場合)
  • セル内に、計算式がたくさん使用している場合

上記の場合、マクロのコード記載方法を変更する事でマクロ処理そのものを高速化させる事が可能です。
=上記のようなコードを頻繁に記載しているのであれば、少し方法を考えないといけません。

本サイト、もしくはGoogle検索で色んなVBA入門サイトがあります。そちらを参考に記載方法の変更を考えてください。

セル計算が手動計算になっている場合、一時的にセル計算をしたい

    '■セル再計算
    Application.Calculate
    

計算させたい場所のコードの前に上記を計算する事で、再計算を行います。
前述しましたが、再計算を頻繁に行わないといけないのであれば、コード自体の見直しをした方がいいです。

コメント

タイトルとURLをコピーしました