教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について説明していきます。

【ExcelVBA その他操作】処理中の画面ちらつきを止める(ScreenUpdating)にはどうすればいいの?教えて!

       f:id:m_kbou:20200418090502p:plain

VBAを実行するとセル移動やシート移動、他のシートの呼び出しやデータの並べ替え等で画面がちらつく場合があります。このちらつきは操作をするユーザにとって非常に見づらく、処理スピードを落とす原因になります。このちらつきを抑える方法について説明します。

 

【目次】

 

構文

記述方法は、以下の通りとなります。

画面のちらつきを停止する・再開する記述方法

=======================================================================

Application.ScreenUpdating = False

Application.ScreenUpdating = True

=======================================================================

[説明]:

ExcelVBAで記述したプログラムを実行する際に画面のちらつきを止めるには「Application.ScreenUpdating = False」と記述します。また、画面のちらつきを再開する(元に戻す)には「Application.ScreenUpdating = True」と記述します。

 

使い方

例題として、以下の右画面(sheet1)の内容を左画面(sheet2)へ移す処理(コピー&貼り付け)で、画面のちらつきを止めている場合止めていない場合のパターンについて、処理時間の違いについて説明します。

f:id:m_kbou:20190611105225p:plain 

画面のちらつきを止めていない場合

画面のちらつきを止めていない場合の処理について説明します。

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。

-------------------------------------------------

Sub サンプル()

    '↓処理①
    Dim 行 As Double
    Dim 数字 As Double
    Dim 開始時間 As Date
    Dim 終了時間 As Date
   
    '↓処理②
    開始時間 = Now
   
    '↓処理③
    For 行 = 1 To 10000
        Sheets("Sheet1").Select
        数字 = Range("A" & 行)
        Sheets("Sheet2").Select
        Range("A" & 行) = 数字
    Next
   
    '↓処理④
    終了時間 = Now
   
    '↓処理⑤
    MsgBox DateDiff("s", 開始時間, 終了時間)

End Sub

-------------------------------------------------

処理の流れは以下の通りとなります。

[処理①]:変数の定義
Dimによる変数の定義となります。

[処理②]:開始時間(現在の時間)の取得
処理の開始時刻を取得します。

[処理③]:転記作業の記述
For~Next文を使用し[処理①]で指定した変数:行に1から10,000の値を順次セットし、処理を10,000回実行します。1回目の処理では、Sheet1を呼び出した後にSheet1のA1セルに入力されている値を変数:数字にセットし、Sheet2を呼び出した後にSheet2のA1セルにセットします。2回目の処理では、Sheet1を呼び出した後にSheet1のA2セルに入力されている値を変数:数字にセットし、Sheet2を呼び出した後にSheet2のA2セルにセットします。(これを10,000回目まで実行します)

[処理④]:終了時間(現在の時間)の取得
処理の終了時刻を取得します。

[処理⑤]:処理時間の計算
Datediff関数を使い開始時刻~終了時刻までの掛かった秒数をMsgBoxで表示します。

[実行例]:

※処理に掛かった時間は「116秒」となりました。

f:id:m_kbou:20190611105243p:plain

画面のちらつきを止めていない場合の処理説明は以上です。 

 

画面のちらつきを止めている場合

画面のちらつきを止めている場合の処理について説明します。

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。

-------------------------------------------------

Sub サンプル()

    '↓処理①
    Dim 行 As Double
    Dim 数字 As Double
    Dim 開始時間 As Date
    Dim 終了時間 As Date
   
    '↓処理②
    Application.ScreenUpdating = False
   
    '↓処理③
    開始時間 = Now
   
    '↓処理④
    For 行 = 1 To 10000
        Sheets("Sheet1").Select
        数字 = Range("A" & 行)
        Sheets("Sheet2").Select
        Range("A" & 行) = 数字
    Next
   
    '↓処理⑤
    終了時間 = Now
   
    '↓処理⑥
    Application.ScreenUpdating = True
  
    '↓処理⑦
    MsgBox DateDiff("s", 開始時間, 終了時間)

End Sub

-------------------------------------------------

処理の流れは以下の通りとなります。

[処理①]:変数の定義
Dimによる変数の定義となります。

[処理②]:画面ちらつきの停止
Application.ScreenUpdating = False」を指定する事で、画面のちらつきを止めます。

[処理③]:開始時間(現在の時間)の取得
処理の開始時刻を取得します。

[処理④]:転記作業の記述
For~Next文を使用し[処理①]で指定した変数:行に1から10,000の値を順次セットし、処理を10,000回実行します。1回目の処理では、Sheet1を呼び出した後にSheet1のA1セルに入力されている値を変数:数字にセットし、Sheet2を呼び出した後にSheet2のA1セルにセットします。2回目の処理では、Sheet1を呼び出した後にSheet1のA2セルに入力されている値を変数:数字にセットし、Sheet2を呼び出した後にSheet2のA2セルにセットします。(これを10,000回目まで実行します)

[処理⑤]:終了時間(現在の時間)の取得
処理の終了時刻を取得します。

[処理⑥]:画面ちらつきの再開
Application.ScreenUpdating = True」を指定する事で、画面のちらつきを再開します。

[処理⑦]:処理時間の計算
Datediff関数を使い開始時刻~終了時刻までの掛かった秒数をMsgBoxで表示します。

[実行例]:

※処理に掛かった時間は「34秒」となりました。

f:id:m_kbou:20190611105331p:plain

画面のちらつきを止めている場合の処理説明は以上です。

 

おわりに

今回は画面のちらつきを抑える方法について説明をしました。上記の説明でも分かる通り、画面のちらつきを抑える事で処理スピードも大幅にアップさせる事ができます。VBAマクロを使用するユーザはできるだけ処理がスピーディに終わる事を望んでいると同時に、処理時間が長いとイライラが募り、折角作成したVBAマクロも使用してくれなくなります。スピーディな処理完了を目指しプログラムを記述するの際には必ず設定する事をお勧めします。