Excelブックを開く
「指定パスで開く」「選んで開く」「読み取り専用」「パスワード」「リンク更新の抑止」など、業務でよく使う開き方を初心者向けに最短コードでまとめます。安全に閉じるテンプレや落とし穴も併記します。
基本:Workbooks.Open(最短の開き方)
Sub OpenWorkbook_Basic()
Dim wb As Workbook
Set wb = Workbooks.Open("C:\Data\Sales.xlsx")
'ここで wb を使って処理
MsgBox "開いたブック名: " & wb.Name
wb.Close SaveChanges:=False '保存せず閉じる(必要に応じてTrue)
End Sub
VB- ポイント:
- 戻り値を受ける:
Set wb = Workbooks.Open(...)で開いたブックの参照を保持。 - 閉じ方:
wb.Close SaveChanges:=True/Falseを適切に。処理後は必ず閉じる。
- 戻り値を受ける:
よく使うオプション(読み取り専用、リンク更新抑止、パスワード)
Sub OpenWorkbook_Options()
Dim wb As Workbook
Set wb = Workbooks.Open( _
FileName:="C:\Data\Locked.xlsx", _
ReadOnly:=True, _ '読み取り専用で安全に開く
UpdateLinks:=False, _ '外部リンク更新を抑止
Password:="openpw", _ '開くためのパスワード
IgnoreReadOnlyRecommended:=True) '「読み取り専用推奨」を非表示に
'…処理…
wb.Close SaveChanges:=False
End Sub
VB- ポイント:
- ReadOnly: 他者と競合しにくい。上書き事故防止。
- UpdateLinks:=False: 重いリンク更新を避ける。
- Password: 開きパスワードの指定(保存用の書込パスワードは
WriteResPassword)。
相対パス・存在チェック・安全ラップ
Sub OpenWorkbook_RelativeSafe()
Dim path As String, wb As Workbook
path = ThisWorkbook.Path & "\Input\Daily.xlsx" '相対パス
If Dir(path) = "" Then
MsgBox "ファイルが見つかりません: " & path, vbExclamation
Exit Sub
End If
On Error GoTo Fail
Application.ScreenUpdating = False
Set wb = Workbooks.Open(path, ReadOnly:=True, UpdateLinks:=False)
'…処理…
wb.Close SaveChanges:=False
Cleanup:
Application.ScreenUpdating = True
Exit Sub
Fail:
MsgBox "開けませんでした: " & Err.Description, vbCritical
Resume Cleanup
End Sub
VB- ポイント:
- Dirで存在確認: 例外を減らす。
- ScreenUpdating: 体感速度向上。
- エラーハンドリング: 失敗時も設定復帰。
ファイルダイアログで選んで開く(初心者向けに最適)
Sub OpenWorkbook_FilePicker()
Dim fd As FileDialog, sel As String, wb As Workbook
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "Excelファイルを選択してください"
.Filters.Clear
.Filters.Add "Excelブック", "*.xlsx; *.xlsm; *.xls"
If .Show <> -1 Then Exit Sub 'キャンセル
sel = .SelectedItems(1)
End With
Set wb = Workbooks.Open(sel, ReadOnly:=True, UpdateLinks:=False)
MsgBox "開きました: " & wb.FullName
'…処理…
wb.Close SaveChanges:=False
End Sub
VB- ポイント:
- 対話的に選ぶ: 配布しやすくエラーも少ない。
- フィルタ: Excel拡張子のみ選択可能に。
開いた直後に実行(Workbook_Open/Auto_Open)
'ThisWorkbook モジュールに記述(ブックを開いた瞬間に走る)
Private Sub Workbook_Open()
'起動時の初期化や自動処理
Worksheets("明細").Range("A1").Value = "起動時初期化済み"
End Sub
VB- ポイント:
- 用途: 定型作業を「ブックを開いた瞬間」に自動化。
- 注意: 処理が重い場合は進捗表示や高速ラップを併用。
開いたブックを安全に閉じる(保存要否で分岐)
Sub CloseWorkbook_Safely()
Dim wb As Workbook
Set wb = Workbooks.Open("C:\Data\Work.xlsx", ReadOnly:=False)
'…編集…
If MsgBox("保存して閉じますか?", vbYesNo) = vbYes Then
wb.Close SaveChanges:=True
Else
wb.Close SaveChanges:=False
End If
End Sub
VB- ポイント:
- 編集時:
ReadOnly:=False。 - ユーザー確認: 事故防止に有効。
- 編集時:
複数ファイルをまとめて開く・処理する
Sub OpenMultiple_Process()
Dim fd As FileDialog, i As Long
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.AllowMultiSelect = True
.Title = "複数ファイルを選択"
.Filters.Clear
.Filters.Add "Excelブック", "*.xlsx; *.xlsm; *.xls"
If .Show <> -1 Then Exit Sub
Application.ScreenUpdating = False
For i = 1 To .SelectedItems.Count
Dim wb As Workbook
Set wb = Workbooks.Open(.SelectedItems(i), ReadOnly:=True, UpdateLinks:=False)
'例:先頭シートのA1を収集
Debug.Print wb.Worksheets(1).Range("A1").Value
wb.Close SaveChanges:=False
Next i
Application.ScreenUpdating = True
End With
End Sub
VB- ポイント:
- AllowMultiSelect: まとめ処理で業務効率化。
- 開く→処理→閉じる: 逐次閉じるとメモリ安定。
CSVやテキストを「開かずに読み込む」選択肢(高速)
Sub ImportCsv_WithoutOpen()
Dim ws As Worksheet: Set ws = ActiveSheet
With ws.QueryTables.Add(Connection:="TEXT;C:\Data\data.csv", Destination:=ws.Range("A1"))
.TextFileCommaDelimiter = True
.TextFilePlatform = 65001 'UTF-8(必要に応じて)
.AdjustColumnWidth = True
.Refresh BackgroundQuery:=False
End With
End Sub
VB- ポイント:
- QueryTables: ブックを開かずにシートへ直接取り込む。
- 大量データ: 開くより高速で安定することが多い。
例題で練習
例題1:相対パスで「入力.xlsx」を読み取り専用で開く
Sub Example_OpenRelative_ReadOnly()
Dim p As String: p = ThisWorkbook.Path & "\入力.xlsx"
If Dir(p) = "" Then MsgBox "見つかりません: " & p: Exit Sub
Dim wb As Workbook: Set wb = Workbooks.Open(p, ReadOnly:=True, UpdateLinks:=False)
MsgBox wb.Name & " を開きました"
wb.Close False
End Sub
VB例題2:パスワード付きファイルを開いて先頭シートだけ値コピー
Sub Example_OpenPassword_Copy()
Dim wb As Workbook
Set wb = Workbooks.Open(FileName:="C:\Secure\Lock.xlsx", Password:="openpw", ReadOnly:=True)
Worksheets("Import").Range("A1:D100").Value = wb.Worksheets(1).Range("A1:D100").Value
wb.Close False
End Sub
VB例題3:ダイアログで選択→リンク更新なしで開いて集計
Sub Example_PickAndSummarize()
Dim fd As FileDialog, sel As String, wb As Workbook
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "集計対象を選択"
.Filters.Clear: .Filters.Add "Excel", "*.xlsx; *.xlsm; *.xls"
If .Show <> -1 Then Exit Sub
sel = .SelectedItems(1)
End With
Set wb = Workbooks.Open(sel, ReadOnly:=True, UpdateLinks:=False)
Dim total As Double
total = Application.WorksheetFunction.Sum(wb.Worksheets(1).Range("E2:E10000"))
Worksheets("Summary").Range("B2").Value = total
wb.Close False
End Sub
VB落とし穴と対策
- ReadOnlyと保存: 読み取り専用では上書き保存できない。保存が必要なら
ReadOnly:=False。 - リンク更新の遅さ: 外部リンクが多いファイルは
UpdateLinks:=Falseで抑止し、必要時に更新。 - 相対/絶対パスの混乱: 配布用は
ThisWorkbook.Pathを基準に組み立てる。 - 閉じ忘れ: 開いたら必ず閉じる。参照(
wb)を持ち、wb.Closeを徹底。 - イベント暴発: 開いた直後に大量操作する場合は
Application.EnableEvents = Falseで抑止→最後に復帰。 - 文字コードの問題(CSV): 直接開くと文字化けのことも。取り込みは
QueryTablesでエンコード指定が安定。 - 例外対策:
Dirで存在チェック、On Errorで失敗時のメッセージと設定復帰。
