現象
Microsoft Excel 2013 で複数のブックを開き Appliction.ScreenUpdating プロパティ使用中にアクティブブックが切り替わるとウィンドウが点滅したように見えたり、デスクトップが見えることがあります。
原因
Excel 2013 から、ウィンドウの管理方法は SDI (Single Document Interface) に仕様変更されました。
複数のブックを開き、アクティブ ウィンドウ (ブック) を切り替えると、それぞれのウィンドウがトップレベルのウィンドウになりうるため、一般的なウィンドウの選択動作と同じように、選択されたウィンドウ (ブック) がトップ レベルのウィンドウとなり、直前にアクティブだったウィンドウ (ブック) は非アクティブ ウィンドウとなる動作が発生します。
また、Excel 2013 では、画面の更新処理は最後に行われるように動作変更が行われました。
そのため、画面の更新処理を抑止したい場合、Application.ScreenUpdating プロパティに False を設定しても、トップ レベルのウィンドウが切り替わる動作と画面の更新処理が最後に行われるため、デスクトップが見えるなど画面がちらついたように見えることがあります。
この動作は、Excel 2013 の実装上の制限です。
回避策
DoEvents と Window.Activate メソッドを併用し、画面表示の更新処理を強制的に行うことで改善できる場合があります。
ただし、どの程度画面のちらつきが発生するかは、マクロの処理内容やコード量に依存するため、DoEvents と Window.Activate メソッドを追加するタイミングは、実際のシステムにあわせ十分なテストを実施し追加してください。
以下のマクロのコード例は、問題の再現手順のマクロを改善する場合の対処策の一例です。
Private Sub Sample()
Dim wb As Workbook
Application.ScreenUpdating = False
Set wb = Workbooks.Open(ActiveWorkbook.Path & "\Book1.xlsx")
DoEvents
wb.Windows(1).Activate
DoEvents
ThisWorkbook.Windows(1).Visible = False
DoEvents
Application.ScreenUpdating = True
End Sub
詳細
問題の再現手順:
-
Excel 2013 を起動します。
-
A1 セルに book1 と入力し、[F12] キーを押下し、[名前を付けて保存] ダイアログで任意のファイル名を指定し、ファイルの種類では "Excelブック (*.xlsx)" を選択し、[保存] を行います。例として、Book1.xlsx ファイルとして保存します。
-
Book1.xlsx ファイルを閉じます。
-
再度、Excel 2013 を起動します。
-
[開発]-[挿入]-[フォーム コントロール]-[ボタン (フォーム コントロール)] をクリックします。
-
Sheet1 上にドラッグします。
-
[マクロの登録] ダイアログが表示されたら、マクロ名が "ボタン1_Click" となっていることを確認し、[新規作成] ボタンをクリックします。
-
Visual Basic Editor が起動したら、以下のコードを挿入します。
Sub ボタン1_Click()
Application.ScreenUpdating = False
Workbooks.Open ActiveWorkbook.Path & "\Book1.xlsx"
Application.ScreenUpdating = True
ThisWorkbook.Windows(1).Visible = False
End Sub
-
[ファイル]-[終了して Microsoft Excel へ戻る] をクリックします。
-
[F12] キーを押下し、[名前を付けて保存] ダイアログで任意のファイル名を指定し、ファイルの種類では "Excel マクロ有効ブック (*.xlsm)" を選択し、[保存] を行います。
-
[ボタン 1] をクリックします。
結果:
デスクトップが一瞬見えてからBook1.xlsx が表示されます