VBA高速化

Excelマクロの画面更新を無効化し高速化しよう!初心者向けVBAの常識について

VBA高速化

Excelマクロの画面更新を無効化する方法を紹介します。画面更新を無効化する事で、「処理の度に画面を更新する」処理が省略されExcelマクロが高速化します。ExcelのVBAを利用する者にとっては常識的な知識なので、是非、習得しておきましょう。

また、この記事では画面更新以外のExcelマクロを組む上では常識的な知識をお伝えします。主に以下3点です。

  • イベントの無効化
  • 警告(アラート)の無効化
  • 関数の自動計算の無効化

Excelマクロの画面更新を無効化し高速化

パソコン使う人

パソコンの仕組みに詳しくない人には、分かりづらいかもしれませんが、「画面を更新する(表示する)」という処理を省略するだけで、プログラムは格段に処理速度が向上します。

Excelマクロの画面更新を無効化する方法

「Application.ScreenUpdating」のパラメータを変更する事で、画面更新のON/OFFを切り替える事ができます。画面更新を無効にしたい箇所に次の1行を書きます。

Application.ScreenUpdating = False

この宣言の後、プログラムの処理内容が画面に投影されなくなります。
処理完了後は、画面更新を有効化しましょう。

Application.ScreenUpdating = True

以下が実際にプログラムに書き込んだものになります。

Sub test()

  Dim i As Integer

  Application.ScreenUpdating = False 'ここから画面更新停止

  With ThisWorkbook.Worksheets(1)

     For i = 1 To 100
   
        .Cells(i, 1).Value = i '1行目~100行目まで入力

     Next

  End With

  Application.ScreenUpdating = True 'ここから画面更新再開

End Sub

たったこれだけで、Excelマクロの処理速度が劇的に改善するので、騙されたと思って適用してみてくださいね。

初心者向けVBAの常識について

プログラム

画面更新の無効化以外にも、Excelマクロの初心者が抑えて置くべき常識的な知識を3つ紹介しますね。これらも、Excelマクロの処理高速化には欠かせない要素です。

イベントの無効化

ここで言うイベントは、「Microsoft Excel Objects」のシートモジュールに設定した、Worksheet_Changeプロシージャを指します。

(例)セルA1に値が入力されたらセルB1に「1」を記入する

この処理をシートモジュールに設定した状態で、Excelマクロを使ってセルA1の値を変更すると、勝手にセルB1に「1」が記入されてしまいます。

この自動的に発動してしまう、Worksheet_Changeプロシージャを無効化するには、以下を宣言しておきます。

 Application.EnableEvents = False

もちろん、有効にする時はTrueにしましょう。

 Application.EnableEvents = True

以下が具体的な使用例です。

Sub test2()

    Dim i As Integer
        
    Application.EnableEvents = False 'ここからイベント停止

    With ThisWorkbook.Worksheets(1)
    
        For i = 1 To 100
            
            .Cells(i, 1).Value = i '1行目~100行目まで入力
            
        Next
    
    End With

    Application.EnableEvents = True  'ここからイベント再開
    
    .Cells(i, 1).Value = 1 'イベントの処理が動く

End Sub

ワークシートモジュールに何も設定しないなら不要な宣言ですが、思いがけない所でWorksheet_Changeプロシージャが使われている可能性もあります。

可能な限り「Application.EnableEvents = False」を宣言しておきましょう。

ファイル操作時のアラートを無効化

Excelファイルを開いたり、保存したり、閉じたりする際に、『確認ダイアログ』が表示されますね。確認ダイアログを無視する設定を施しておかないと、ダイアログが操作されれるまでマクロが次に進みません。

確認ダイアログを無効化する為に次を宣言します。

Application.DisplayAlerts = False

また、ファイル操作終了後は有効化しておきましょう。

Application.DisplayAlerts = True

実際のプログラムでは次のように記載します。

Sub tes3()

    Dim i As Integer
    Dim workBook_A as WorkBook

    With ThisWorkbook.Worksheets(1)

        Application.DisplayAlerts = False 'ここからダイアログ停止

        Set workBook_A = Workbooks.Open("E:\testBook.xlsx", False, False)
        
        Application.DisplayAlerts = False 'ここからダイアログ再開

        '<処理:ファイル操作など>
     WorkBook_A.WorkSheets(1).Cells(1,1).value = 1 'ファイルに値を入力

        Application.DisplayAlerts = False 'ここからダイアログ停止

        workBook_A.Close  '★
        
        Application.DisplayAlerts = False 'ここからダイアログ再開

    End With

End Sub

「★」の部分で「保存しますか?」と表示されず、ファイルを閉じます。

Excelシート関数の自動計算を無効化

Excelシート上に膨大な数の計算式(関数)が使われたシートに対して、Excelマクロで処理を行うと、セルの値が変わる度に『全ての計算式が自動で再計算』されるケースがあります。

ループ処理を100回行う場合は、100回『全ての計算式が自動で再計算』されるため、膨大な時間がかかりますね。Excelマクロで処理する際は、この自動計算をあらかじめ無効化しておきましょう。

次の宣言を行う事でExcelシートの計算式(関数)の自動計算が無効化されます。

Application.Calculation = xlCalculationManual

Excelマクロの処理完了時には、Excelシート使う人間の事を考えて、自動計算を有効化しておきましょう。

Application.Calculation = xlCalculationAutomatic

実際のプログラムでは次のように使います。

Sub test4()

    Dim i As Integer
        
    Application.Calculation = xlCalculationManual 'ここから自動計算停止

    With ThisWorkbook.Worksheets(1)
    
        For i = 1 To 100
            
            .Cells(i, 1).Value = i '1行目~100行目まで入力
            
        Next
    
    End With

    Application.Calculation = xlCalculationAutomatic 'ここから自動計算再開

End Sub

まとめ

初心者のExcelマクロを安定動作させるために、必要な宣言をまとめます。

  • Application.ScreenUpdating
  • Application.EnableEvents
  • Application.DisplayAlerts
  • Application.Calculation

これら4つを使い熟して、処理が安定するツールを作ってください。

他にも初心者のVBAが遅い原因4つを紹介!Excelのセル参照を減らすための知識などを紹介しています。

コメント

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