ブックを保存するには、次のような命令があります。
次のコードは、アクティブブックを上書き保存します。
Sub Sample1() ActiveWorkbook.Save End Sub
すでに名前を付けて保存されているブックでしたら、上書き保存されます。もし、まだ保存されていないブックに対してSaveメソッドを実行するとカレントフォルダに「Book1.xlsx」などの名前で保存されます。このとき使用される「Book1」などの名前は、新規ブックを開いたときExcelが便宜的につける名前です。
では、カレントフォルダに、すでに同名のブックが存在していたらどうでしょう。たとえば、カレントフォルダに「Book1.xlsx」が存在していて。現在のアクティブブックが、まだ保存していないブックで、便宜的な名前が「Book1」だったようなケースです。こうした場合、Saveメソッドを実行すると
という確認メッセージが表示されます。選択肢は、[はい]ボタン、[いいえ]ボタン、[キャンセル]ボタンの3つです。[はい]ボタンをクリックすれば、もちろん上書き保存されます。しかし、[いいえ]ボタンか[キャンセル]ボタンをクリックすると、エラーになります。
これは、Saveメソッドが「ブックを保存する」という自分の仕事を達成できなかったという意味のエラーです。このエラーに対応するには、2つの考え方があります。
1は、意外と手間がかかります。たとえば、次のような感じです。
Sub Sample2() Dim Target As String, re As Long If ActiveWorkbook.Path = "" Then ''まだ保存されたことがないブック Target = CurDir & "\" & ActiveWorkbook.Name & ".xlsx" If Dir(Target) <> "" Then re = MsgBox("この場所に'" & ActiveWorkbook.Name & ".xlsx'" & _ "という名前のファイルが既にあります。置き換えますか?", _ vbInformation + vbYesNoCancel + vbDefaultButton2) If re = vbYes Then Application.DisplayAlerts = False ActiveWorkbook.Save Application.DisplayAlerts = True End If Else ActiveWorkbook.Save End If Else ''すでに保存されたブック ActiveWorkbook.Save End If End Sub
対象のブックが、まだ保存されたことがないブックかどうかを判定するにはWorkbookオブジェクトのPathプロパティが空欄かどうかを調べます。Savedプロパティは、ブックに変更が加えられて、その変更が保存されたかどうかを返すプロパティですので、新規ブックで何も編集していない状態ではTrueになります。
上記のマクロでは、まだ完璧ではありません。拡張子を「xlsx」と決め打ちしていますが、もちろんこれはExcel 2007以降です。Excel 2003までは「xls」を指定しなければなりませんが、Excelのバージョンで拡張子を使い分けるだけでは不安が残ります。Excel 2007でも、ブックを保存する「標準のブック形式」が、もしかすると「97-2003ブック」に設定されているかもしれないからです。
こんなときは、2の「エラーを無視する」方が簡単で確実です。
Sub Sample3() On Error Resume Next ActiveWorkbook.Save If Err.Number > 0 Then MsgBox "保存されませんでした" End Sub
Saveメソッドを実行する前に、On Error Resume Nextでエラーを無視します。Saveメソッドを実行して、もしユーザーが[いいえ]ボタンか[キャンセル]ボタンをクリックするとエラーが発生します。そこで、直後にErrオブジェクトを調べて「エラーが発生したどうか」を判定します。