- ベストアンサー
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
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 #1さんのご指摘のように、大文字・小文字のBinary Compare モードの問題でしょうけれど、 If InStr(1, wb.Name, "v3",1)>0 Then このように、TextCompare モードにすればよいと思います。Option Compare Text にして、Like 演算子を使う方法もありますが、手間が掛かります。 '例: '------------------------------------------- Sub Test1() Dim msw As String Dim i As Long For i = 1 To Workbooks.Count msw = Workbooks(i).Name If InStr(1, msw, "v3", 1) And StrComp(msw, "V3main.xls", 0) <> 0 Then MsgBox msw 'チェック用 'Workbooks(msw).Close 'うまく行ったら、「'」を外してください。 Beep End If Next End Sub
その他の回答 (1)
- n-jun
- ベストアンサー率33% (959/2873)
> Left(Workbooks(i).Name, 2) = "v3" > wb.Name <> "V3main.xls" "v3" or "V3" Vは大文字?小文字? によるのでは。
補足
早速のご回答ありがとうございました。 せっかくご回答いただいたのに、WorkBookがCloseできなかったのはもっと別のことが原因でした。 さらに私の手抜きなコーディングで惑わせてしまって申し訳ありません。 ご指摘の通り、2行目で"v3"で始まるファイル名のみ対象としているため、4行目の"V3main"は意味がありません。 実際に、ステップインで挙動を確認していくと、Closeのステップを無事に通過してしまいます。Closeのステップを通過しているのに実際にはWorkBookがCloseされないことが問題でした。 その原因ですが、上記のコードを書いたプロシージャが別のPrivate Subから呼び出されていることによるものでした。 現在は、上記のステップを呼び出す元のPrivate Subに直接記述することで解決いたしました。 お騒がせして申し訳ありませんでした。
補足
ご丁寧な回答をありがとうございました。 私の手抜きなコーディングのせいで混乱させてしまったようで、申し訳ありませんでした。 #1の方への補足にも書かせていただきましたが、無意味なことを承知の上で記述したコードでしたので、動作には影響がありませんでしたが、回答をお願いする身としては、浅はかだったと反省しております。 また、機会がありましたら、今度は質問内容を整理してまいりますので、よろしくお願いいたします。