既述の通り、自動/手動に関わらず、同じ名前のブックを開こうとするとエラーになって
しまう。その為、ブックを開く前に、特定の名前のブックが既に開いているかどうかを
調べる必要がある。例えば、「Book2」という名前のブックが既に存在する(=開いている)
かどうかを調べるには下記手順で処理を行う :
1.変数を1つ用意する。仮に変数をX(エックス)とする。
2.開いているブックのひとつひとつについて①~②の処理を行う :
①ブックの名前が「Book2」のとき、変数Xに値「あった」を代入して処理3.へ
②ブックの名前が「Book2」でなかったとき、変数Xに値「なかった」を代入
3.変数Xの値が「あった」の場合は「あったよ」、「なかった」の場合には「なかったよ」
とそれぞれメッセージを表示する
処理1.と3.については特に難しいことではない。それぞれDimステートメントとMsgBoxステー
トメントを使えば実現できてしまう。問題は処理2.をどうするか。。。
処理2.のように、なにかの集まりの要素ひとつひとつについて処理を行いたい場合、VBA
では、For Each~Nextステートメントを使用する。書式は下記の通り :
For Each 要素を代入する変数 In 要素の集まり
<<処理>>
Next
既に何度か登場した「Application.Workbooks」とは、実は、「『開いているブック』の集まり」
のことなので、For Eachステートメントを用いると処理2.は以下のように記述できる :
For Each Workbook変数 In Application.Workbooks
If Workbook変数.Name = "Book2" Then
...
Else
...
End If
Next
以上のことから、「Book2」が開いているかどうかを調べるコードは以下のようになる :
Sub SampleFindBook2
Dim bolHit As Boolean
Dim bk As Workbook
bolHit = False
For Each bk In Application.Workbooks
If bk.Name = "Book2" Then
bolHit = True
Exit For
End If
Next
If bolHit Then
MsgBox "あったよ"
Else
MsgBox "なかったよ"
End If
End Sub
0 件のコメント:
コメントを投稿