【5分でVBA学習】マクロ処理高速化 ～Excelフィルタリングツール コード解説 #1～

# 1. はじめに
ＡＲアドバンストテクノロジ株式会社（ＡＲＩ）の鈴木タクヤです。

先日投稿した以下リンク先の記事ですが、ありがたいことにXでも本記事のいいねやリポストをいただきました。反響があると嬉しいものです。

https://qiita.com/TakuyaSuzuki/items/75789a1cf0b3a7c31c0b

今回からExcelフィルタリングツールのソースコード解説を連載予定です。

第1回ですが、いきなり中級者向けの記事となります。まだマクロ&VBAについてほぼ何も知らないよという人は、以下のコードを「おまじない」として既存のVBAに追記するだけでも、マクロの処理が速くなるかもしれません。Excelフィルタリングツールの使用上の注意点にも絡む内容のため、初回での解説となることをご容赦ください。

# 2. 処理高速化のおまじない
```vb:Excelフィルタリングツールより抜粋    
    '処理高速化のおまじない
    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」に設定することで、画面の更新を再開します。

:::note warn
「マクロって、処理が進むのを眺めるのが楽しいよね！」という方は楽しみが削がれてしまうのでご注意ください。
:::
[^1]: __オブジェクト__：ワークシート、セル、グラフ等の、アプリケーションの要素を表すもの。
[^2]: __プロパティ__：オブジェクトの属性。有効/無効、表示/非表示等を表す。
[^3]: __メソッド__：オブジェクトが実行できる処理。
## 3-2 Application.Calculation
「Calculation」は計算モードを制御するプロパティです。

マクロの処理開始時に「xlCalculationManual」に設定することで、計算モードを手動にし、マクロ終了直前に「xlCalculationAutomatic」に設定することで、計算モードを自動にします。

## 3-3 Application.EnableEvents
「EnableEvents」はオブジェクトに対するイベント[^4] の発生を制御するプロパティです。

マクロの処理開始時に「False」に設定することで、新たなイベント発生を無効にし、マクロ終了直前に「True」に設定することで、新たなイベント発生を有効にします。
[^4]: __イベント__：マウスクリックやキー入力のようなユーザ操作や、マクロの処理によるセルの変更といった、オブジェクトによって認識されるアクション。

## 3-4 Application.Cursor
「Cursor」はカーソル、すなわちマウスポインタの形状を制御するプロパティです。

マクロの処理開始時に「xlWait」に設定することで、処理中を表す砂時計マークやリングカーソル（俗にいう「ぐるぐるマーク」）に変更し、マクロ終了直前に「xlDefault」に設定することで、標準のポインタ（状況に応じて、処理中/矢印/I字型）に変更します。これによりポインタがチラつかないようにします。

## 3-5 補足；Withブロックについて
本来、オブジェクトとプロパティは「.」でつなぎ、
```vb
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
        Application.EnableEvents = False
        Application.Cursor = xlWait
```
と記述するのですが、[今回紹介した](#2-処理高速化のおまじない) ように「With ●●●」と「End With」で挟まれた「Withブロック」の中では、「●●●」の記述を省略することができます。同じオブジェクトやメソッドに関する記述が続く場合等に便利ですが、読みづらくなることがあります。

# 4. 注意点
今回紹介した「処理高速化のおまじない」ですが、マクロの実行中にエラーで処理が止まってしまった場合は「おまじない解除」の処理が呼ばれずに、カーソルが砂時計のままになってしまうといった不具合が発生します。

そのため「おまじない」を使用する場合には、Excelフィルタリングツールのように「おまじない解除」のみを実行するマクロを切り出してボタンに割当てることや、エラー時の処理を実装する場合にはその中で「おまじない解除」を実行することをおすすめします。

<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2566746/c7cff988-ad6c-0175-bdbb-99055daf53a9.png">

エラーハンドリングの例：
```vb: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回](https://qiita.com/TakuyaSuzuki/items/cbb8f2e32cc0294f53fe "【5分でVBA学習】避けては通れないSubプロシージャ ～Excelフィルタリングツール コード解説 #2～")__ 以降は、VBA初心者向けにExcelフィルタリングツールでの実例を踏まえつつ、VBAの記述の仕方や、テクニック等について連載していきたいと思います。

次回以降も本稿と同じく、「__Excelフィルタリングツール解説シリーズ__」のタグをつけて投稿予定です。また解説記事の一覧については上でもリンクを張っている __[こちら]( https://qiita.com/TakuyaSuzuki/items/75789a1cf0b3a7c31c0b "【ツール提供】Excelユーザなら全員使える?! Excelフィルタリングツール")__ の記事下部「解説記事のリンク」にも掲載予定です。よろしければご活用ください。

👇次回

https://qiita.com/TakuyaSuzuki/items/cbb8f2e32cc0294f53fe

# 6. 参考文献
こちらはMicrosoftの公式ドキュメントです。

https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/understanding-objects-properties-methods-and-events#events

こちらは私がものすごくお世話になっている「エクセルの神髄」という解説サイト。より深く学習を進めたい方は是非。

https://excel-ubara.com/excelvba4/EXCEL228.html