マウスカーソルの描画を止めてマクロを軽くする方法を解説します。
Application.Cursorプロパティを使用します。
主にマクロを高速化するために使用するプロパティです。
Applicationによるマクロ高速化シリーズのまとめ記事はこちらをどうぞ
基本構文
' マウスカーソルの形状を固定 Application.Cursor = xlWait ' 砂時計型ポインター Application.Cursor = xlIBeam ' I字型ポインター Application.Cursor = xlNorthwestArrow ' 矢印型ポインター ' マウスカーソルを標準に戻す Application.Cursor = xlDefault
サンプルコード
Sub サンプルマクロ() ' マクロ実行冒頭でマウスカーソルを砂時計型に固定 Application.Cursor = xlWait ' ↓マクロ実行中は砂時計型ポインターのまま固定 Dim R As Long For R = 1 To 1000 Worksheets(1).Cells(R, 1) = 1 Next ' マクロ終了時に標準カーソルへ戻す Application.Cursor = xlDefault End Sub
解説
Application.Cursorプロパティにカーソル形状を指定することで、
マクロ実行中のマウスカーソルの表示を固定できます。
指定できる主な値は以下の通りです。
| 値 | 意味 |
|---|---|
| xlWait | 砂時計型ポインター |
| xlIBeam | I字型ポインター |
| xlNorthwestArrow | 矢印型ポインター |
| xlDefault | Excel標準のカーソル |
「標準のカーソル」とは「当てているものにあわせて形状が変わる状態」のことで、
これを別の値で固定にすることでマクロが多少高速化されます。
最初にxlWaitにして最後にxlDefaultに戻す使い方が多いですが、
実は固定さえすれば、別に矢印にしても同様に高速化します。
とはいえ分かりやすさを考えると、砂時計にしておくのが無難でしょう。
余談ですが、VBA定数上の正式名称は「砂時計型ポインター」なのですが、
Windows8を最後に砂時計の画像はなくなっており今はこれです↓

これを何というのかは知らないのですがxlWaitにするとこれになります。
旧砂時計が急に出てくることは基本ありませんのでご安心下さい。
(カーソルのサイズを上げると出てくるようです)
他の高速化コードとセットで実行する
高速化目的で使う場合は、
ScreenUpdatingやCalculationなどとセットで使うのがおすすめです。
Application.ScreenUpdating = False ' 描画の停止 Application.Calculation = xlCalculationManual ' 自動計算の停止 Application.EnableEvents = False ' イベントマクロの停止 Application.Cursor = xlWait ' マウスカーソルを砂時計型に固定
このコードを毎回4つ書くのは面倒ですので、汎用関数にしておきましょう。
Sub サンプルマクロ() Call Excelの自動更新を停止する ' マクロのメインコード Call Excelの自動更新を再開する End Sub ' マクロ高速化用汎用関数 Sub Excelの自動更新を停止する() Application.ScreenUpdating = False Application.EnableEvents = False Application.Calculation = xlCalculationManual Application.Cursor = xlWait End Sub Sub Excelの自動更新を再開する() Application.ScreenUpdating = True Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic Application.Cursor = xlDefault End Sub
この関数を用意しておけば、以降はCall1行で済むようになります。
個人用マクロブックなどにこの関数を用意しておきましょう。
詳しくはこちらの記事をどうぞ。
カーソルが元に戻らなくなったときの対処法
Application.Cursorは、ScreenUpdatingと違い、
End Subで自動的にxlDefaultへ戻るわけではありません。
そのため、マクロの最後では必ずxlDefaultに戻しておきましょう。
問題はエラーが起きた場合で、
マクロがエラーで止まった場合はカーソルが砂時計のままになります。
この時、カーソルを元に戻すには以下2つのいずれかの方法を用います。
イミディエイトウィンドウで標準カーソルに戻す
Application.Cursorはイミディエイトウィンドウでも設定可能です。
よってカーソルが砂時計のままになってしまったときは、
Application.Cursor = xlDefault
をイミディエイトウィンドウで実行すれば標準カーソルに戻せます。
汎用関数をリボンやツールバーから実行
先ほど紹介した汎用関数2つのうち再開を行う以下の関数を再掲します。
Sub Excelの自動更新を再開する() Application.ScreenUpdating = True Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic Application.Cursor = xlDefault End Sub
このコードは先ほど他のマクロ内でCallして使っていましたが、
Subプロシージャですのでリボンやツールバーにも設定できます。
これを設置しておけばワンボタンで標準カーソルに戻せる上、
画面描画・自動計算・イベントマクロの復元もセットで行えます。
関数としてももちろん便利ですので、ぜひとも活用していきましょう。
おまけ:Cursorの高速化効果について
さてこのCursorですが、この記事を書くために365環境でいろいろ試したのですが、
速度面で効果が出た処理がありませんでした。
Formボタンを置いてみて、ボタンとセルを行き来しながら実行
などもいろいろ試してみましたがほとんど効果はなし。
マウスカーソルの影響はExcelのバージョンやWindowsのバージョン、
対象のExcelファイルの状況によるところが大きいと感じています。
個人的な所感だけおいておくと、
- Excel2013から「処理するExcelファイルの上にカーソルがあると遅くなる」ようになった
- マクロ実行後にカーソルをタスクバーに避難するとマクロが高速化した
- この頃のExcelはApplication.Cursorの効力がかなり大きかった
- Excel2016でもそうだった気がするという情報提供あり
- いつの間にか↑の状況が消えた。xlWaitにしなくてもくるくるマークになるようにもなった
- 現在、365においてはCursorの効果は限定的な様子
- でもたまにこれを入れないと劇遅になるマクロがある(気がする)
という感じです。
入れないメリットも特にないですし、
効果があるとき用に書いておけばいいという感じでしょうか。
私の感想という感じになってしまいますが、一応ご参考ください。