その他関連のテクニック

CPU使用率を抑える方法

(Excel 97/2000/2002/2003/2007)
For NextステートメントやDo Loopステートメントなどで、非常に長い処理を行うと、CPUの使用率が100%近くに上昇することがあります。
長い処理が終わるまで、コーヒーでも飲んで休憩できればいいのですが、その間に、別のアプリケーションで別の仕事をしようとすると困ります。
マクロがCPUを独占してしまうので、場合によっては日本語変換さえ思うようにいかず、結局、マクロが終わるまで何もできない…などという事態になりかねません。

次のコードは、セルA1に1から1000000までの数値を代入します。
パソコンの環境によりますが、マクロが終了するまで、CPUの使用率は高くなります。

Sub Sample()
    Dim i As Long
    Do
        i = i + 1
        Range("A1") = i
        If i > 1000000 Then Exit Do
    Loop
End Sub   
VBAには、マクロが占有している制御をOSに開放するDoEvents関数があります。 こうした長い処理などで、ユーザーからのキー入力を受け取って、処理を途中で停止するときなどに使う関数です。 しかし、DoEvents関数を実行しても、CPUの使用率は下がりません。
Sub Sample()
    Dim i As Long
    Do
        i = i + 1
        Range("A1") = i
        If i > 1000000 Then Exit Do
        DoEvents
    Loop
End Sub   
こんなときは、Windows APIのSleep関数を使います。 Sleep関数は、指定した時間だけ処理を停止させる関数です。 引数には停止させる時間をミリ秒単位で指定します。
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Sample()
    Dim i As Long
    Do
        i = i + 1
        Range("A1") = i
        If i > 1000000 Then Exit Do
        Sleep 1
    Loop
End Sub   
「Sleep 1」は0.001秒だけ処理を停止させます。 わずかな時間ですが処理が停止するので、CPUの使用率が跳ね上がることはありません。