教えて!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:20210305081149p:plain

 

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

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

[プログラミング例]:

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で表示します。

f:id:m_kbou:20210218073015p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例]:

①Sheet1シートの<実行>ボタンには上記のプログラミング例のプログラムが登録されています。<実行>ボタンをクリックします。(※ボタンの作り方やボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210305081600p:plain

②処理結果は以下の様になります。Sheet2シートへの転記が終了し、MsgBoxで「81」が表示されます。(※処理に掛かった時間は「81秒」となります。)

f:id:m_kbou:20210305081702p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

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

 

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

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

[プログラミング例]:

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で表示します。

f:id:m_kbou:20210218073300p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例]:

①Sheet1シートの<実行>ボタンには上記のプログラミング例のプログラムが登録されています。<実行>ボタンをクリックします。(※ボタンの作り方やボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210305081600p:plain

②処理結果は以下の様になります。Sheet2シートへの転記が終了し、MsgBoxで「20」が表示されます。(※処理に掛かった時間は「20秒」となります。)

f:id:m_kbou:20210305082207p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

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

 

おわりに

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