ブックを保存する


ブックを保存するには、次のような命令があります。

  • Saveメソッド (上書き保存)
  • SaveAsメソッド (名前を付けて保存)
  • SaveCopyAsメソッド (コピーを保存)

Saveメソッド

次のコードは、アクティブブックを上書き保存します。

Sub Sample1()
    ActiveWorkbook.Save
End Sub

すでに名前を付けて保存されているブックでしたら、上書き保存されます。もし、まだ保存されていないブックに対してSaveメソッドを実行するとカレントフォルダに「Book1.xlsx」などの名前で保存されます。このとき使用される「Book1」などの名前は、新規ブックを開いたときExcelが便宜的につける名前です。

では、カレントフォルダに、すでに同名のブックが存在していたらどうでしょう。たとえば、カレントフォルダに「Book1.xlsx」が存在していて。現在のアクティブブックが、まだ保存していないブックで、便宜的な名前が「Book1」だったようなケースです。こうした場合、Saveメソッドを実行すると

という確認メッセージが表示されます。選択肢は、[はい]ボタン、[いいえ]ボタン、[キャンセル]ボタンの3つです。[はい]ボタンをクリックすれば、もちろん上書き保存されます。しかし、[いいえ]ボタンか[キャンセル]ボタンをクリックすると、エラーになります。

これは、Saveメソッドが「ブックを保存する」という自分の仕事を達成できなかったという意味のエラーです。このエラーに対応するには、2つの考え方があります。

  1. 同名のファイル(ブック)が、存在するかどうかを先に調べる
  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オブジェクトを調べて「エラーが発生したどうか」を判定します。