なぜちらつくのか

Workbooks.Open は現在のExcelインスタンスと同プロセス・同インスタンスでブックを開きます。そのため、ウィンドウの再描画が走り、画面がちらついたりアクティブウィンドウが切り替わったりします。

⚠️ 同プロセスで起きる問題

① 画面ちらつき(再描画)
② 開いたブックが前面に出てくる
③ ユーザーが操作中のシートが切り替わる
ActiveWorkbook が意図せず変わる

ScreenUpdating と Visible での抑制

まず簡単な方法として、画面更新を一時停止する方法があります。

VBA — ScreenUpdating 抑制
Option Explicit

Sub OpenWithoutFlicker_Simple()
    Dim wb As Workbook

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

    On Error GoTo ErrHandler
    Set wb = Workbooks.Open("C:\data\report.xlsx")

    ' ── ブック操作 ──
    Debug.Print wb.Sheets(1).Cells(1,1).Value

    wb.Close SaveChanges:=False

ErrHandler:
    ' 必ず元に戻す
    Application.ScreenUpdating = True
End Sub

⚠️ ScreenUpdating の注意点

エラー発生時でも必ず Application.ScreenUpdating = True に戻してください。False のままにするとExcel全体がフリーズしたように見えます。

CreateObject で別プロセス起動

より根本的な解決策が 別プロセスのExcelインスタンス を起動することです。

VBA — CreateObject で別プロセス起動
Option Explicit

Sub OpenInSeparateProcess()
    Dim xlApp As Object   ' Excel.Application(レイトバインディング)
    Dim wb    As Object   ' Workbook

    On Error GoTo ErrHandler

    ' 新しいExcelプロセスを起動
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False          ' 画面に表示しない
    xlApp.DisplayAlerts = False    ' 確認ダイアログを抑制

    ' 別プロセスでブックを開く(現在の画面には影響なし)
    Set wb = xlApp.Workbooks.Open("C:\data\report.xlsx")

    ' ── ブック操作 ──
    Dim val As String
    val = wb.Sheets(1).Cells(1, 1).Value
    MsgBox "取得値: " & val

    ' クリーンアップ
    wb.Close SaveChanges:=False
    xlApp.Quit
    Set wb    = Nothing
    Set xlApp = Nothing
    Exit Sub

ErrHandler:
    MsgBox "エラー: " & Err.Description, vbCritical
    If Not wb    Is Nothing Then wb.Close SaveChanges:=False
    If Not xlApp Is Nothing Then xlApp.Quit
    Set wb    = Nothing
    Set xlApp = Nothing
End Sub

同プロセス vs 別プロセスの比較

項目Workbooks.Open(同プロセス)CreateObject(別プロセス)
画面ちらつきあり(ScreenUpdating=False で軽減可)なし(Visible=False 前提)
ActiveWorkbook への影響ありなし
起動速度速いやや遅い(新プロセス生成コスト)
リソース解放wb.Close のみwb.Close + xlApp.Quit + Set Nothing
アドイン・設定の引き継ぎありなし(独立したプロセス)

別プロセスのリソース解放

別プロセス起動で最も重要なのが確実なプロセス解放です。解放漏れが起きるとタスクマネージャーにゾンビExcelが残り続けます。

VBA — 安全なクリーンアップパターン
Option Explicit

Sub SafeProcessCleanup()
    Dim xlApp As Object
    Dim wb    As Object
    Dim errNum As Long
    Dim errMsg As String

    On Error GoTo ErrHandler
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False
    xlApp.DisplayAlerts = False

    Set wb = xlApp.Workbooks.Open("C:\data\report.xlsx")
    ' ── 処理 ──

Cleanup:
    ' 正常・エラー問わず必ず実行
    On Error Resume Next
    If Not wb Is Nothing Then
        wb.Close SaveChanges:=False
        Set wb = Nothing
    End If
    If Not xlApp Is Nothing Then
        xlApp.Quit
        Set xlApp = Nothing
    End If
    On Error GoTo 0
    If errNum <> 0 Then MsgBox "エラー " & errNum & ": " & errMsg, vbCritical
    Exit Sub

ErrHandler:
    errNum = Err.Number
    errMsg = Err.Description
    Resume Cleanup
End Sub

実務で使えるTips集

Tips内容
DisplayAlerts = False「保存しますか?」等のダイアログを抑制。必ず True に戻す
EnableEvents = False開いたブックのマクロ(auto_open等)を実行させたくない場合
ReadOnly で開くWorkbooks.Open(path, ReadOnly:=True) でロックを避ける
UpdateLinks = False外部リンク更新ダイアログを抑制

まとめ

ちらつきが許容できる場合は ScreenUpdating = False で十分です。ユーザーに見せたくない処理や他ブックへの影響を完全に排除したい場合は CreateObject による別プロセス起動を選んでください。ただしプロセス解放の責任が増すことを忘れずに。

次の章では…

PART 05 では CommandBar によるメニューバー生成と自動登録 を解説します。CreateObject と組み合わせた応用パターンも紹介します。

→ PART 05 — メニューバー生成・自動登録へ