【マクロVBA】ブックを開いているか確認し、開いていなければ開く(Open)開いてあればアクティブに

ブック操作

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

しかし、複数のファイルを開いて処理する場合に既に開いてあるブックを再度開こうとすると、それまでの入力した値が上書きされてしまったりしてしまいます。

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

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




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

赤字の対象ブック名と青文字の対象ファイルパスを打ち換えて使用してください

Sub ブックAを開いているか確認()
Dim OpenBook As Workbook, Flag As Boolean
Flag = False
 
For Each OpenBook In Workbooks
If OpenBook.Name = "対象ブック名.xlsx" Then
Flag = True
End If
Next
 
If Flag = True Then
Workbooks("対象ブック名").Activate
Else
Workbooks.Open "対象ファイルパス\対象ブック名.xlsx"
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 OpenBook As Workbook, Flag As Boolean

Flag = False

 
For Each OpenBook In Workbooks’開いているブックの格納繰り返し

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

Next

 

End Sub

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

例えば「ブックA」「ブックB」「ブックC」を開いていると初めにブックAを変数に格納して
nextで次の繰り返しになった際には「ブックB」と続いていきます。

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

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

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

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

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

・対象のブックが開いてなければ対象ブックを開く

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

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

Dim OpenBook As Workbook, Flag As Boolean

Flag = False

 
For Each OpenBook In Workbooks

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

Next

 

If Flag = False Then
Workbooks.Open “C:\Users\ABC\Desktop\ブックA.xlsx”
End If

 

End Sub

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

見本のプログラムでは変数「Flag」が「False」だと「ブックA」を開くようにしています。

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

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

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

見本で先ほどのプログラムにブックAが開いてあった場合にはそのブックをアクティブにするというプログラムを作成してみましょう。

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

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

Dim OpenBook As Workbook, Flag As Boolean

Flag = False

 
For Each OpenBook In Workbooks

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

Next

 

If Flag = True Then
Workbooks(“ブックA”).Activate
Else
Workbooks.Open “C:\Users\ABC\Desktop\ブックA.xlsx”
End If

 

End Sub

これで対象ブックが開いてなければ対象ブックを開き、開いてあれば対象ブックをアクティブにすることができます。
今回はアクティブにする内容でしたが、用途に合わせて処理方法を追加してみてください。

⬛︎公式の説明

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

Workbooks.Open メソッド (Excel) | Microsoft Learn

⬛︎まとめ

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

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

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

コメント

  1. […] 【マクロVBA】ブックを開いているか確認し、開いていなければ開く(Open)開いてあればアクティブに ► 独学エクセル塾 (dokugakuexcel.com) […]