Excel VBA 逆引き集 | Excelブックを開く

Excel VBA
スポンサーリンク

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 で失敗時のメッセージと設定復帰。
タイトルとURLをコピーしました