VBAで既存ファイルを一部だけ上書き保存する方法 | 複数セル・複数ファイルの一括更新

VBAで既存のExcelファイルを一部だけ更新するには、対象ファイルを開いて必要なセルだけ書き換え、上書き保存して閉じる、という3ステップで実現できます。日報・売上表・一覧データなど、フォーマットを壊さずに中身だけ差し替えたい場面で活躍します。

この記事では、次の内容を順番に解説します。

  • 既存ファイルを開いて特定セルを更新する基本コード
  • 複数セル・複数シートをまとめて更新する方法
  • 複数ファイルをループで一括更新する方法
  • 安全に実行するための注意点

既存ファイルを開いて一部の値を更新するには?

対象ファイルが存在するか確認してから開き、セルを更新して上書き保存するのが基本の流れです。Dir 関数でファイルの存在確認を入れておくと、ファイルが見つからないときのエラーを防げます。

Sub UpdateExistingFile()

    Dim wb       As Workbook
    Dim filePath As String

    filePath = "C:¥Data¥既存ファイル.xlsx"

    'ファイルが存在するか確認
    If Dir(filePath) = "" Then
        MsgBox "ファイルが存在しません。", vbExclamation
        Exit Sub
    End If

    'ファイルを開く
    Set wb = Workbooks.Open(filePath)

    '対象シートの特定セルを上書き
    wb.Worksheets(1).Range("A1").Value = "更新済み"

    '上書き保存して閉じる
    wb.Close SaveChanges:=True

    MsgBox "ファイルを更新しました。"

End Sub

このコードのポイントは3つです。

処理コード役割
存在確認Dir(filePath) = ""ファイルが見つからない場合に早めに処理を止める
ファイルを開くWorkbooks.Open(filePath)指定パスのブックを開いて変数に格納する
保存して閉じるwb.Close SaveChanges:=True変更を保存してブックを閉じる(Falseにすると破棄)

複数のセルやシートをまとめて更新するには?

更新箇所が複数ある場合は、With 構文でシートを指定し、まとめて書くとコードがスッキリします。シートを複数またぐ場合も、シートごとに処理を分けて記述できます。

Sub UpdateMultipleCells()

    Dim wb       As Workbook
    Dim filePath As String

    filePath = "C:¥Data¥売上表.xlsx"

    If Dir(filePath) = "" Then
        MsgBox "ファイルが存在しません。", vbExclamation
        Exit Sub
    End If

    Set wb = Workbooks.Open(filePath)

    '「売上」シートの複数セルをまとめて更新
    With wb.Worksheets("売上")
        .Range("B2").Value = 120000
        .Range("B3").Value = 98000
        .Range("B4").Value = 145000
        .Range("C2").Value = "確認済"
    End With

    '「集計」シートの更新日を記録
    wb.Worksheets("集計").Range("A1").Value = "最終更新:" & Format(Now, "yyyy/mm/dd hh:mm")

    wb.Close SaveChanges:=True

    MsgBox "売上表を更新しました。"

End Sub

複数ファイルをまとめて一括更新するには?

更新対象が複数ファイルに渡る場合は、ループ処理と組み合わせます。以下は、Excelのシートにファイルパスのリストを用意しておき、上から順に処理する例です。

Sub UpdateMultipleFiles()

    Dim wb       As Workbook
    Dim ws       As Worksheet
    Dim filePath As String
    Dim i        As Integer

    Set ws = ThisWorkbook.Sheets("ファイルリスト")

    'A列の2行目から空白になるまで処理
    i = 2
    Do While ws.Cells(i, 1).Value <> ""

        filePath = ws.Cells(i, 1).Value

        If Dir(filePath) = "" Then
            ws.Cells(i, 2).Value = "ファイルなし"
        Else
            Set wb = Workbooks.Open(filePath)
            wb.Worksheets(1).Range("A1").Value = "更新済み"
            wb.Close SaveChanges:=True
            ws.Cells(i, 2).Value = "完了"
        End If

        i = i + 1
    Loop

    MsgBox "一括更新が完了しました。"

End Sub

「ファイルリスト」シートのA列にファイルパスを並べておくと、B列に処理結果(「完了」または「ファイルなし」)が記録されます。どのファイルが更新済みかを一覧で確認できるため、大量ファイルの管理にも便利です。

安全に実行するための注意点を確認するには?

既存ファイルを書き換えるマクロは、実行すると元に戻せません。以下の点を事前に確認しておきましょう。

確認ポイント内容
バックアップを取る実行前にファイルのコピーを別フォルダに保存しておく。FileCopy 命令で自動化も可能。
シート名・セル番地を確認するシート名は Worksheets(1)(インデックス)より Worksheets("シート名") で指定する方が安全。
ファイルが開いていないか確認する対象ファイルが既に開かれていると Workbooks.Open でエラーになる場合がある。
SaveChanges:=True の確認True にすると上書き保存、False にすると変更を破棄して閉じる。意図しない保存を防ぐために明示的に書く。

実行前にバックアップを自動で作成するコードを追加しておくと、より安全に運用できます。

'バックアップを作成してから更新する例
Sub UpdateWithBackup()

    Dim wb         As Workbook
    Dim filePath   As String
    Dim backupPath As String

    filePath   = "C:¥Data¥売上表.xlsx"
    backupPath = "C:¥Data¥Backup¥売上表_" & Format(Now, "yyyymmdd_hhmmss") & ".xlsx"

    If Dir(filePath) = "" Then
        MsgBox "ファイルが存在しません。", vbExclamation
        Exit Sub
    End If

    'バックアップを作成
    FileCopy filePath, backupPath

    'ファイルを開いて更新
    Set wb = Workbooks.Open(filePath)
    wb.Worksheets(1).Range("A1").Value = "更新済み"
    wb.Close SaveChanges:=True

    MsgBox "更新完了。バックアップ:" & backupPath

End Sub

まとめ

  • 既存ファイルの一部更新は 「開く → 書き換える → 保存して閉じる」 の3ステップが基本
  • Dir でファイルの存在確認を入れるとエラーを防げる
  • With 構文でシートをまとめて指定すると、複数セルの更新がスッキリ書ける
  • シートのリストと ループ処理 を組み合わせると複数ファイルの一括更新に対応できる
  • 上書き保存は元に戻せないため、FileCopy でバックアップを事前に作る習慣をつけよう

よくある質問

対象ファイルが既に開いている場合はどうなりますか?

既に開いているブックに対して Workbooks.Open を実行すると、Excelのバージョンによってはエラーになる場合があります。事前に Application.Workbooks コレクションを確認して、開いていれば変数に格納、開いていなければ Open する、という分岐を入れると安全です。

SaveChanges:=True と False の違いは何ですか?

SaveChanges:=True は変更を上書き保存してからブックを閉じます。SaveChanges:=False は変更を破棄してブックを閉じます。省略するとExcelが確認ダイアログを表示してしまうため、マクロ内では必ずどちらかを明示的に指定しましょう。

シートをインデックス番号(Worksheets(1))で指定しても大丈夫ですか?

動作はしますが、シートの順番が変わると意図しないシートを更新してしまう危険があります。Worksheets("シート名") で名前指定する方が安全です。シート名が変わる可能性がある場合は、シート名もセルから読み込む設計にするとより堅牢になります。

更新したセルだけでなく、書式や関数も壊れませんか?

セルの .Value プロパティだけを書き換えた場合、書式(フォント・色・罫線など)や数式は変更されません。ただし、数式が入っているセルに .Value で値を代入すると数式が上書きされて消えるため、数式セルへの書き込みには注意が必要です。

読み取り専用で開かれてしまい保存できません

ファイルが読み取り専用属性になっているか、他のユーザーが開いている可能性があります。Workbooks.Open の引数に ReadOnly:=False を指定しても解決しない場合は、ファイルのプロパティや共有状況を確認してください。また、wb.ReadOnly プロパティで読み取り専用かどうかをマクロ内で判定することもできます。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール