- ベストアンサー
Excelファイルを開いている場合の処理
- 新規Excelファイルを開いている場合は閉じる処理を行いたいですが、コードを実行しても正常に処理されません。
- ユーザーがBook1またはテスト用ファイルを開いている場合に、それらを閉じる処理をしたいですが、コード内でフラグが正しく設定されずうまく動作しません。
- ws.Name = 'Book1.xls'やws.Name = 'テスト用.xls'としても、Book1を開いている場合にはフラグがTrueにならず、問題があるようです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。お邪魔します。 #1さんのご回答、冒頭4行で必要な解決策となり得ると思います。 ただ、それで十分かな?という疑問がありますのでサンプルを提示してみます。 ' ' フラグが必要ない場合 Sub Re8067327() Dim wbk As Workbook For Each wbk In Workbooks If wbk.Name Like "Book#" Or wbk.Name = "テスト用.xls" Then wbk.Close End If Next End Sub ' ' フラグが必要な場合 Sub Re8067327a() Dim wbk As Workbook Dim flg As Boolean For Each wbk In Workbooks If wbk.Name Like "Book#" Or wbk.Name = "テスト用.xls" Then flg = True wbk.Close End If Next If flg Then ' ' 閉じるべきブックが見つかった場合 Else ' ' それ以外の場合 End If End Sub ' ' 【未保存新規ブック】【テスト用.xls】を分けてフラグが必要な場合 Sub Re8067327b() Dim wbk As Workbook Dim flg1 As Boolean Dim flg2 As Boolean For Each wbk In Workbooks If wbk.Name Like "Book#" Then flg1 = True wbk.Close End If If wbk.Name = "テスト用.xls" Then flg2 = True wbk.Close End If Next If flg1 Then ' ' 未保存新規ブックが見つかった場合 ElseIf flg2 Then ' ' テスト用.xlsブックが見つかった場合 Else ' ' それ以外の場合 End If End Sub 要は 未保存新規ブックに付く仮の名前は"Book1"だけとは限らない、ということです。 もし、ブックを閉じる処理だけで良ければ、フラグは要りませんから、 For Each ループ一個で完結できます。 その他の場合は、どのようにflgを定義して条件分岐するかによって、 書き方が変わって来ます。 なお、蛇足ですが、 wbk.Name Like "Book#" は、Book1-Book9、9種の未保存新規ブックに対応していますが、 より多くの未保存新規ブックに対応させる必要があるとお感じになったならば wbk.Name Like "Book#" の部分を wbk.Name Like "Book#" Or wbk.Name Like "Book##" に置換するような要領で対応します。 それから、 wbk.Close と書いて、wbkが未保存ならば、保存のダイアログが表示されて 保存するかどうか問う、という仕様ですから、 恐らく引数を指定しないこのままの形が質問者さんの求める方法でしょうから、 その点は問題ないと思います。 もし、そうではなくて、 保存するか保存しないかをダイアログを表示せずに強制して 閉じる、ということでしたら、 まずは.Closeメソッドについてヘルプを確認してみるとよいと思います。 以上です。
その他の回答 (2)
- tsubuyuki
- ベストアンサー率45% (699/1545)
では、私も老婆心を出して、ちょっと違う切り口から。 とりあえず「新規ワークブック=保存されていない=『名前が付いていない』」ので、 ご提示のコード > Workbooks("Book1.xls").Close が機能しない、と言うのは前お二方と同意権です。 なので、私はこの「保存されていない」を利用したコードを紹介。 Private Sub Workbook_Open() Dim WB As Workbook For Each WB In Workbooks If WB.Path = "" Then WB.Close End If Next End Sub と言う、単純なコードです。 「ブック.Path」は、指定ブックが保存されているフォルダ名を返します。 要するに「保存されていない」のであれば、.Pathは空白を返しますので、 それを利用して閉じるかどうか判断してやる、と言う内容です。 「テスト用.xls」も含めて閉じるなら、 If WB.Path = "" Or WB.Name = "テスト用.xls" Then と書き加えてやればOKです。 #2さんと同じ見解、「閉じるだけならフラグは不要」と言う考え方です。 フラグが必要と言うことでも、質問文中のコードを見る限り応用できると思うので ここでは割愛させて頂きます。 ・テスト用.xls ・新規ブック ・その他の既存ブック の3つを開いた状態で走らせると、その他既存ブック以外が閉じられると思いますので、 とりあえず、ご確認くださいませ。 でも本当の問題は、 コレをどこに組み込んでどんなタイミングで走らせるか? なのかもしれませんね。
お礼
こんな方法もあるんですね、ありがとうございます
- Nouble
- ベストアンサー率18% (330/1783)
ウインドウズ側の設定次第 の、ところもありますが、 未保存のファイルには、拡張子がつかない んじゃ、なかったでしたっけ? とにかく、 Book1を見つけたとき Book1.xksを閉める。 こうしてますよね? これ、別物ですよね? あと、ネット漁ってみたのですが Workbooks("Book1").Close SaveChanges := False に、なってましたよ? 以下、余談ですが これ、勝手に閉められるの わたし的に、目の前で起こったら 「勘弁してよ」 ですね、 練習用だとは思いますが、こういうのって えてして、 無効化、忘れ易いんですよね、 組み込まないことを、 強く強く、お勧めさせてください。 … 老馬身ですね、 済みません。 如何でしょうか? とんちんかんなことを言っていたなら済みません。 でもなお、 お役に立てていたならば幸いです。
お礼
ありがとうございました 無事解決致しました