和風スパゲティのレシピ

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

ブックを上書き保存して閉じる-Workbook.Close

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

ブックを上書き保存して閉じる処理は、
Closeメソッドの第1引数SaveChangeにTrueを指定することで、
1行のコードで実行することができます。

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

 
非常に簡単なコードで実行できますね。

本体の解説はこれで十分なくらいですが、このコードを活用するにあたり、
知っておくと便利なテクニックを2つ追記しておきます。

上書き保存可能か調べる - ReadOnlyプロパティ

上記のコードは上書き保存ができない場合は、
「名前を付けて保存」ダイアログが開いてしまいます。

この上書き保存ができない状況というのは大きく二つあり、
読み取り専用ブック」「新規作成ブック」が該当します。


新しくブックを作ったときはそもそも上記のコードは書かないので、
このコードを使う場合に重要になるのは「読み取り専用の判定」ですね。

その判定はWorkbook.ReadOnlyプロパティで行うことができます。

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

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

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


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

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

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

' この上書き保存は必ず成功する
Workbooks("Book1.xlsx").Close True

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

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

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


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

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

' その場合上書き保存して閉じるコードはこれで済む
処理シート.Parent.Close True

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

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



余談ですが、Rangeオブジェクト(セル)にもParentを使うことができ、
その場合は親のWorksheetを取得できます。

が、Rangeオブジェクトにはもっとストレートな「Worksheetプロパティ」が存在しますので、余裕があればそれもあわせて覚えてしまってください。

' あるセルの親シートの名前を取得するコード
Range("A1").Parent.Name
Range("A1").Worksheet.Name

 

上記の2コードは実行時は同じ動きをしますが、

書くときにこの選択肢が出る分、Worksheetの方が便利です。