【マクロVBA】ブックを閉じているか確認して、閉じていない場合のみ閉じる(Close)方法

ブック操作

ブックを閉じる機能に「Close」という機能があります。
例えばブックを経由して入力・出力する際によく用いられる機能です。

しかし複数のファイルを開いて閉じる処理する場合に、既に閉じてあるブックを再度閉じようとすると
エラーが生じてしまいます。

そこで今回は指定したブックが閉じてあれば、そのままにして
閉じていなければブックを閉じる方法を紹介
したいとおもいます。

それでは見ていきましょう。




■忙しい人向けのコピペ用プログラム

赤文字の対象ブック名を打ち換えて使用してください。

Sub ブックAを閉じているか確認()
Dim CloseBook As Workbook, Flag As Boolean
Flag = False
 
For Each CloseBook In Workbooks
If CloseBook.Name = "対象ブック名.xlsx" Then
Flag = True
End If
Next
 
If Flag = True Then
Workbooks("対象ブック名.xlsx").Close
Else
MsgBox "対象ブックは閉じています"
End If
 
End Sub

⬛︎こんなことができるようになる!

・ブックが閉じてあるか確認して、閉じていなければ閉じることができる
・閉じている場合の処理方法を設定できる

■知っておきたい知識

・ブックを閉じるといったブック操作の基礎的な知識

【マクロVBA知識 16】ブックを開く・作成・名前の変更・フォルダの移動・保存・閉じる ► 独学エクセル塾 (dokugakuexcel.com)

・「If Then」での条件分岐の処理知識

【マクロVBA知識 9】If …Thenで条件分岐・判別をする(○○なら△△)処理パターンの複数化 ► 独学エクセル塾 (dokugakuexcel.com)

⬛︎ブックが閉じてあるか確認する

では実際にブックが閉じてあるか確認するプログラムを説明したいと思います。
まずは下図の見本をご覧ください。

ブックAというファイルを用意しました。
今回はこの「ブックA」が閉じてあるか確認してみようと思います。

使用する機能は「For Each」の繰り返し動作「true・False」です。
ではプログラムを見ていきましょう。

Sub ブックAを閉じているか確認()

Dim CloseBook As Workbook, Flag As Boolean

Flag = False

 
For Each CloseBook In Workbooks

If CloseBook.Name = “ブックA.xlsx” Then
Flag = True
End If

Next

 

End Sub

では解説です。
「For Each 変数 Workbooks」ですでに開いてあるブックを繰り返し変数に格納します。
見本では変数を「CloseBook」としてますが、可能な文字であれば何でも構いません。

例えば「ブックA」「ブックB」「ブックC」を開いていると初めにブックAを変数に格納して
nextで「ブックB」と続いていきます。

そして全てのブックを変数に格納し終えたら繰り返しを終了します。

この繰り返し動作の中にIfで対象のシートの名前か判断をします。
対象の名前と変数のブック名が等しい場合は変数「Flag」に「true」を格納します。

初めに変数「Flag」には「False」を格納しているので繰り返し変数のブックの中に
対象のブックがなければ「False」のままという仕組みです。
つまり、既にブックが閉じて有れば変数「Flag」は「False」ということになります。

ではこちらを応用して実際の活用法をご覧ください。

⬛︎結果を元に処理方法を設定する

・対象のブックが閉じてなければ対象ブックを閉じる

では実際に活用してみましょう。
早速プログラムを紹介します。

Sub ブックAを閉じているか確認()

Dim CloseBook As Workbook, Flag As Boolean

Flag = False

 
For Each CloseBook In Workbooks

If CloseBook.Name = “ブックA.xlsx” Then
Flag = True
End If

Next

 

If Flag = True Then
Workbooks(“ブックA.xlsx”).Close
End If

 

End Sub

では解説に移ります。
対象のブックが閉じてあれば変数「Flag」が「true」というのは先ほどの説明しました。
こちらをさらにIfで条件分岐させます。

見本のプログラムでは変数「True」だと「ブックA」を閉じるようにしています

これでブックが閉じて有れば何もせずに、閉じてない場合だけ、対象のブックを閉じるプログラムの完成です。

・対象ブックが閉じてあった場合の処理方法を追加

ここからは補足になりますが、「IF」の「Ease」を使用すればブックが閉じてあった時の
処理方法も設定出来ます。

見本で先ほどのプログラムにブックAが閉じてあった場合には「対象ブックは閉じています」
というメッセージボックスを表示するプログラム
を作成してみましょう。

結果はこのようになります。

Sub ブックAを閉じているか確認()

Dim CloseBook As Workbook, Flag As Boolean

Flag = False

 
For Each CloseBook In Workbooks

If CloseBook.Name = “ブックA.xlsx” Then
Flag = True
End If

Next

 

If Flag = True Then
Workbooks(“ブックA.xlsx”).Close
Else
MsgBox “対象ブックは閉じています”
End If

 

End Sub

これで対象ブックが閉じてなければ対象ブックを開き、閉じてあれば「対象ブックは閉じています」というメッセージボックスを表示させることができます

今回はメッセージボックスを表示する内容でしたが、用途に合わせて処理方法を追加してみてください。

⬛︎公式の説明

わかりやすいように説明したため公式と使用する語句が異なりますが
マイクロソフト公式の説明については下記のリンクを参照してください。☟

Workbook.Close メソッド (Excel) | Microsoft Learn

⬛︎まとめ

いかがだったでしょうか。
内容としては「For Each」の繰り返し動作と「true・False」を活用して
対象ブックが閉じてあるか確認する内容でした。

今回はブックでしたが、シートでも同様の仕組みで確認することができます。
是非参考にしてみてください。

それでは次回の記事でお会いしましょう。

コメント