【Excel】VBAでファイルを開く・保存する・閉じる操作を自動化する方法

【Excel】VBAでファイルを開く・保存する・閉じる操作を自動化する方法
🛡️ 超解決

Excel作業で、特定のファイルを繰り返し開いたり、保存したり、閉じたりする作業に手間を感じていませんか。

これらの定型作業をVBA(Visual Basic for Applications)を使えば、自動化できます。

この記事では、Excel VBAを使ってファイルを開く、保存する、閉じる基本的な操作を自動化する具体的なコードと手順を解説します。

これにより、作業時間を大幅に短縮し、ヒューマンエラーを防ぐことができます。

【要点】Excel VBAによるファイル操作の自動化

  • Workbooks.Openメソッド: 指定したExcelファイルを開くことができます。
  • Workbook.Saveメソッド: 現在開いているExcelファイルに変更内容を保存できます。
  • Workbook.Closeメソッド: 現在開いているExcelファイルを閉じることができます。
  • Application.Quitメソッド: Excelアプリケーション自体を終了できます。

ADVERTISEMENT

VBAによるファイル操作の基本概念

Excel VBAでファイル操作を行うには、主に「Application」オブジェクトと「Workbook」オブジェクトを使用します。

「Application」オブジェクトはExcelアプリケーション全体を指し、Excelを起動したり終了したりする操作に関連します。

一方、「Workbook」オブジェクトは個々のExcelファイル(ブック)を表します。ファイルを開く、保存する、閉じる、シートを操作するといった、ファイル固有の操作は「Workbook」オブジェクトを通じて行います。

これらのオブジェクトを理解することで、より複雑なファイル操作も自在に制御できるようになります。

お探しの解決策が見つからない場合は、こちらの「Excelトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

VBAでExcelファイルを開く方法

指定したExcelファイルを開くには、Workbooks.Openメソッドを使用します。

このメソッドは、開きたいファイルのフルパスを指定することで、そのファイルをExcelで開くことができます。

開いたブックを変数に格納しておくと、後続の処理でそのブックを特定しやすくなります。

  1. VBAエディタを開く
    ExcelでAlt + F11キーを押して、VBAエディタ(Microsoft Visual Basic for Applications)を開きます。
  2. 標準モジュールを挿入する
    VBAエディタのメニューから「挿入」→「標準モジュール」を選択し、新しいモジュールを挿入します。
  3. コードを入力する
    挿入したモジュールに、以下のコードをコピー&ペーストします。

以下のコードは、「C:¥Users¥YourName¥Documents¥sample.xlsx」というファイルを指定して開く例です。ご自身の環境に合わせてパスを修正してください。

Sub OpenExcelFile()
    Dim wb As Workbook
    Dim filePath As String

    ' 開きたいファイルのフルパスを指定します
    filePath = "C:\Users\YourName\Documents\sample.xlsx"

    ' ファイルが存在するかどうかを確認します(任意ですが推奨)
    If Dir(filePath) = "" Then
        MsgBox "指定されたファイルが見つかりません。パスを確認してください。", vbExclamation
        Exit Sub
    End If

    On Error Resume Next ' エラーが発生しても処理を続行します
    ' Workbooks.Openメソッドでファイルを開きます
    Set wb = Workbooks.Open(filePath)
    On Error GoTo 0 ' エラーハンドリングを元に戻します

    ' ファイルが開けなかった場合のエラーチェック
    If wb Is Nothing Then
        MsgBox "ファイルのオープン中にエラーが発生しました。", vbCritical
        Exit Sub
    End If

    MsgBox "ファイル " & filePath & " を開きました。", vbInformation

    ' 必要に応じて、開いたブックに対する処理をここに追加します
    ' 例: wb.Sheets("Sheet1").Cells(1, 1).Value = "開きました"

End Sub

コードの解説

  • Dim wb As Workbook: 開いたブックを格納するための変数wbを宣言します。
  • Dim filePath As String: ファイルパスを格納するための変数filePathを宣言します。
  • filePath = “C:\Users\YourName\Documents\sample.xlsx”: 開きたいファイルのフルパスを文字列として指定します。パスの区切り文字「¥」は、VBAでは「\」と二重にする必要があります。
  • If Dir(filePath) = “” Then … End If: 指定したパスにファイルが存在するかを確認します。ファイルがない場合はメッセージを表示して処理を終了します。
  • On Error Resume Next: この行以降でエラーが発生しても、処理を停止せずに次の行に進みます。ファイルが存在しない場合やアクセス権がない場合などに有効です。
  • Set wb = Workbooks.Open(filePath): 指定したパスのExcelファイルを開き、そのブックオブジェクトを変数wbに代入します。
  • On Error GoTo 0: エラーハンドリングの設定を元に戻します。これ以降は、エラーが発生すると処理が停止します。
  • If wb Is Nothing Then … End If: Workbooks.Openメソッドが失敗した場合、変数wbはNothingになります。この条件でエラーをチェックします。
  • MsgBox …: 処理の成否をユーザーに通知します。

注意点

  • ファイルパスは正確に指定してください。間違っているとファイルを開けません。
  • パスの区切り文字「¥」は「\」と二重に記述する必要があります。
  • ファイルが他のアプリケーションで開かれている場合や、読み取り専用で開かれている場合、パスワードで保護されている場合は、追加の処理が必要になることがあります。
  • Workbooks.Openメソッドには、読み取り専用で開く、パスワードを指定するなど、様々なオプション引数があります。必要に応じてヘルプを参照してください。

VBAでExcelファイルを保存する方法

開いたExcelファイルに変更を加えた後、その変更を保存するにはWorkbook.Saveメソッドを使用します。

このメソッドは、現在アクティブなブック、または指定したブックオブジェクトの変更を保存します。

新規作成したブックを初めて保存する場合は、ファイル名を指定する必要があります。

  1. VBAエディタを開き、モジュールにコードを入力します。
    上記「ファイルを開く」の手順と同様に、VBAエディタを開き、標準モジュールに以下のコードを入力します。
Sub SaveExcelFile()
    Dim wb As Workbook
    Dim savePath As String

    ' 保存したいブックを指定します(ここではアクティブブックとします)
    Set wb = ActiveWorkbook

    ' 保存先のパスとファイル名を指定します
    ' 既存のファイルに上書き保存する場合は、元のパスを指定します
    ' 新規ファイルとして保存する場合は、新しいパスとファイル名を指定します
    savePath = "C:\Users\YourName\Documents\updated_sample.xlsx"

    On Error Resume Next
    ' Workbook.Saveメソッドでファイルを保存します
    ' 新規ファイルとして保存する場合は、SaveAsメソッドを使用します
    If wb.Path = "" Then ' 新規作成されたブックの場合
        wb.SaveAs Filename:=savePath
    Else ' 既存のブックの場合
        wb.Save
    End If
    On Error GoTo 0

    If Err.Number <> 0 Then
        MsgBox "ファイルの保存中にエラーが発生しました。エラー内容: " & Err.Description, vbCritical
        Err.Clear
    Else
        MsgBox "ファイルを " & savePath & " として保存しました。", vbInformation
    End If

End Sub

コードの解説

  • Set wb = ActiveWorkbook: 現在アクティブになっているブックを変数wbに代入します。特定のブックを保存したい場合は、前述のWorkbooks.Openで取得したブックオブジェクトを指定します。
  • savePath = “C:\Users\YourName\Documents\updated_sample.xlsx”: 保存したいファイルのフルパスとファイル名を指定します。
  • If wb.Path = “” Then … Else … End If: ブックが既に保存されているか(Pathプロパティにパスが設定されているか)を判定します。
  • wb.SaveAs Filename:=savePath: 新規作成されたブックを、指定したパスとファイル名で保存します。
  • wb.Save: 既存のブックに変更があった場合、その変更を元のファイルに上書き保存します。
  • On Error Resume Next / On Error GoTo 0 / If Err.Number <> 0 Then …: 保存処理中に発生しうるエラー(ディスク容量不足、パスワード保護など)を捕捉し、ユーザーに通知します。

注意点

  • Saveメソッドは、現在のファイルに上書き保存します。保存前に確認メッセージは表示されません。
  • 新規作成したブックをSaveメソッドで保存しようとしても、ファイル名は指定されないためエラーになります。新規ファイルはSaveAsメソッドを使用してください。
  • ファイル名には、使用できない文字(¥, /, :, *, ?, “, <, >, |)が含まれていないか確認してください。
  • 保存先のフォルダが存在しない場合、SaveAsメソッドはエラーになります。

ADVERTISEMENT

VBAでExcelファイルを閉じる方法

開いたExcelファイル(ブック)を閉じるには、Workbook.Closeメソッドを使用します。

このメソッドは、指定したブックを閉じます。変更があった場合は、保存するかどうかを確認するメッセージが表示されます。

保存せずに強制的に閉じたい場合や、自動化の途中で確認メッセージを表示させたくない場合は、引数を指定します。

  1. VBAエディタを開き、モジュールにコードを入力します。
    上記と同様の手順で、VBAエディタの標準モジュールに以下のコードを入力します。
Sub CloseExcelFile()
    Dim wb As Workbook

    ' 閉じるブックを指定します
    ' 例1: アクティブブックを閉じる
    Set wb = ActiveWorkbook

    ' 例2: 特定のブックを名前で指定して閉じる
    ' Set wb = Workbooks("sample.xlsx")

    ' 例3: 特定のブックをパスで指定して閉じる
    ' Set wb = Workbooks.Open("C:\Users\YourName\Documents\sample.xlsx")

    ' Workbook.Closeメソッドでブックを閉じます
    ' 引数 SaveChanges:
    '   True: 変更を保存する
    '   False: 変更を保存しない
    '   Null (省略): 変更があれば保存するか確認するダイアログを表示する
    ' 引数 Filename:
    '   SaveAsメソッドで指定したファイル名で保存する場合に指定

    On Error Resume Next
    ' 変更を保存せずに閉じる場合
    wb.Close SaveChanges:=False

    ' 変更を保存して閉じる場合
    ' wb.Close SaveChanges:=True

    ' 変更があれば確認ダイアログを表示して閉じる場合(引数を省略)
    ' wb.Close

    On Error GoTo 0

    If Err.Number <> 0 Then
        MsgBox "ファイルのクローズ中にエラーが発生しました。", vbCritical
        Err.Clear
    Else
        MsgBox "ブックを閉じました。", vbInformation
    End If

End Sub

コードの解説

  • Set wb = ActiveWorkbook: 閉じる対象のブックを変数wbに設定します。
  • wb.Close SaveChanges:=False: 指定したブックを、変更内容を保存せずに閉じます。もし変更があった場合でも、確認メッセージは表示されずに破棄されます。
  • wb.Close SaveChanges:=True: 指定したブックを、変更内容を保存して閉じます。
  • wb.Close: 変更があった場合、保存するかどうかの確認ダイアログが表示されます。自動化では、この動作を避けるためにTrueまたはFalseを指定することが一般的です。

注意点

  • SaveChanges:=Falseを指定すると、保存されていない変更はすべて失われます。実行前に意図した操作であるか十分に確認してください。
  • 開いているブックが一つもない状態でActiveWorkbookを参照しようとするとエラーになります。
  • Excelアプリケーション自体を終了させたい場合は、Application.Quitメソッドを使用します。

Excelアプリケーション自体を終了する方法

開いている全てのブックを閉じ、Excelアプリケーション自体を終了させたい場合は、Application.Quitメソッドを使用します。

このメソッドは、開いている全てのブックを閉じ、Excelを終了します。

Sub QuitExcel()
    On Error Resume Next
    ' Excelアプリケーションを終了します
    Application.Quit
    On Error GoTo 0
    MsgBox "Excelアプリケーションを終了しました。", vbInformation
End Sub

注意点

  • Application.Quitを実行すると、開いている全てのブックが閉じられ、Excelアプリケーションが終了します。
  • ブックに変更があり保存されていない場合、Application.Quitを実行すると、各ブックごとに保存確認ダイアログが表示されます。これを自動化するには、事前に各ブックに対してWorkbook.Closeメソッドで保存処理を行う必要があります。

複数のファイルをまとめて処理する例

VBAを使えば、複数のファイルをまとめて処理することも可能です。例えば、特定のフォルダにある全てのExcelファイルを順番に開き、特定の処理(例:セルの値のコピー)を行い、保存して閉じる、といった一連の作業を自動化できます。

Sub ProcessMultipleFiles()
    Dim folderPath As String
    Dim fileName As String
    Dim wb As Workbook

    ' 処理対象のExcelファイルがあるフォルダパスを指定します
    folderPath = "C:\Users\YourName\Documents\Data\"

    ' フォルダパスの末尾に「\」がない場合は追加します
    If Right(folderPath, 1) <> "\" Then
        folderPath = folderPath & "\"
    End If

    ' 指定したフォルダ内の最初のExcelファイル名を取得します
    fileName = Dir(folderPath & "*.xls*", vbNormal)

    ' ファイルが見つかる限りループします
    Do While fileName <> ""
        ' ファイルのフルパスを作成します
        Dim fullPath As String
        fullPath = folderPath & fileName

        On Error Resume Next
        ' ファイルを開きます
        Set wb = Workbooks.Open(fullPath)
        On Error GoTo 0

        If Not wb Is Nothing Then
            ' --- ここに各ファイルに対して実行したい処理を記述します ---
            ' 例: シート名を変更する
            On Error Resume Next ' シート名変更時のエラーを無視
            wb.Sheets(1).Name = "Processed_" & wb.Sheets(1).Name
            On Error GoTo 0
            ' 例: 特定のセルに日付を入力する
            wb.Sheets(1).Range("Z1").Value = Date
            ' ----------------------------------------------------

            ' 変更を保存します
            wb.Save
            ' ファイルを閉じます
            wb.Close SaveChanges:=False ' 保存したのでFalseでOK

            Debug.Print "処理完了: " & fileName
        Else
            Debug.Print "エラー: 開けなかったファイル " & fileName
        End If

        ' 次のExcelファイル名を取得します
        fileName = Dir()
    Loop

    MsgBox "指定フォルダ内の全Excelファイルの処理が完了しました。", vbInformation

End Sub

コードの解説

  • folderPath = “C:\Users\YourName\Documents\Data\”: 処理対象のExcelファイルが格納されているフォルダのパスを指定します。
  • fileName = Dir(folderPath & “*.xls*”, vbNormal): Dir関数を使って、指定したフォルダ内の拡張子が「.xls」または「.xlsx」の最初のファイル名を取得します。
  • Do While fileName <> “” … Loop: Dir関数でファイル名が取得できなくなるまで(フォルダ内にファイルがなくなるまで)ループを繰り返します。
  • fullPath = folderPath & fileName: フォルダパスとファイル名を結合して、ファイルのフルパスを作成します。
  • Set wb = Workbooks.Open(fullPath): 取得したフルパスでファイルをオープンします。
  • — ここに各ファイルに対して実行したい処理を記述します —: この部分に、開いた各ファイルに対して行いたい具体的な処理(データの集計、書式設定、値の更新など)を記述します。
  • wb.Save: 変更を保存します。
  • wb.Close SaveChanges:=False: ファイルを閉じます。既にwb.Saveで保存しているため、SaveChanges:=Falseで確認ダイアログを表示させずに閉じます。
  • fileName = Dir(): ループの最後に、次のファイル名を取得します。引数を省略したDir()は、直前のDir関数で取得したファイルと同じフォルダから、次に見つかったファイル名を返します。

注意点

  • 処理対象のファイルが、マクロを含むExcelファイル(.xlsm)やExcel 97-2003ブック(.xls)の場合もまとめて処理するには、検索パターンを「*.xls*」とします。
  • 処理中にエラーが発生した場合、ループが中断される可能性があります。エラーハンドリングを適切に行うことが重要です。
  • 大量のファイルを処理する場合、時間がかかることがあります。実行中はExcelが応答なしになるように見えることがありますが、処理が完了するまで待機してください。
  • 開きたいファイルがパスワードで保護されている場合は、Workbooks.OpenメソッドのPassword引数を使用する必要があります。

よくある質問とトラブルシューティング

Q1: ファイルを開く際に「ファイルが見つかりません」と表示されます。

原因: 指定したファイルパスが間違っている、またはファイルが存在しない。

対処法:

  1. ファイルパスの確認
    VBAコード内の`filePath`変数のパスが、実際のファイルが存在する場所と一致しているか確認してください。
  2. 区切り文字の確認
    パスの区切り文字「\」はVBAでは「\」と二重にする必要があります。
  3. ファイル名の確認
    ファイル名にスペルミスがないか確認してください。
  4. Dir関数による存在確認
    `If Dir(filePath) = “” Then` のようなコードで、ファイルが存在するかどうかを事前にチェックすることを推奨します。

Q2: ファイルを保存しようとすると「アクセスが拒否されました」というエラーが出ます。

原因: 保存先のフォルダに対する書き込み権限がない、またはファイルが読み取り専用で開かれている。

対処法:

  1. 保存先フォルダの権限確認
    保存しようとしているフォルダに、現在ログインしているユーザーが書き込み権限を持っているか、OSの設定で確認してください。
  2. ファイルのロック確認
    対象のファイルが他のユーザーやアプリケーションによってロックされていないか確認してください。
  3. 読み取り専用の解除
    もしファイルが読み取り専用で開かれている場合は、一度閉じて通常のモードで開き直すか、VBAコードで`ReadOnly:=False`を指定して開く必要があります。

Q3: ファイルを閉じようとすると「保存しますか?」というメッセージが表示されて止まってしまいます。

原因: `Workbook.Close`メソッドで`SaveChanges`引数を省略しているか、`True`を指定している。

対処法:

  1. `SaveChanges:=False`を指定する
    変更を保存せずに強制的に閉じたい場合は、`wb.Close SaveChanges:=False`のように、引数を明示的に`False`に設定してください。
  2. 保存処理を先に行う
    変更を保存してから閉じたい場合は、`wb.Close`の前に`wb.Save`メソッドを実行してください。その後、`wb.Close SaveChanges:=False`で閉じれば、確認メッセージは表示されません。

Q4: VBAコードを実行すると「オブジェクトが必要です」というエラーが出ます。

原因: オブジェクト変数が正しく設定されていない(Nothingのまま使おうとしている)。

対処法:

  1. オブジェクト変数の初期化確認
    `Dim wb As Workbook` のように変数を宣言した後、`Set wb = Workbooks.Open(…)` や `Set wb = ActiveWorkbook` のように、必ずオブジェクトを代入してから使用してください。
  2. エラーハンドリングの活用
    ファイルが開けなかった場合などに、`wb Is Nothing` のチェックや `On Error Resume Next` を適切に使用することで、エラー発生時の原因特定が容易になります。

まとめ

この記事では、Excel VBAを使ってファイルを開く、保存する、閉じるという基本的なファイル操作を自動化する方法を解説しました。

Workbooks.OpenWorkbook.SaveWorkbook.CloseApplication.Quitといったメソッドを使いこなすことで、定型的なファイル操作を効率化し、作業ミスを減らすことができます。

これらの基本操作を組み合わせることで、複数のファイルをまとめて処理するような、より高度な自動化も実現可能です。

ぜひ、これらのVBAコードを参考に、ご自身の業務に合わせたファイル操作の自動化を試してみてください。

📊
Excelトラブル完全解決データベースこの記事以外にも、様々なエラー解決策をまとめています。困った時の逆引きに活用してください。

ADVERTISEMENT

この記事の監修者
📈

超解決 Excel・Word研究班

企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。

🏆
超解決 Excel検定 あなたのExcel実務能力を3分で測定!【1級・2級・3級】