wrote :: 2001.12.05

トップページ > Excel > VBA > 講座:ファイルの操作 > ブックを閉じる


ブックを閉じる

ブックを閉じるには Close メソッドを使います。次のサンプルは、すでに開いている Book1.xls を閉じます。

Sub Sample07()
    Workbooks("Book1.xls").Close
End Sub

よく「Closeメソッドでエラーになる」という話を聞きます。たいていの場合は Workbooks("Book1.xls").Close を Workbooks("Book1").Close と書いているケースが多いようです。拡張子を付けるとエラーになる……いや付けないとエラーになる……なんて話から「ExcelのCloseメソッドはバグってる」などと訳のわからない結論も耳にします。うまくいかない原因をすぐバグのせいにするのは恥ずかしいからやめましょう。自分の思うように動かないのは、ほとんどの場合自分が書いたコードが原因です。確かに Excel にもバグはあります。コンピュータのプログラムなのですから、バグがあって当然です。しかし、我々ユーザーに大切なことは「バグを発見すること」ではなく「バグを回避」することです。「これはバグだ!」と誇らしげに語る暇があったら回避策を考えることです。

閑話休題。Close メソッドに限りませんが、Workbook オブジェクトをブック名で指定するとき、拡張子の有無で動作が異なるのは Windows の設定によります。デスクトップの [マイ コンピュータ] を開いて [ツール] メニューの [フォルダ オプション] をクリックしてください。表示される [フォルダ オプション] ダイアログ ボックスの [表示] タブを開きます。ここに「登録されているファイルの拡張子は表示しない」というオプションがあります。



このオプションの設定によって、次のようなルールが適用されます。

・オプションをオンにした場合
    Excel のタイトルバーには「Book1」のようにファイルの拡張子が表示されない
    Workbooks("Book1").Close は、正常に実行される
    Workbooks("Book1.xls").Close は、正常に実行される

・オプションをオフにした場合
    Excel のタイトルバーには「Book1.xls」のようにファイルの拡張子が表示される
    Workbooks("Book1").Close は、エラーになる
    Workbooks("Book1.xls").Close は、正常に実行される

マクロを実行するパソコンで Windows にどんな設定がされているかわかりません。したがって、Workbook オブジェクトを操作するときは「Book1.xls」と拡張子を記述した方が安全だということになります。

ただし、例外もあります。対象となるブックが、まだ保存されていない場合です。[ファイル] メニューの [新規作成] などで新しいブックを挿入すると、そのブックには拡張子が付加されません。なぜなら、そのブックが Excel のブック形式で保存されるとは決まっていないからです。操作対象のブックがまだ一度も保存されていない場合は、Windows の設定にかかわらず、

    Excel のタイトルバーには「Book1」のようにファイルの拡張子が表示されない
    Workbooks("Book1").Close は、正常に実行される
    Workbooks("Book1.xls").Close は、エラーになる

となります。

■ブックを保存するか?

ブックを閉じるときに問題となるのは、そのブックを保存するかどうかです。まだ保存されたことのないブックや、何らかの変更が加えられたブックを Close メソッドで閉じようとすると確認のメッセージが表示されます。



アクティブックが、まだ保存されたことのない新規ブックだった場合は、カレントフォルダに「Book1.xls」など便宜的な名前で保存されます。ブックに何らかの変更が加えられていたら、その変更が上書き保存されます。

ここで問題になるのは、未保存の新規ブックをカレントフォルダに保存するとき、同名のファイルが存在していた場合です。このケースでは下のような確認メッセージが表示されます。



このメッセージを表示しないためには、次の 2 つの方法が考えられます。

1.同名ファイルの存在を調べておく

ブックを保存する前に、保存したいブック名のファイルが存在するかどうかDIR 関数でしらべます。

Sub Sample09()
    If Dir(ActiveWorkbook.Name & ".xls") <> "" Then
        MsgBox "同名ファイルが存在します。", vbExclamation
    Else
        ActiveWorkbook.Save
    End If
End Sub

ファイルの存在を調べる方法については「ファイルが存在しているかどうか調べる」を参照してください。

2.確認メッセージの表示を抑止する

VBA には、一連の作業を止めないために、ユーザーに対する確認メッセージの表示を抑止する機能があります。これには、DisplayAlerts プロパティを使います。DisplayAlerts プロパティに False を設定すると、以降の確認メッセージは表示されなくなります。

Sub Sample10()
    Application.DisplayAlerts = False
    ActiveWorkbook.Save
    Application.DisplayAlerts = True
End Sub

上のサンプルでは、同名ファイルがあっても上書き保存されます。DisplayAlerts プロパティは、プロシージャが終了すると自動的に True へ戻ります。しかし、プロシージャから他のプロシージャをコールしているケースなどで予期せぬ結果になる可能性もあり得ます。デバッグで苦しみたくないのなら、表示を抑止したい処理が完了した直後で明示的に True を設定しておきましょう。

ちなみに、確認メッセージで [いいえ] ボタンか [キャンセル] ボタンをクリックするとエラーが発生します。これは、どちらの場合も「正常に保存されなかった」という結果になるからです。Save メソッドはブックを保存するコマンドですから、保存されなかった場合にエラーを返すのです。どちらのボタンをクリックした場合でも、Excel が返すエラーコードは同じ「1004」です。エラーコードからはどちらのボタンがクリックされたか判断できませんので注意してください。

■ブックが変更されたか?

既存のブックを閉じるとき、そのブックに何らかの変更が行われていると「変更を保存しますか?」という確認メッセージが表示されます。この確認メッセージを出したくない場合は、Saved プロパティを操作します。Saved プロパティは Workbook オブジェクトのプロパティで、ブックに加えられた変更が未保存の場合は False がセットされます。したがって、Saved プロパティの値を調べることで、そのブックを閉じるときに確認メッセージが表示されるかどうか事前にわかるのです。

Sub Sample11()
    If ActiveWorkbook.Saved = False Then
        MsgBox "変更されています。", vbExclamation
    Else
        MsgBox "変更されていません。", vbExclamation
    End If
End Sub

Saved プロパティには値を設定することも可能です。たとえブックに変更が加えられていたとしても、VBA のコードで Saved プロパティに True を設定してしまえば「保存しますか?」のメッセージは表示されなくなります。

Sub Sample12()
    ActiveWorkbook.Saved = True
    ActiveWorkbook.Close
End Sub

ブックへの変更とは見た目のことではありません。たとえば任意のセルに何かのデータを入力した後で、入力したデータを削除すれば見た目には何も変わっていません。ところが、Excel のブック的には「データが入力された」と「データが削除された」という変更が行われたと認識するのです。さらに、ワークシート関数の中には、ブックを開くと同時に自分自身を再計算するものがあります。こうしたワークシート関数を使っているブックでは、開いただけで「変更された」と Excel は認識してしまいます。自動的に再計算が行われる関数には、NOW 関数RAND 関数などがあります。



[名前を指定してブックを開く]戻る← | →進む[ブックの一覧を取得する]