• ベストアンサー

ブックの終了がうまくいきません

Excel2003 でマクロ作成中の超初心者です。マクロ完成まであと一歩になりました。次から進みません。お願いします。 ブックA ブックB ブックCの3個のブックがあります。 ブックAのコマンドボタン→ ブックBに飛びます。 ブックBには、フォームコントロール(終了するコマンドボタン)と、特定セルにコントロールが張り付けてあります。 ブックA→ブックBの終了ボタン →正常に終了します。 ところが、ブックBのコントロールから、ブックCに移り、 ここからも一度ブックBに戻って終了ボタンを押すとBブックは終了するものの、Cブックが閉じられません。なぜでしょうか? -----Bブックのセルに貼り付けたコントロールのマクロ----- Sub ブックCへ() Application.ScreenUpdating = False Dim wb As Workbook On Error Resume Next '開いて作業中の場合。 Set wb = Workbooks("21年計算01.xls") On Error GoTo 0 If wb Is Nothing Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\21年計算01.xls") End If '開いて作業中の場合。 Workbooks("21年計算01.xls").Activate ActiveWindow.WindowState = xlMaximized - ---最大化 Worksheets(12).Select End Sub -----Bブックのフォームコントロールのマクロ----- Private Sub CommandButton5_Click() Unload Me ActiveWorkbook.Close SaveChanges:=True End Sub -----Cブックのフォームコントロールのマクロ----- Private Sub データ入力_Click() Unload Me Application.ScreenUpdating = False On Error GoTo err: Workbooks("21年計算02.xls").Activate Exit Sub err: Workbooks.Open Filename:=ThisWorkbook.Path & "\21年計算02.xls" '''データ処理.Show Application.ScreenUpdating = True End Sub

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

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.7

またまたまた、登場、onlyromです。 当方のコードとは違いますよ。 よーく見てください。 先ず、ブックCをCloseして 次に、ブックBをCloseしないといけません。 ブックB=■Workbooks("21年計算02.xls")■ ブックC=■Workbooks("21年計算01.xls")■ となっている時に質問者のコードでは、次のようなことが起こります '-------------------------------------------- Private Sub CommandButton5_Click() Unload Me On Error Resume Next Workbooks("21年計算02.xls").Close True  On Error GoTo 0 ●ブックBが先にCloseされてるので ここから以降に書いてあるコードは実行されない、 Workbooks("21年計算01.xls").Close True End Sub '------------------------------------------ ようするにコードの書いてあるブックから先にcloseしてしまうと それ以降のコードは実行されないということです。 で、以下のように、 "21年計算▲01▲.xls"(ブックC)から先にCloseする '---------------------------------------------- Private Sub CommandButton5_Click()  Unload Me  On Error Resume Next    Workbooks("21年計算01.xls").Close True   On Error GoTo 0    Workbooks("21年計算02.xls").Close True End Sub '--------------------------------------- お試しください。  

aitaine
質問者

お礼

あああああなるほど!Cブックを閉じてからでないといけないのですか!!!のどの骨がやっととれました。見事に終了することができました。ありがとーーーーうです。感謝感激です。今後ともよろしくお願いします。

その他の回答 (6)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.6

No.1です。 Cブックが開かれているかを調べて、開いて居たら保存終了。 Aブックをアクティブにして、 最後にBブックをクローズ こんな流れでよさそうですね。 Private Sub CommandButton5_Click()  Unload Me  For Each Work In Application.Workbooks   If Work.Name = "C.xls" Then    Workbooks("C.xls").Close True    Exit For   End If  Next  Workbooks("A.xls").Activate  Workbooks("B.xls").Close True End Sub Aブックが開かれていない場合などは考慮していません。

aitaine
質問者

お礼

今実験しましたら、見事に終了することができました。ありがとうございました。これで思っていることができました。ほかのみなさまもありがとうございました。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.5

またまた登場、onlyromです。 >ブックA=ランチャーみたいにコマンドボタンの配置 >ブックB=■Workbooks("21年計算02.xls")■ >ブックC=■Workbooks("21年計算01.xls")■ で、あれば上手くいくはずです。 ブックBのWorkbook_BeforeCloseやBeforeSaveイベントなどで ブックCのOpenやCloseのキャンセルをしてるとこはありませんか? ブックCでも同様。 それから、Unload Me がありますがこれ何をしているのでしょうか。 質問にはUserFormを使っているとは一言も書いてありませんが。。   ま、何れにしろ、実際のコードをアップするのが早道です。 【端折らず】にアップ願います。  

aitaine
質問者

補足

わかりました。次のとおりです。 Aブックのボタン Private Sub CommandButton4_Click() Application.ScreenUpdating = False Unload Me 計算2(注 ブックを開くコード) Worksheets(1).Activate ActiveWindow.DisplayWorkbookTabs = False Range("A1").Select Application.ScreenUpdating = True End Sub -------------------------------------------------- Bブックのボタン  先ほど教えていただいたコード           ただし、21年計算01.xlsは終了できない。 Private Sub CommandButton5_Click() Unload Me On Error Resume Next Workbooks("21年計算02.xls").Close True On Error GoTo 0 Workbooks("21年計算01.xls").Close True End Sub ----------------------------------------------------- Bブックのシートに貼り付けたコントロール Sub 個人Aへ() Application.ScreenUpdating = False Dim wb As Workbook On Error Resume Next '開いて作業中の場合。 Set wb = Workbooks("21年計算01.xls") On Error GoTo 0 If wb Is Nothing Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\21年計算01.xls") End If '開いて作業中の場合。 Workbooks("21年計算01.xls").Activate ActiveWindow.WindowState = xlMaximized - ---最大化 Worksheets(8).Select  ’シートは20まであり End Sub -------------------------------------------------------------- Bブックに戻るためにCブックの戻るボタンに書いたコード Private Sub データ入力_Click() Unload Me Application.ScreenUpdating = False On Error GoTo err: Workbooks("21年計算02.xls").Activate Exit Sub err: Workbooks.Open Filename:=ThisWorkbook.Path & "\21年計算02.xls" Application.ScreenUpdating = True End Sub ----------------------------------------------------------------- Aブックにある終了ボタン Private Sub CommandButton3_Click() Application.ScreenUpdating = False 保存して終了 Application.ScreenUpdating = True End Sub

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

回答2,3のonlyromです。 質問のコードを見てちょと気づいた点。 ブックBで、ブックC■Workbooks("21年計算01.xls")■を開き ブックCで、別ブック■Workbooks("21年計算02.xls")■を開いてますよね。 で、全部開いている状態だと、 ブックA,ブックB、"21年計算01.xls"、"21年計算02.xls" の4ブックが開いていることになりますが、 ブックBのクローズボタンでは、ちゃんとブックAを除いた3ブックをクローズしていますか? ブックCで開いた■Workbooks("21年計算02.xls")■が残ってるのでは?  

aitaine
質問者

補足

ブックA=ランチャーみたいにコマンドボタンの配置 ブックB=■Workbooks("21年計算02.xls")■ ブックC=■Workbooks("21年計算01.xls")■ ブックCで、■Workbooks("21年計算02.xls")■に戻るだけです。。 で、全部開いている状態だと、 ブックA,"21年計算01.xls"、"21年計算02.xls" の3ブックが開いていることになります。 何でこんなことをするかというと、"21年計算01.xls"には20シートがあり、そこに入力したデータが"21年計算02.xls"にリンクされ 一覧表みたいに集計されるのです。ですから頻繁に21年計算01.xls と 21年計算02.xlsの間を行き来しなければなりません。 しかも21年計算02.xlsには20シートへ直行するコントロールボタンを配しています。 ブックB の終了ボタンで計算処理を終了し、Aブックに戻りそこについている終了ボタンでExcel を終了します。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

>Bブックが閉じた瞬間にCブックが現れCブックを閉じることができませんでした 実際のコードを見ないとコメントのしようがありませんので 実際のコードをアップして下さい。   みんなで解決しましょう。    

aitaine
質問者

補足

ありがとうございます。質問欄に書いたコード以外に表示すべきコードはないとおもうのですが・・・。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

  >開いているいないに拘わらず、CブックもCloseしてやればいいのでは? '----------------------------------  On Error Resume Next    Workbooks("C.xls").Close True  On Error GoTo 0    Workbooks("B.xls").Close True '----------------------------------    

aitaine
質問者

補足

今Bブックに上のマクロを貼り付けて実行しましたところ、Bブックが閉じた瞬間にCブックが現れCブックを閉じることができませんでした。どうしてか不思議です。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

Bブックの閉じるボタンを押した時の処理が、「アクティブなブックを保存終了」になっているため、アクティブなBブックだけを保存終了しています。 ここを、「アクティブなブックを保存」+「アプリケーション(Excel)を終了」にして見てください。 Private Sub CommandButton5_Click()  Unload Me  ActiveWorkbook.Save 'アクティブなブックを保存  Application.Quit 'アプリケーション(Excel)を終了 End Sub

aitaine
質問者

補足

説明不足で申し訳ありません。 Bブックの終了ボタン単独ですと、Bブックの終了ができAブックに戻ります。Bブックから一旦Cブックに飛び、またBブックに戻った時に、A・B・Cブックが開いています。このときBブックの終了ボタンでB・Cブックを同時に閉じ、Aブックに戻りたいのです。 Bブックの終了ボタンに 1)Cブックが開いていないときはすぐBブックを終了し、Aブックを表示。 2)Cブックが開いている時はBブックとCブックを終了し、Aブックを表示。 という条件マクロを作りたいのです。よろしくお願いします。