重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Excel2003です・

ユーザーが新規Excelファイル(book1)かテスト用ファイルを開いている場合は閉じる処理を考えております。

Option Explicit

Dim ws As Workbook, flag As Boolean

Private Sub Workbook_Open()


For Each ws In Workbooks
If ws.Name = "Book1" Then flag = True
Next ws
If flag = True Then
Workbooks("Book1.xls").Close
  Else
  End IF

For Each ws In Workbooks
If ws.Name = "テスト用.xls" Then flag = True
Next ws
If flag = True Then
Workbooks("テスト用.xls").Close
  Else
  End IF

End Sub


このコードだとBook1を開いているのに、Trueで拾ってくれません。
ws.Name = "Book1.xls"にしても同じです。
どこかおかしい部分があるのでしょうか?

A 回答 (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メソッドについてヘルプを確認してみるとよいと思います。

以上です。
    • good
    • 0
この回答へのお礼

ありがとうございました
無事解決致しました

お礼日時:2013/05/01 21:43

では、私も老婆心を出して、ちょっと違う切り口から。



とりあえず「新規ワークブック=保存されていない=『名前が付いていない』」ので、
ご提示のコード
> 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つを開いた状態で走らせると、その他既存ブック以外が閉じられると思いますので、
とりあえず、ご確認くださいませ。


でも本当の問題は、
コレをどこに組み込んでどんなタイミングで走らせるか?
なのかもしれませんね。
    • good
    • 0
この回答へのお礼

こんな方法もあるんですね、ありがとうございます

お礼日時:2013/05/01 21:45

ウインドウズ側の設定次第


の、ところもありますが、
未保存のファイルには、拡張子がつかない
んじゃ、なかったでしたっけ?

とにかく、
Book1を見つけたとき
Book1.xksを閉める。
こうしてますよね?
これ、別物ですよね?

あと、ネット漁ってみたのですが
Workbooks("Book1").Close SaveChanges := False
に、なってましたよ?


以下、余談ですが
これ、勝手に閉められるの
わたし的に、目の前で起こったら
「勘弁してよ」
ですね、

練習用だとは思いますが、こういうのって
えてして、
無効化、忘れ易いんですよね、

組み込まないことを、
強く強く、お勧めさせてください。


老馬身ですね、 済みません。


如何でしょうか?
とんちんかんなことを言っていたなら済みません。
でもなお、
お役に立てていたならば幸いです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!