ブックを上書き保存する方法を解説します。
- ブックを上書き保存する - Saveメソッド
- ブックが上書き保存できるか調べる - ReadOnlyプロパティ
- シートの親ブックを取得する - Parentプロパティ
- 保存して閉じる - Closeメソッドの引数SaveChange
ブックを上書き保存する - 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だと止まってしまいますので、
その点は気を付けて使用してください。