まさ工房

ExcelVBAとAcessDBを利用した業務支援ツールを作成する工房です

【Excelマクロ・VBA】処理中の画面ちらつきを止めるにはどうすればいいの?教えて!

       f:id:m_kbou:20190611105206p:plain

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

 

【目次】

 

構文

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

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

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

Application.ScreenUpdating = False

Application.ScreenUpdating = True

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

[説明]:

「Application.ScreenUpdating = False」は、画面の更新(ちらつき)を停止するとの意味になります。また、「Application.ScreenUpdating = True」は、画面の更新(ちらつき)を再開するとの意味になります。

 

使い方

画面のちらつきを抑えていない場合抑えている場合について、以下右画面(sheet1)の内容を左画面(sheet2)へ移す処理で、For~Next文を使用して説明していきます。

f:id:m_kbou:20190611105225p:plain

画面のちらつきを抑えていない場合

「Application.ScreenUpdating」を使用していない場合の処理です。

[記述例]:

※以下の記述例は、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から10000の値を順次セットし、処理を10000回実行します。1回目の処理では、Sheet1を呼び出した後にSheet1のA1セルに入力されている値を変数:数字にセットし、Sheet2を呼び出した後にSheet2のA1セルにセットします。2回目の処理では、Sheet1を呼び出した後にSheet1のA2セルに入力されている値を変数:数字にセットし、Sheet2を呼び出した後にSheet2のA2セルにセットします。(これを10000回目まで実行します)
[処理④]:終了時間(現在の時間)を取得します
上記[処理③]の処理が終了した時間を取得します。
[処理⑤]:処理時間を計算します
Datediff関数を使い、開始時間~終了時間までの掛かった秒数をMsgBoxで表示します。

[実行例]:

f:id:m_kbou:20190611105243p:plain

※処理が終了するまでに「116秒」の時間が掛かりました。 

 

画面のちらつきを抑えている場合

「Application.ScreenUpdating」を使用している場合の処理です。

[記述例]:

※以下の記述例は、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から10000の値を順次セットし、処理を10000回実行します。1回目の処理では、Sheet1を呼び出した後にSheet1のA1セルに入力されている値を変数:数字にセットし、Sheet2を呼び出した後にSheet2のA1セルにセットします。2回目の処理では、Sheet1を呼び出した後にSheet1のA2セルに入力されている値を変数:数字にセットし、Sheet2を呼び出した後にSheet2のA2セルにセットします。(これを10000回目まで実行します)
[処理⑤]:終了時間(現在の時間)を取得します
上記[処理④]の処理が終了した時間を取得します。
[処理⑥]:画面の更新(ちらつき)を再開します
「Application.ScreenUpdating = True」を指定する事で、画面のちらつきを再開します。
[処理⑦]:処理時間を計算します
Datediff関数を使い、開始時間~終了時間までの掛かった秒数をMsgBoxで表示します。

[実行例]:

f:id:m_kbou:20190611105331p:plain

※処理が終了するまでに「34秒」の時間で済みました。 

 

おわりに

今回は、「Application.ScreenUpdating」を使用した画面のちらつきを抑える方法について説明をしました。上記の説明でも分かる通り、画面のちらつきを抑える事で、処理スピードも大幅に改善されます。プログラム記述の際には、必ず設定する様に心掛けて下さい。