• ベストアンサー

エクセルマクロでブック名を検索できない

エクセルマクロで今開いているブック以外のブック名を取得して編集するマクロを作っていますが、一度他のブックを開かずにエラーメッセージ"価格を検索したいブックを開いて下さい。"を表示させると以降開いたブック名を取得出来ません。 For Each wb In Application.Workbooks s = wb.Name If s <> ActiveWorkbook.Name Then Exit For Else MsgBox "価格を検索したいブックを開いて下さい。" Exit Sub End If Next オブジェクトの解放など調べてみたのですが、初心者でよく解らず困っています。どなたか教えて下さい。

noname#113614
noname#113614

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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

noname#113614
質問者

お礼

ご回答ありがとうございます。 ActiveWorkbook.NameをThisWorkbook.Nameに換えたら ちゃんと動くようになりました! それまではファイルを開く順序で上手く動いたり動かなかったりしていたのですが、解決しました!ありがとうございました。

その他の回答 (1)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

MsgBox "価格を検索したいブックを開いて下さい。" のあとに、Exit Sub が入っているので、これで処理が終了(マクロが終了)になっています。 http://www.accessclub.jp/vba/help/007.html

noname#113614
質問者

お礼

Exit Subで終了したら、もう一度実行しても検索されないということでしょうか?? "価格を検索したいブックを開いて下さい。"を表示させた後、 メッセージに従ってブックを開いて、もう一度マクロを実行しても ブック名を取得できませんでした。先にちゃんとブックを開いた状態でマクロを実行するとブック名を取得できるのですが。 ブックを開く順序ってブック名取得に関係あるのでしょうか??

関連するQ&A

  • 個人用マクロブックの有無

    エクセルVBAで現在ユーザーが使っているパソコンに個人用マクロブックが存在するかどうかを取得する方法を考えました。 まず、開いているBOOKを総当りして、エクセル2003までなら PERSONAL.XLS、2007からは"PERSONAL.XLSM がひらいているかどうかを調べる方法。 Sub test1() Dim wb As Workbook For Each wb In Workbooks If wb.Name Like "PERSONAL.XLS*" Then MsgBox "個人用マクロブックがあります。" Exit Sub End If Next MsgBox "個人用マクロブックはありません。" End Sub 最初から個人用マクロブックがあるものとして変数に入れ、エラーになったら無いと判断する方法。 Sub test2() Dim wb As Workbook Dim v As String v = IIf(Val(Application.Version) > 11, "PERSONAL.XLSM", "PERSONAL.XLS") On Error Resume Next Set wb = Workbooks(v) On Error GoTo 0 MsgBox "個人用マクロブックが" & IIf(wb Is Nothing, "ありません。", "あります。") End Sub でも、自分の端末はまだ2000で、しかも個人用マクロブックがあるので、ちゃんと判定できているのかどうか自信がありません。 これで正しいのでしょうか? また、test1とtest2ではどちらをつかえばいいのでしょうか? あるいは、もっと簡単なやりかたはないのでしょうか?

  • アクティブのブックのインデックスを知るプロパティ

    アクティブのブックをインデックスを取得する方法が知りたいのですが、 シートの activesheet.index のような、アクティブブックのインデックス番号を知ることができるプロパティはないでしょうか? 次のようなマクロを使って取得する方法は思いついたのですが、できればプロパティなど簡潔な文で 取得したいのです。 Public Sub tset() Dim i, s For i = 1 To Workbooks.Count If Workbooks(i).Name = ActiveWorkbook.Name Then s = i Next MsgBox s End Sub

  • エクセルのブックを閉じるマクロについて

    エクセルのブックAとブックBが開いている状態で、 ブックAのボタンに登録して実行すると、ブックAのみ閉じる、 というマクロを作りました。(下部にコードを記載します) このマクロは、2つのブックが開いていると正常に稼働するのですが、 ブックが1つしかない場合、実行時エラーが出てしまいます。 (ブックAのみ開いた状態でこのボタンを押してもエラーなく閉じたい) 実行時エラーが出ないようにするにはどうすれば良いか、 おわかりの方がいらっしゃいましたら教えて下さい。 どうぞよろしくお願い致します。 Sub このブックのみ閉じる() Dim wa As String wa = "ほかに無い" Dim wb As Workbook For Each wb In Workbooks If wb.Name <> ThisWorkbook.Name Then wa = "ほかにあるよ" End If Next If wa = "ほかに無い" Then Application.DisplayAlerts = False Application.Quit '終了予定 End If Range("D2").Select Selection.ClearContents ThisWorkbook.Close SaveChanges:=False End Sub

  • ExcelVBAで特定のブックをcloseしたい

    よろしくお願いします。Excel2000ですが、2002,2003,2007でも利用できることを前提に考えています。  複数のExcelブックを開いているとき、特定のファイル名のブックを閉じる方法を考えています。  2通り考えたのですが、いずれもだめでした。デバッグ機能でステップインしながら確認したのですが、エラーにもならず、closeメソッドを通過していました。 以下のVBAはなにか誤りがあるのでしょうか? (その1)  For i = 1 To Workbooks.Count   If Left(Workbooks(i).Name, 2) = "v3" Then    msw = Workbooks(i).Name    If msw <> "V3main.xls" Then     Workbooks(msw).Close    End If   End If  Next (その2)  For Each wb In Workbooks   If Left(wb.Name, 2) = "v3" Then    MsgBox (wb.Name)    If wb.Name <> "V3main.xls" Then     With wb      .Saved = True      .Close     End With    End If   End If  Next wb

  • Excel マクロで複数ブックのデータを一つのブックにまとめる方法

    マクロ初心者です。 1つのフォルダの中に複数のbook(sheetも複数)があります。 これを新しい1つのbookにまとめたいです。 sheetは「bookを開いた時に表示されるsheetだけ」を新しいbookにまとめたいです。 どなたかの回答に下記マクロがありました。 Sub consolid() Application.ScreenUpdating = False '画面更新を一時停止 Set mb = ThisWorkbook 'このコピー先ブックをmbとする。 myfdr = ThisWorkbook.Path fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fname = Empty '全て検索 If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。 wb.Worksheets.Copy After:=mb.Sheets(mb.Sheets.Count) 'コピーしてコピー先ブックの末尾に置く wb.Close '開いたブックを閉じる n = n + 1 'ブック数をカウント End If fname = Dir 'フォルダ内の次のExcelブックを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新一時停止を解除 MsgBox n & "件のブックをコピーしましました。" End Sub 非常によかったのですが、これですと (1)全てのsheetがコピーされてしまいます。 (2)また、保存しますか?とbookごとに聞いてきます。 上記のマクロのどこを変更すれば、(1)(2)を解決できますでしょうか? (エクセルは2002です) 以上、よろしくお願いします。

  • Excel マクロで複数ブックのデータを一つのブックにまとめる方法

    マクロ初心者です。 1つのフォルダの中に複数のbook(sheetも複数)があります。 これを新しい1つのbookにまとめたいです。 回答に下記マクロがありました。 Sub consolid() Application.ScreenUpdating = False '画面更新を一時停止 Set mb = ThisWorkbook 'このコピー先ブックをmbとする。 myfdr = ThisWorkbook.Path fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fname = Empty '全て検索 If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。 wb.Worksheets.Copy After:=mb.Sheets(mb.Sheets.Count) 'コピーしてコピー先ブックの末尾に置く wb.Close '開いたブックを閉じる n = n + 1 'ブック数をカウント End If fname = Dir 'フォルダ内の次のExcelブックを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新一時停止を解除 MsgBox n & "件のブックをコピーしましました。" End Sub これで使用した所マクロを実行する度に何度も同じシートが コピーされてしまいます。 できれば同じ名前のシートは上書きにしてマクロを何度も使用できるように【各BOOKは毎週更新されて私のフォルダに入ってきます】したいのですが そのような事は可能なのでしょうか? どなたか分かる方教えてください。お願い致します。

  • マクロで複数ブックのデータを一つのブックにコピー

    マクロ超初心者です。 1つのフォルダの中に複数のbook(sheetも複数)があります。 これを新しい1つのbookにまとめたいです。 sheetは「bookを開いた時に表示されるsheetだけ」を新しいbookにまとめたいです。 どなたかの回答に下記マクロがありました。 Sub consolid() Application.ScreenUpdating = False '画面更新を一時停止 Set mb = ThisWorkbook 'このコピー先ブックをmbとする。 myfdr = ThisWorkbook.Path fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fname = Empty '全て検索 If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。 wb.Worksheets.Copy After:=mb.Sheets(mb.Sheets.Count) 'コピーしてコピー先ブックの末尾に置く wb.Close '開いたブックを閉じる n = n + 1 'ブック数をカウント End If fname = Dir 'フォルダ内の次のExcelブックを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新一時停止を解除 MsgBox n & "件のブックをコピーしましました。" End Sub このマクロを使わせていただき、 これでいける!と思ったのですが、255文字以上のコピーが出来ません。 どのようにすればよいでしょうか?

  • 新しく開いたブックをアクティブにするマクロ

    マクロ 新しく作ったブックをアクティブにする マクロ初心者です。 マクロを使って同階層にあるファイルのアクティブのシートを ひとつのブックにコピーして保存するマクロを作りたいと思ってます。 他の質問を参照して下記のコードを途中まで作成しました。 参照した質問では、 マクロの入っているブックにシートをコピーするようでしたが、 そうすると保存した時にマクロも保存されてしまうので 私なりに調べて、新しいブックにシートコピーするようにしましたが、 この記述の後、新しいブックをアクティブにする記述がわからず、 保存できなくなってしまいました。 ここまで終わるとマクロの入っているブックがアクティブになって終わります。 このあと新しく開いたブックをアクティブにして、 ブックのsheet1~3を削除して、名前をつけて保存したいのですが 開いたブックをアクティブにするマクロをご伝授ください。 あたらしくブックをつくるとbook1~・・・と名前が変わってしまうので 変数で名づけたいのですが、やり方が良くわかりませんのでよろしくお願いします。 何卒よろしくお願いします。 Sub consolid_test() Dim shCnt As Integer Dim Wb As Workbook Dim i As Integer Dim sh As Worksheet Dim nSh As Worksheet Dim fName As String Dim ka As String Application.ScreenUpdating = False '画面更新を一時停止 Application.DisplayAlerts = False Set mb = Workbooks.Add '新しいコピー先ブックをmbとする。 myfdr = ThisWorkbook.Path fName = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fName = Empty '全て検索 If fName <> mb.Name Then 'ブック名がこのブックの名前でなければ Set Wb = Workbooks.Open(myfdr & "\" & fName) 'そのブックを開きwbとする。 Wb.ActiveSheet.Copy After:=mb.Sheets(mb.Sheets.Count) 'コピーしてコピー先ブックの末尾に置く ActiveSheet.Name = Range("B16") 'シート名の変更 ActiveSheet.Unprotect 'シート全体をコピーして値にする Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Wb.Close (False) '保存の有無を聞かずに保存しないで閉じる N = N + 1 'ブック数をカウント End If fName = Dir 'フォルダ内の次のExcelブックを検索 Loop '繰り返す ・ ・ ・ ・

  • Excelのブックを閉じる

    お世話になります。 Excel処理について質問です。 今、サーバで常にマクロが動き続けているExcelファイル(ファイルAとします)があります。 今回はそのファイルを閉じ、マクロにてシートの更新をしたのち、また開きなおしてマクロを実行させたいです。 方法としては、 1.C#から閉じて更新して開く処理を行う。 2.別のブックにファイルAを閉じる処理を行うマクロを仕込んでおき、 C#からはそのファイルを開くだけ。 が考えられると思っています。 どちらの方法でも良いので、コードの例を書いていただけないでしょうか。 ちなみに、自分の現状のコードは以下です。 (アラート非表示) for each wb in Workbooks if wb.Name <> ThisWorkbook.Name then wb.Close SaveChanges:=false end if next Application ThisWorkbook.Close SaveChanges:=false これでは、異なるブックのExcelファイルであっても、ウィンドウが分かれ てしまっていては、削除の対象になりません。 どなたか、宜しくお願いします。

  • 複数ブックの最後のブックだけ処理できない

    開いている複数ブックに対して「簡単な処理を行い、保存して閉じる」 というマクロを走らせたいのですが、 最後のブックのみ処理できずにマクロが終了してしまいます。 例えば、3ブック開いていたら3ブック目が、 4ブック開いていたら4ブックめが、処理できずに開いたままの状態です。 Dim Wb As Workbook For Each Wb In Workbooks 簡単な処理内容 ActiveWorkbook.Close SaveChanges:=True Next どのように改善すれば良いのでしょうか?

専門家に質問してみよう