なぜちらつくのか
Workbooks.Open は現在のExcelインスタンスと同プロセス・同インスタンスでブックを開きます。そのため、ウィンドウの再描画が走り、画面がちらついたりアクティブウィンドウが切り替わったりします。
⚠️ 同プロセスで起きる問題
① 画面ちらつき(再描画)
② 開いたブックが前面に出てくる
③ ユーザーが操作中のシートが切り替わる
④ ActiveWorkbook が意図せず変わる
ScreenUpdating と Visible での抑制
まず簡単な方法として、画面更新を一時停止する方法があります。
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インスタンス を起動することです。
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が残り続けます。
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 と組み合わせた応用パターンも紹介します。