ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

VBA Closeメソッド|エクセルブックを閉じる方法とその周辺

VBAにおけるちょっとした便利ツールを開発するにあたり避けることができないエクセルのブックを閉じる方法とその周辺の技術について解説します。単にアクティブなエクセルのワークブックを閉じるだけでなく、一歩踏み込んだ操作を実装してツールの完成度を高めていきましょう。

目次

エクセルブックを閉じる方法

アクティブなエクセルブックを単に閉じるだけなら簡単ですが、少し工夫を加えることでユーザーにとっての使い勝手が高まり、ツールの完成度が高まります。早速、具体的なサンプルを挙げながら説明していきます。

WorkbookクラスのCloseメソッド

VBAでエクセルワークブックのCloseメソッドの文法についてまず説明します。

メソッドとはオブジェクトが持っているプロシジャのことです。Workbookはエクセルワークブックを閉じるCloseというメソッドを持っています。どのように閉じるかを指定する為に3つの引数に値を与えることができます。

Close([SaveChanges], [Filename], [RouteWorkbook])

オブジェクトブラウザを見る限り、Close文法はこのようになっており、SaveChanges、Filename、RouteWorkbookの3つが引数名です。しかし、私が確認したところRouteWorkbookに関してはTrueを設定してもFalseを設定しても挙動に違いはありませんでした。よって、Closeメソッドに有効な引数は事実上SaveChanges、Filenameの2つのみです。

ブックを閉じる時に保存するのか、保存しないのかを明確に記述する:SaveChanges

始めはSaveChangesの引数です。単にアクティブなエクセルブックを閉じる方法を復習しておきます。これはたったの一行のプログラムです。

ActiveWorkbook.Close

しかし、これでは保存して閉じるのか、保存せずに閉じるのかわかりません。引数に保存して閉じるのか、そうでないのかを指定しましょう。

ActiveWorkbook.Close SaveChanges:=False  '保存せずに閉じる
ActiveWorkbook.Close SaveChanges:=True  '保存して閉じる

引数名を指定する為のSaveChangesは自動でSとCが大文字に変換されません。私の場合は見た目が美しくなるようにSとCを大文字にしていますが、savechangesなどとなっていても問題ありません。

なぜ保存するのかを明確に記しておくべきかというと、単に閉じようとすると、「このファイルの変更内容を保存しますか」というメッセージが出てしまうからです。

元データとして内容を読み取るだけなら保存せずに閉じる、成果物なら保存して閉じると明確に記述するのがおすすめです

Closeメソッドでブックを保存しつつ閉じる時のファイル名を指定する:FileName

前項のサンプルでさりげなく出てきましたが、FileName引数にフルパスを指定して、保存しつつ閉じるときのファイル名を指定することができます。フルパスというのはフォルダのパスに¥ファイル名をつけた文字列です。

Closeメソッドの説明からはやや脱線しますが大事なことなので追加で説明します。FileNameは変数や定数で与えるのがオススメです。プログラムの中で出てくる文字列や数値のことをリテラルというのですが、リテラルがプログラムの中で唐突に出てくる事は避けるべきだと筆者は考えています。For文で1から順に繰り返す、と言うような場合は構わないのですが、今回のようにFileNameに渡す文字列のような場合、その文字列がどこから出てきたのかが分かる様にしたり、プロシジャが始まってすぐの部分で定数として与える事によってメンテナンス性を挙げたりする方が良いからです。

ブックは変数に格納しておく

エクセルは保存するまでフルパスが確定しないため、閉じたりアクティブにしたりと言った作業が非常に困難です。私のお勧めはできるだけ早い段階でブックを変数に格納しておくことです。

Sub ブックを変数に入れることで取り扱いをしやすくする()
    
    Dim ブック As Workbook
    
    Workbooks.Add
    Set ブック = ActiveWorkbook
    
End Sub

このように、変数に格納しておけば、アクティブにしたり任意のタイミングで閉じたり、取り扱いが大変やりやすくなります。

'変数を使って自由にブックを操ることができる   
ブック.Activate
ブック.SaveAs Filename:="フルパス"
ブック.Save '上書き保存
ブック.Close SaveChanges:=False
ブック.Close SaveChanges:=True

ブックはオブジェクトなので、変数に代入する時はSetをつけ忘れないようにしましょう。

成果物のデータはぎりぎりまで保存しない

入力データに何かの処理を施して、成果物ができます。その成果物はマクロの実行が完了するぎりぎりまで保存しない方がよいことが多いです。

理由は、途中で何らかの予期せぬエラーが起きたり、途中でユーザーがマクロの実行を中断した場合に、余計なデータが保存された状態になってしまう為です。

エクセルブックは保存するまで、ファイル名が確定しません。そのため、ブックを指定するため(つまり、Workbooks(ファイル名)を使う為)に一旦西行完了前のブックを保存する方がいるかもしれませんが、これを解決するのが上述の変数にブックを格納する方法です。

特に理由がない限り、成果物のデータはぎりぎりまで保存しない。これを意識しましょう。

エクセルブックを閉じる方法とその周辺まとめ

  • ブックを閉じる時に保存するのか、保存しないのかを明確に記述する
  • ブックは変数に格納しておくといろいろと取り扱いが便利
  • 成果物のデータはぎりぎりまで保存しない方がトラブルが少ない

以上、ちょっとしたコツですが、ブックを閉じるところの動作周辺を少し心がけるだけでツールの完成度が高まります。頑張っていきましょう。

<関連記事>