マクロVBAの機能の1つに「Close」という機能が存在します。
使用方法としてはブックを閉じる際に使用します。
別のブックから数値を参照したりなと、ブックを経由する場合はよく使用する機能です。
しかし、使用方法を誤るとエラーが発生し、閉じることができません。
そこで今回はブックを閉じる際に発生するエラーに対しての原因と対処法を紹介します。
それでは見ていきましょう。
⬛︎通常のブックの閉じ方
まず、エラー対応の前に通常のブックを閉じる方法を説明します。
構文は以下の通りです。
Workbooks("ここに閉じたいブック名を記入").Close
とてもシンプルですね。
では見本で「見本.xlsx」というブックを閉じるプログラムを見ていきましょう。
前提として対象のブックが開いてあることが条件となります。
プログラムはこのようになります。
Sub ブックを閉じる()
Workbooks(“見本.xlsx“).Close
End Sub
こちらのプログラムで「見本.xlsx」のブックを閉じることができました。
結論としてブックを閉じる際に使用する「Close」はブック名で指示します。
これが原因でエラーが生じる場合もあります。
では、ブックを「close」で閉じる際のエラーの原因と対処法を見ていきましょう。
⬛︎closeのエラーの原因と対処法
・「実行時エラー’9′:インデックスが有効範囲にありません」について
こちらはブック名で指定していない可能性があります。
よくある原因としてはフルパスでファイルを開いて、そのフルパスを活用して「close」
することでエラーが生じてしまいます。
ではプログラムの例を見ていきましょう。
今回は「見本」ブックを開いて、処理を行い、閉じるプログラムです。
Sub ブックを閉じる()
Dim FilePath As String
FilePath = “C:\excel\見本.xlsx”
Workbooks.Open FilePath
‘ここに処理プログラム
Workbooks(FilePath).Close
End Sub
一見問題無さそうですが実行したらこのようになります。
「実行時エラー’9′:インデックスが有効範囲にありません」というエラーが発生しました。
原因としてブックを開く際の参照と閉じる際の参照の違いに問題があります。
ブックを開く際の「Open」はフルパスでなければなりませんが
ブックを閉じる際の「close」はファイル名でなければなりません。
しかし、パスが繰り返し動作やセルに入力してあるパスを参照する際には
プログラムにファイル名は入力できませんよね。
ファイル名が限定される方は次の項目に飛んでください。
使用するのは「Dir」になります。
機能としてはフルパスからファイル名を取得することができます。
では構文を見ていきましょう。
ファイル名=Dir(フルパス)
ではこちらを活用したプログラムはこのようになります。
Sub ブックを閉じる()
Dim FilePath As String, CloseFileName
FilePath = “C:\excel\見本.xlsx”
Workbooks.Open FilePath
‘ここに処理プログラム
CloseFileName = Dir(FilePath)
Workbooks(CloseFileName).CloseEnd Sub
それでは実行してみましょう。
「CloseFileName = Dir(FilePath)」の部分の変数「CloseFileName」にファイル名が
格納できているか見てみましょう。
「C:\excel\見本.xlsx」のフルパスからファイル名のみを抽出できています。
これでファイル名で「close」するのでエラーが出なくなります。
また、「close」で設定したファイル名が合っていなくても同様のエラーとなります。
例えば閉じたいブック名に半角のスペースが入っただけでも
エラーになってしまいます。
正確なファイル名で「close」の指示ができるようにプログラムを作成してください。
・プログラムが途中で停止、実行中のブックが閉じる
こちらは実行中のプロシージャ(プログラム)のブックを閉じると
起こるエラーとなっています。
例えば、「ファイル A」というファイルからVBAを使用して
「ファイルB」というファイルを閉じようとします。
しかし誤って「ファイルA」を閉じるように設定すると
プログラムを実行中のファイルAが閉じてしまうため
プログラムが途中で停止してしまう問題が発生します。
なので閉じるファイル名が正確か確認してみてください。
⬛︎補足 ブックを閉じる際の確認画面を表示させない方法
ここからは補足になります。
編集したブックを「close」で閉じる指令を実行すると「’対象ファイル名’の変更内容を保存じますか?」というメッセージがでます。
「Workbooks(ファイル名).Save」で1度保存した場合は問題ありませんが、保存しない場合は処理しないといけません。
しかし何度もブックを閉じるプログラムだと毎回確認ボタンを押さないといけないので面倒くさいですよね。
そこでブックを閉じる前に「Application.DisplayAlerts = False」を実行することで、確認動作をスルーすることができます。
ブックを閉じた後は「Application.DisplayAlerts = True」で再度、確認メッセージが出るように設定することをオススメします。
では先ほどのプログラムに織り込んでみましょう。
Sub ブックを閉じる()
Dim FilePath As String, CloseFileName
FilePath = “C:\excel\見本.xlsx”
Workbooks.Open FilePath
‘ここに処理プログラム
CloseFileName = Dir(FilePath)
Application.DisplayAlerts = False
Workbooks(CloseFileName).Close
Application.DisplayAlerts = TrueEnd Sub
これで「’対象ファイル名’の変更内容を保存じますか?」の確認メッセージをスルーすることが出来ます。
⬛︎まとめ
いかがだったでしょうか。
ブックを経由してデータを取得したり入力したりする際に用いられる
「close」ですが、使用方法を間違えるとエラーが生じてしまいます。
ぜひ今回の記事を参考にして
エラーが出ないようなプログラムを作成してみてください。
それでは次回の記事でお会いしましょう。