目次

1. はじめに:VBAで別ブックを開く際の「画面のチラつき」問題

Excel VBAを活用して業務効率化を図る際、他のExcelブックをマクロから開いてデータを転記したり、必要な情報を集計したりする処理は非常に頻繁に使用されます。しかし、VBAの Workbooks.Open メソッドを使用して別のブックを開く処理を実行すると、マクロの実行中に画面が激しく切り替わり、「画面のチラつき」が発生するという問題に直面します。

複数のファイルを順番に開いては閉じるようなループ処理(繰り返し処理)を構築した場合、画面上でExcelのウィンドウが何度も開閉を繰り返し、チカチカと点滅するような状態になります。これは見た目に煩わしく、ユーザーに視覚的なストレスを与えるだけでなく、VBAの処理速度(パフォーマンス)を著しく低下させる最大の原因となります。

この記事では、VBAで別ブックを開く際の画面のチラつきを完全に停止させ、マクロの処理速度を劇的に向上させる Application.ScreenUpdating プロパティの正しい使い方について、Microsoftの公式仕様や実務のベストプラクティスに基づいた正確な情報をもとに徹底的に解説します。

2. Application.ScreenUpdatingプロパティとは?

画面再描画のメカニズムとパフォーマンスへの影響

Excelは標準仕様として、マクロのコードが1行実行されるたびに、セルの選択状態、シートの切り替え、新しいブックの展開といったあらゆる変更を検知し、画面の表示を最新の状態に更新(再描画)しようとします。

特に別のブックを開く処理は、OS(オペレーティングシステム)レベルでのファイル読み込みと、Excelアプリケーション上での新しいウィンドウの生成・描画を伴うため、PCにとって非常に負荷の高い重い処理です。画面の再描画が行われるたびにCPUやメモリのリソースが消費されるため、結果としてマクロ全体の実行時間が長くなってしまいます。

Application.ScreenUpdating は、マクロ実行中におけるこの「画面の更新(再描画)」処理を一時的に停止するかどうかをコントロールするためのプロパティです。画面の再描画という重い処理を省略することで、VBAはバックグラウンドでのデータ処理に専念できるようになり、処理時間が大幅に短縮されます。

TrueとFalseが意味するもの

このプロパティには、ブール型(Boolean)である True または False のいずれかを設定します。

  • True(デフォルト状態): 画面の更新を行います。マクロの処理過程がすべて画面に表示され、ブックが開く様子やセルが選択される様子がリアルタイムで描画されます。
  • False: 画面の更新を完全に停止します。マクロの処理過程は裏側(メモリ上)だけで行われ、ディスプレイ上の画面はマクロ実行開始直後の状態で静止します。ユーザーからは一瞬で処理が終わったように見えます。

3. Application.ScreenUpdatingの基本的な使い方

記述する場所のルール

使い方は非常にシンプルです。マクロの実質的な処理が始まる直前(最も先頭に近い部分)に False を代入し、すべての処理が終わった直後(マクロが終了する直前)に True を代入して元の状態に戻すだけです。

別ブックを開く Workbooks.Open メソッドの前に記述することで、ブックが開く際の描画を完全に隠すことができます。

別ブックを開く基本のサンプルコード

以下は、指定した別のExcelブックを開き、特定のセルの値をコピーして自ブックに貼り付け、その後別ブックを閉じるという基本的な操作のサンプルコードです。

Sub OpenWorkbookWithoutFlicker()
    ' 画面の更新を停止(チラつき防止・高速化)
    Application.ScreenUpdating = False

    Dim targetPath As String
    Dim wb As Workbook
    Dim ws As Worksheet

    ' 開きたい別ブックのフルパスを指定(環境に合わせて変更してください)
    targetPath = "C:\Data\TargetBook.xlsx"

    ' 別ブックを開き、オブジェクト変数に格納する
    Set wb = Workbooks.Open(targetPath)
    Set ws = wb.Worksheets("Sheet1")

    ' --- ここからデータ処理 ---
    ' 例:別ブックのA1セルの値を、マクロを実行しているブックのA1セルに転記する
    ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = ws.Range("A1").Value
    ' --- 処理ここまで ---

    ' 開いた別ブックを保存せずに閉じる
    wb.Close SaveChanges:=False

    ' メモリの解放
    Set ws = Nothing
    Set wb = Nothing

    ' 画面の更新を再開(必ずTrueに戻す)
    Application.ScreenUpdating = True

    MsgBox "処理が完了しました。", vbInformation
End Sub

このコードを実行すると、バックグラウンドで「TargetBook.xlsx」が開かれ、データの転記が行われ、速やかに閉じられます。この間、画面には一切の変化がなく、ユーザーはチラつきを感じることなく処理完了のメッセージボックスを受け取ることができます。

4. 絶対に守るべき注意点:処理後は必ずTrueに戻す

戻し忘れた場合に発生する「フリーズ現象」

Application.ScreenUpdating = False を使用する上で、最も注意しなければならないのが「処理の最後に必ずTrueに戻す」というルールです。

もし Application.ScreenUpdating = True を記述し忘れたままマクロの実行が終了してしまうと、Excelの画面描画機能が停止したままの状態に取り残されます。この状態に陥ると、ユーザーがマウスでセルをクリックしたり、スクロールしたり、キーボードで文字を入力したりしても、画面上には一切の反応が現れません。

内部的にはデータが入力されていたり選択セルが移動していたりするのですが、それがディスプレイに描画されないため、ユーザーからは「Excelが完全にフリーズ(ハングアップ)して壊れてしまった」ように見えてしまいます。近年のExcelのバージョンではマクロ終了時に自動でTrueに復帰するフェイルセーフ機能が働いているケースもありますが、環境や実行状況によっては復帰しないため、マイクロソフトの公式リファレンスにおいても開発者が明示的にTrueへ戻すことが強く推奨されています。

デバッグ(ステップ実行)時の挙動についての注意

マクロの開発中、コードに不具合がないかを確認するために「F8キー」を使用して1行ずつプログラムを実行する「ステップ実行」を行うことがあります。

しかし、Application.ScreenUpdating = False の行を通過した後は、ステップ実行中であってもExcelの画面は更新されなくなります。別ブックを開くコードを通過しても画面上にそのブックは表示されず、セルの値が変化しても見えなくなるため、デバッグ作業が非常に困難になります。

そのため、開発段階やエラーの原因調査を行う際には、一時的にこの行の先頭にシングルクォーテーション(’)を付けてコメントアウトし、画面の更新を有効にした状態で動作確認を行うのが一般的なテクニックです。

5. 実務で必須!エラー発生時にも画面更新を確実に復旧させる方法

エラーで処理が中断する致命的なリスク

実務においてマクロを運用していると、予期せぬエラーが発生することは日常茶飯事です。例えば、別ブックを開こうとした際に「指定したファイル名が変更されていた」「フォルダが移動されていた」「ネットワークドライブに接続できなかった」などの理由で Workbooks.Open が失敗することがあります。

もし、通常通り上から下へ流れるだけのコードを書いていた場合、途中でエラーが発生するとVBAはその行で強制終了し、エラーメッセージダイアログを表示して動作を止めてしまいます。このとき、コードの末尾に記述しておいた Application.ScreenUpdating = True の行には到達しないままマクロが終わってしまうため、前述した「画面がフリーズした状態」が引き起こされます。

On Error GoTo構文を使用した堅牢なコード構造

このような悲惨な事態を防ぐためには、途中でどのようなエラーが発生しても、最終的には必ず「画面更新をオンに戻す」処理を経由するようにコードの構造を設計する必要があります。これには On Error GoTo ステートメントを利用したエラーハンドリング(エラートラップ)が最適です。

以下のサンプルコードは、実務レベルで安全に別ブックを開くための堅牢な構文です。

Sub RobustOpenWorkbook()
    ' エラーが発生した場合、ErrorHandlerラベルへジャンプさせる設定
    On Error GoTo ErrorHandler

    ' 画面の更新を停止
    Application.ScreenUpdating = False

    Dim targetPath As String
    Dim wb As Workbook

    targetPath = "C:\Data\TargetBook.xlsx"

    ' 指定したファイルが存在するかどうかを事前にチェック
    If Dir(targetPath) = "" Then
        Err.Raise Number:=1001, Description:="指定されたファイルが見つかりません。"
    End If

    ' ファイルを開く
    Set wb = Workbooks.Open(targetPath)

    ' --- ここにメインの処理を記述 ---
    ' (例) ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = wb.Worksheets(1).Range("A1").Value
    ' --- メイン処理終了 ---

    ' ブックを閉じる
    wb.Close SaveChanges:=False

    ' 正常終了した場合は、終了処理へ進む
    GoTo ExitHandler

ErrorHandler:
    ' エラーが発生した場合に実行されるブロック
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical, "処理中断"

    ' エラー状態をクリア
    Err.Clear

ExitHandler:
    ' 正常時もエラー時も必ず最後にここを通過する

    ' 開いたままの別ブックがあれば閉じる処理(メモリリーク対策)
    If Not wb Is Nothing Then
        On Error Resume Next ' 既に閉じられている場合のエラーを無視
        wb.Close SaveChanges:=False
        On Error GoTo 0
    End If

    Set wb = Nothing

    ' 【重要】ここで必ず画面更新をTrueに戻す
    Application.ScreenUpdating = True

End Sub

この構造にすることで、万が一ファイルが存在しなかったり、データ転記中にエラーが起きたりしても、プログラムは ErrorHandler を経由して必ず ExitHandler に到達します。これにより、画面がフリーズする事故を完全に防ぐことができます。

6. 別ブックを「完全に静かに」開くためのプロパティ併用テクニック

Application.ScreenUpdating = False を設定すれば、画面のチラつきは防ぐことができます。しかし、VBAで別ブックを開く際には、画面の更新以外にもマクロの自動進行を妨げる厄介な要因が存在します。これらを回避し、ファイルを「完全に静かに」開くためには、他のApplicationプロパティやメソッドの引数を併用する必要があります。

警告ダイアログを消す:Application.DisplayAlerts

別ブックを開いた際、「このファイルは読み取り専用です」といった警告や、保存時に「同名のファイルが存在します。上書きしますか?」といった確認ダイアログが表示されることがあります。ダイアログが表示されると、そこでマクロの処理が一時停止し、ユーザーのクリックを待つ状態になってしまいます。これを防ぐのが Application.DisplayAlerts = False です。これを設定すると、Excelは警告ダイアログを表示せず、デフォルトの回答(多くの場合「はい」や「OK」)を自動的に選択して処理を続行します。

自動マクロを無効化する:Application.EnableEvents

開こうとしている別ブック内に「ブックを開いた時に自動的に実行されるマクロ(Workbook_Open イベントなど)」が仕込まれている場合があります。別ブックを開いた瞬間に意図しない別マクロが走り出してしまうと、処理の競合や予期せぬエラーを引き起こします。これを防ぐためには Application.EnableEvents = False を設定し、イベントの発火を一時的に無効化します。

リンクの更新を無視する:UpdateLinks引数

開くブックが他のExcelファイルへの参照(数式による外部参照リンクなど)を持っている場合、「リンクの更新をしますか?」というプロンプトが表示されることがあります。これは DisplayAlerts では防ぎきれない場合があるため、Workbooks.Open メソッドの引数である UpdateLinks:=0 を指定します。これにより、リンクを更新せずに無言でファイルを開くことができます。

全てを網羅した最強のテンプレートコード

これまでに解説した「画面更新の停止」「エラートラップ」「警告の無視」「イベントの無効化」「リンク更新の無効化」を全て盛り込んだ、実務でそのまま使える最強のファイル展開テンプレートコードを以下に示します。

Sub UltimateOpenWorkbook()
    On Error GoTo ErrorHandler

    ' --- 環境設定の保存と変更 ---
    ' 現在のExcelの状態を一時的に変更し、静かに処理を実行する
    Application.ScreenUpdating = False   ' 画面更新を停止(チラつき防止)
    Application.DisplayAlerts = False    ' 警告・確認ダイアログを非表示
    Application.EnableEvents = False     ' イベント(自動実行マクロ等)を無効化
    Application.Calculation = xlCalculationManual ' 自動計算を停止(さらに高速化する場合)

    Dim targetPath As String
    Dim wb As Workbook

    targetPath = "C:\Data\TargetBook.xlsx"

    If Dir(targetPath) = "" Then
        Err.Raise Number:=1000, Description:="指定されたパスにファイルが存在しません。"
    End If

    ' UpdateLinks:=0 でリンクの更新ダイアログを無視
    ' ReadOnly:=True で読み取り専用として安全に開く
    Set wb = Workbooks.Open(Filename:=targetPath, UpdateLinks:=0, ReadOnly:=True)

    ' ==========================================
    ' ここに目的の処理を記述します
    ' ==========================================

    ' 処理が終了したら、保存せずに閉じる
    wb.Close SaveChanges:=False
    GoTo ExitHandler

ErrorHandler:
    MsgBox "処理中にエラーが発生しました。" & vbCrLf & Err.Description, vbCritical
    Err.Clear

ExitHandler:
    ' 開いたブックのオブジェクトを解放
    If Not wb Is Nothing Then
        On Error Resume Next
        wb.Close SaveChanges:=False
        On Error GoTo 0
        Set wb = Nothing
    End If

    ' --- 環境設定を元の状態(True/自動)に復旧 ---
    ' 【超重要】ここで必ずすべての設定を元に戻すこと
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

End Sub

このテンプレートをベースにすることで、ユーザーに一切のストレスを与えず、かつエラーにも強い、プロフェッショナルなVBAツールを開発することが可能になります。

7. まとめ

VBAにおいて別のブックを開く処理は基本中の基本ですが、そのまま実行すると画面のチラつきによる視覚的ストレスとパフォーマンスの低下を招きます。Application.ScreenUpdating = False は、この問題を一挙に解決するための必須テクニックです。

ただし、強力な反面、処理終了時に True に戻し忘れたり、エラーでプログラムが途切れてしまったりすると、Excel自体がフリーズしたように見えてしまう危険性を持っています。そのため、単にコードの上下に配置するだけでなく、On Error GoTo を用いたエラーハンドリングと組み合わせて安全に運用することが絶対条件となります。

また、実務環境では DisplayAlerts や EnableEvents、UpdateLinks 引数を併用することで、マクロの完全自動化と圧倒的な処理速度を実現できます。今回紹介したコード構造をしっかりと理解し、ぜひあなたの業務効率化ツールに組み込んでみてください。