サイトをご覧になった方からリクエストをいただきました。「特定のブックを開いているか、どうやってチェックしたらいいですか?」と。また、別の方から「'合計'という名前のシートがあるかどうか調べたい」というメールもちょうだいしました。これらは同じ考え方で実現できますので、一緒に解説しましょう。
このテクニックは、実は「ファイルの操作」の「現在開いているブックの一覧を取得する」で解説しています。念のため同じコードを再度ご紹介します。
Sub Sample01() Dim wb As Workbook, flag As Boolean For Each wb In Workbooks If wb.Name = "Book1.xlsx" Then flag = True Next wb If flag = True Then MsgBox "Book1 を開いています。", vbInformation Else MsgBox "Book1 は開いていません", vbInformation End If End Sub
ブックの名前をチェックしている部分が「wb.Name = "Book1.xlsx"」です。ここは、拡張子を付けた方が安全でしょう。ただし、まだ保存していないブック名を調べたいときには拡張子を付けてはいけません。ファイル名と拡張子に関する詳しい情報は「ファイルを閉じる」をご覧下さい。
ブック名は大文字と小文字を区別します。Book1.xlsx を調べるのに「BOOK1.xlsx」や「Book1.XLSX」ではいけません。ファイル名の大文字と小文字は、保存するときの指定で異なります。調べたいブックの正式名称がどちらかわからない場合は、次のようにすると安全です。
Sub Sample02() Dim wb As Workbook, flag As Boolean For Each wb In Workbooks If UCase(wb.Name) = "BOOK1.XLSX" Then flag = True Next wb If flag = True Then MsgBox "Book1 を開いています。", vbInformation Else MsgBox "Book1 は開いていません", vbInformation End If End Sub
UCase 関数は、引数に指定した文字列を大文字に変換します。
基本的な考え方は一緒です。すべてのワークシートを表す Worksheets コレクションからひとつずつ Worksheetを取り出して、名前を調べます。次のサンプルでは、[合計]という名前のワークシートが存在するかどうかを調べます。
Sub Sample03() Dim ws As Worksheet, flag As Boolean For Each ws In Worksheets If ws.Name = "合計" Then flag = True Next ws If flag = True Then MsgBox "[合計]シートがあります", vbInformation Else MsgBox "[合計]シートはありません", vbInformation End If End Sub