1. はじめに
ARアドバンストテクノロジ株式会社(ARI)の鈴木タクヤです。
先日投稿した以下リンク先の記事ですが、ありがたいことにXでも本記事のいいねやリポストをいただきました。反響があると嬉しいものです。
今回からExcelフィルタリングツールのソースコード解説を連載予定です。
第1回ですが、いきなり中級者向けの記事となります。まだマクロ&VBAについてほぼ何も知らないよという人は、以下のコードを「おまじない」として既存のVBAに追記するだけでも、マクロの処理が速くなるかもしれません。Excelフィルタリングツールの使用上の注意点にも絡む内容のため、初回での解説となることをご容赦ください。
2. 処理高速化のおまじない
'処理高速化のおまじない
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
.Cursor = xlWait
End With
'(中略)
'処理高速化のおまじない解除
With Application
.Cursor = xlDefault
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
3. 解説
初めに申しておきますと、今回のExcelフィルタリングツールにおいては この「おまじない」による処理速度向上は期待できません。 全体の処理にそれほど時間がかからないので、この記載があろうとなかろうと体感速度は変わらないはずです。
とはいえ汎用性は高く、 処理中に画面の切り替わりが多く発生する場合 や、 大量のデータを処理する場合 に効果を発揮することが多いので、ご紹介します。
3-1 Application.ScreenUpdating
「Application」はExcel全体を表すオブジェクト1 です。オブジェクトはその種類ごとにプロパティ2 やメソッド3 が定義されており、「ScreenUpdating」は画面表示の更新を制御するプロパティです。
マクロの処理開始時に「False」に設定することで、画面の更新を停止し、マクロ終了直前に「True」に設定することで、画面の更新を再開します。
「マクロって、処理が進むのを眺めるのが楽しいよね!」という方は楽しみが削がれてしまうのでご注意ください。
3-2 Application.Calculation
「Calculation」は計算モードを制御するプロパティです。
マクロの処理開始時に「xlCalculationManual」に設定することで、計算モードを手動にし、マクロ終了直前に「xlCalculationAutomatic」に設定することで、計算モードを自動にします。
3-3 Application.EnableEvents
「EnableEvents」はオブジェクトに対するイベント4 の発生を制御するプロパティです。
マクロの処理開始時に「False」に設定することで、新たなイベント発生を無効にし、マクロ終了直前に「True」に設定することで、新たなイベント発生を有効にします。
3-4 Application.Cursor
「Cursor」はカーソル、すなわちマウスポインタの形状を制御するプロパティです。
マクロの処理開始時に「xlWait」に設定することで、処理中を表す砂時計マークやリングカーソル(俗にいう「ぐるぐるマーク」)に変更し、マクロ終了直前に「xlDefault」に設定することで、標準のポインタ(状況に応じて、処理中/矢印/I字型)に変更します。これによりポインタがチラつかないようにします。
3-5 補足;Withブロックについて
本来、オブジェクトとプロパティは「.」でつなぎ、
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.Cursor = xlWait
と記述するのですが、今回紹介した ように「With ●●●」と「End With」で挟まれた「Withブロック」の中では、「●●●」の記述を省略することができます。同じオブジェクトやメソッドに関する記述が続く場合等に便利ですが、読みづらくなることがあります。
4. 注意点
今回紹介した「処理高速化のおまじない」ですが、マクロの実行中にエラーで処理が止まってしまった場合は「おまじない解除」の処理が呼ばれずに、カーソルが砂時計のままになってしまうといった不具合が発生します。
そのため「おまじない」を使用する場合には、Excelフィルタリングツールのように「おまじない解除」のみを実行するマクロを切り出してボタンに割当てることや、エラー時の処理を実装する場合にはその中で「おまじない解除」を実行することをおすすめします。
エラーハンドリングの例:
'■フォーマットエラーメッセージ表示処理
Sub showFormatErrorMessage(ByVal NoFromTheBeginning As Integer)
MsgBox "フィルタ対象範囲の開始位置は" & vbCrLf & "列:英字、行:数字(例:A1 など)で指定してください" _
& vbCrLf & " <エラー箇所> " & NoFromTheBeginning & "文字目"
Call endMacro '←ここで「おまじない解除」を呼び出す!!!
End Sub
'■マクロ終了処理(処理終了直前にしたいことを実行・エラー落ち時の処理中ポインタ解除)
Sub endMacro()
'処理高速化のおまじない解除
With Application
.Cursor = xlDefault
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End
End Sub
5. おわりに
いかがだったでしょうか。
次回の解説第2回 以降は、VBA初心者向けにExcelフィルタリングツールでの実例を踏まえつつ、VBAの記述の仕方や、テクニック等について連載していきたいと思います。
次回以降も本稿と同じく、「Excelフィルタリングツール解説シリーズ」のタグをつけて投稿予定です。また解説記事の一覧については上でもリンクを張っている こちら の記事下部「解説記事のリンク」にも掲載予定です。よろしければご活用ください。
👇次回
6. 参考文献
こちらはMicrosoftの公式ドキュメントです。
こちらは私がものすごくお世話になっている「エクセルの神髄」という解説サイト。より深く学習を進めたい方は是非。