和風スパゲティのレシピ

日本語でコーディングするExcelVBA

ブックを上書き保存する - Saveメソッド

ブックを上書き保存する方法を解説します。

ブックを上書き保存する - Saveメソッド

ブックを上書き保存する場合は、
WorkbookオブジェクトのSaveメソッドを使用します。

' 指定ブックを上書き保存
Workbooks("Book1.xlsx").Save

' マクロを実行しているブックを上書き保存
Thisworkbook.Save

Saveメソッドには引数がありませんので、メインコードはこのストレートな記述を覚えるだけでOKです。

ブックが上書き保存できるか調べる - ReadOnlyプロパティ

Saveメソッドは手作業の「上書き保存」と同様、読み取り専用ブックで実行すると、
「名前を付けて保存」ダイアログが開いてしまします。


この読み取り専用の判定はWorkbook.ReadOnlyプロパティで行うことができます。

If Workbooks("Book1.xlsx").ReadOnly = True Then
    ' 読み取り専用だった時の処理
Else
    Workbooks("Book1.xlsx").Save
End If

 
さてこれで判定はできたのですが、
↑の「読み取り専用だった時の処理」部分に何か処理を書こうにも、
この時点ではどうやっても対象ブックそのものを更新することはできません。

つまり、ここで判定しても時すでに遅しということも多いです。


ReadOnlyの判定はブックを開いてすぐに行えますので、
書き込めないブックへ処理を進めてしまわないよう注意しておきましょう。

' 開いた時点で読み取り専用か確認する
Set wb = Workbooks.Open "C:\~~\Book1.xlsx"
If wb.ReadOnly Then
    MsgBox "編集ファイルが読み取り専用のため処理を中断します。"
    Exit Sub
End If

~~~ブックを編集する処理 ' ←読み取り専用のままこれを実施しないで済む

' この上書き保存は必ず成功する
wb.Save


Saveメソッドはこの読取専用のチェックさえ行っておけば、
ほぼエラーなく安定して動いてくれます。

コードの解説はこちらで以上となりますが、
他に知っておくと便利なテクニックを追記しておきます。

シートの親ブックを取得する - Parentプロパティ

上記のいくつかのサンプルはBook1.xlsxをベタ打ちしていましたが、
これをいちいち入力するのは面倒なので、変数に入れてしまいたくなります。

もちろんwbのような変数に入れてもいいのですが、
VBAにおいては「処理対象のワークシート」を変数で持っていることが多いです。


この「シートの変数が既にある」場合は、ワークシート.Parentという記述で、
そのシートの親ブックを取得することができます。

' 処理対象のシートは変数で持っていることが多い
処理シート.Cells(R, 5) = ~~~
処理シート.Rows(R).Interior.Color = ~~~

' その場合上書き保存はこれで済む
処理シート.Parent.Save

WorkbookをOpen/Save/Closeでしか触らないことは多く、
その時Parentプロパティを知っていると扱う変数やコード量を減らせます。


サッとコードを書く味方になってくれますので覚えておきましょう。

保存して閉じる - Closeメソッドの引数SaveChange

上書き保存をしたブックをそのまま閉じる場合は、
1行で実行する方法もあります。


Closeメソッドの引数「SaveChange」にTrueを渡すと、
「ブックを上書き保存して閉じる」コードになります。

' 上書き保存して閉じる
Workbooks("Book1.xlsx").Close True

' ↑のコードはこれとほぼ同じ動き
Workbooks("Book1.xlsx").Save
Workbooks("Book1.xlsx").Close

1行 vs 2行の差なので一概にどちらがいいとは言えませんが、
知っていると楽ができるコードです。


Saveと同様ReadOnlyがTrueだと止まってしまいますので、
その点は気を付けて使用してください。