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のセル参照を減らすための知識」などを紹介しています。
コメント