和風スパゲティのレシピ

日本語でコーディングするExcelVBA

マウスカーソルの描画を停止する - Cursor

マウスカーソルの描画を止めてマクロを軽くする方法を解説します。

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を最後に砂時計の画像はなくなっており今はこれです↓
Waitカーソル

これを何というのかは知らないのですが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行で済むようになります。
個人用マクロブックなどにこの関数を用意しておきましょう。

詳しくはこちらの記事をどうぞ。

www.limecode.jp

カーソルが元に戻らなくなったときの対処法

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の効果は限定的な様子
  • でもたまにこれを入れないと劇遅になるマクロがある(気がする)

という感じです。

入れないメリットも特にないですし、
効果があるとき用に書いておけばいいという感じでしょうか。

私の感想という感じになってしまいますが、一応ご参考ください。