- ベストアンサー
エクセルマクロでブック名を検索できない
エクセルマクロで今開いているブック以外のブック名を取得して編集するマクロを作っていますが、一度他のブックを開かずにエラーメッセージ"価格を検索したいブックを開いて下さい。"を表示させると以降開いたブック名を取得出来ません。 For Each wb In Application.Workbooks s = wb.Name If s <> ActiveWorkbook.Name Then Exit For Else MsgBox "価格を検索したいブックを開いて下さい。" Exit Sub End If Next オブジェクトの解放など調べてみたのですが、初心者でよく解らず困っています。どなたか教えて下さい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
アルゴリズム的にも問題があるように思います。 このままだと、ちゃんと目的のブックを開いていても、for eachで最初に[目的のブック]を見つけた場合以外、必ず "価格を検索したいブックを開いて下さい。"を表示してしまいます。 それと、自分自身をActiveWorkbook.Nameでチェックしていますが、ActiveWorkbookは必ずしも自分自身でない場合があるので、ThisWorkbook.Nameでチェックした方がいいと思います。 以下ではどうでしょうか? Sub sample1() Dim wb As Workbook Dim s As String For Each wb In Workbooks s = wb.Name If s <> ThisWorkbook.Name Then Exit For End If Next If s = ThisWorkbook.Name Then MsgBox "価格を検索したいブックを開いて下さい。" Exit Sub End If MsgBox "価格を検索したいブックは" & s & "ですね?" '以下処理 End Sub また、[目的のブック]以外、複数のブックが開いていた場合はどうするのかが分からないのですが、自分自身と目的のブックが開いている場合もエラーにする場合です。 Workbooks.Countで開いているブック数が2個(自分と目的のブック)以外はエラーにします。 Sub sample2() Dim s As String Select Case Workbooks.Count '開いているブック数 Case 1 '自分だけ MsgBox "価格を検索したいブックを開いて下さい。" Exit Sub Case 2 'これは正しい s = Workbooks(1).Name '最初のブック名 If s = ThisWorkbook.Name Then '最初が自分自身なら、 s = Workbooks(2).Name '2番目が目的のブック End If Case Else '自分自身と目的のブック以外が開いている MsgBox "価格を検索したいブック以外は閉じて下さい。" Exit Sub End Select MsgBox "価格を検索したいブックは" & s & "ですね?" '以下処理 End Sub
その他の回答 (1)
- hana-hana3
- ベストアンサー率31% (4940/15541)
MsgBox "価格を検索したいブックを開いて下さい。" のあとに、Exit Sub が入っているので、これで処理が終了(マクロが終了)になっています。 http://www.accessclub.jp/vba/help/007.html
お礼
Exit Subで終了したら、もう一度実行しても検索されないということでしょうか?? "価格を検索したいブックを開いて下さい。"を表示させた後、 メッセージに従ってブックを開いて、もう一度マクロを実行しても ブック名を取得できませんでした。先にちゃんとブックを開いた状態でマクロを実行するとブック名を取得できるのですが。 ブックを開く順序ってブック名取得に関係あるのでしょうか??
お礼
ご回答ありがとうございます。 ActiveWorkbook.NameをThisWorkbook.Nameに換えたら ちゃんと動くようになりました! それまではファイルを開く順序で上手く動いたり動かなかったりしていたのですが、解決しました!ありがとうございました。