たくさんのブックを開いているときに、コードの書かれているブック以外のブックをまとめて閉じたい、と感じることがあります。
「VBA Thisworkbook以外のブックを保存しないで閉じる」
といった検索キーワードで、このサイト『インストラクターのネタ帳』へのアクセスもあります。
ThisWorkbook以外を閉じるオブジェクト変数を使ったマクロ
以下のSubプロシージャを実行すると、このコードが書かれているThisWorkbook以外のブックを、上書き保存せずに閉じられます。
Dim bk As Workbook
For Each bk In Workbooks
If Not (bk Is ThisWorkbook) Then
bk.Close SaveChanges:=False
End If
Next
End Sub
開いている全ブックに対するFor Each~Next文の中で、
For Each bk In Workbooks
ThisWorkbookではないときに、
If Not (bk Is ThisWorkbook) Then
Workbook.Closeメソッドの引数SaveChangesにFalseを指定し、上書き保存しないで閉じています。
bk.Close SaveChanges:=False
ThisWorkbook以外を閉じるカウンター変数を使ったマクロ
オブジェクト変数が苦手な方の場合、以下のコードのほうが理解しやすいと思います。
Dim i As Long
For i = Workbooks.Count To 1 Step -1
If Workbooks(i).Name <> ThisWorkbook.Name Then
Workbooks(i).Close SaveChanges:=False
End If
Next
End With
End Sub
ブックを閉じることで、Workbooksコレクションに含まれるWorkbookオブジェクトの数が減ってしまうので、拙著『いちばんやさしいPowerPoint VBAの教本』のLesson 42でもお伝えしているように、For~Nextループを増分値「- 1」(Step -1)で回して、
For i = Workbooks.Count To 1 Step -1
ブックの名前がThisWorkbookの名前と異なるときに、
If Workbooks(i).Name <> ThisWorkbook.Name Then
上書き保存せずに閉じています。
Workbooks(i).Close SaveChanges:=False
先のFor Each~Nextループを使ったSubプロシージャでは、オブジェクト変数について理解できている方向けに、Is演算子の否定を使って判定していましたが、
If Not (bk Is ThisWorkbook) Then
オブジェクト変数が理解できていない方の場合、
If Workbooks(i).Name <> ThisWorkbook.Name Then
のように名前で判定するほうが理解しやすいでしょう。
With文を利用したコード
上記のFor~Next文を使ったコードは、With文を使って以下のように書くこともできます。
Dim i As Long
For i = .Count To 1 Step -1
If .Item(i).Name <> ThisWorkbook.Name Then
.Item(i).Close SaveChanges:=False
End If
Next
End With
最終更新日時:2020-03-02 18:02
Home » エクセルマクロ・Excel VBAの使い方 » Workbooks・Workbook » VBAでThisWorkbook以外を閉じる