dポイントプレゼントキャンペーン実施中!

EXCELマクロで台帳のシステムをつくっています。

台帳の入力が完了した後EXCELを閉じるタイミングで、
バックアップをとるために新しいブックを作成してデータを
コピーしたいと思い、Workbook_BeforeClose のなかで
新しいブックを作成する処理をいれました。

EXCELの右上のXで閉じたときには
うまく作成されるのですが、自作の終了ボタンから閉じたときには
Workbook_BeforeClose & 終了処理 には入るのですが新しいブックを作成する
箇所がスルーされてしまいます。
デバッグモードでみても該当箇所は通っているのですが、作成はされず
エラーになるわけでもありません。

いろいろ試してみましたがさっぱりわかりません。
詳しい方、教えてください。

・WINDOWS10
・EXCEL2013

・終了ボタンの処理
  Sub ボタン6_Click()
    ThisWorkbook.Close True
  End Sub

・Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim rc As Boolean
rc = Application.Run("BOOK1.xlsm!終了処理")
If rc = True Then
Cancel = True
Exit Sub
End If

・BOOK1.xlsm!終了処理
    ・
    ・
    ・
Workbooks.Add.SaveAs FileName:=XXpass & "\XXXX.xls"
Worksheets.Add().Name = XXXX
    ・
    ・

質問者からの補足コメント

  • ThisWorkbook.Close True を Application.Quitにしたら
    うまく動くことがわかりました。
    でも、複数の台帳を開いていることがあるのでできれば
    Close で閉じたいです。

    EXCEL2013 のためなんでしょうか

      補足日時:2016/03/30 18:25

A 回答 (1件)

もう、私は、あまりVBAマクロは分からないけれども、少し、読んで試してみました。



今、Excel 2013をインストールしてないPCだから、新しいメソッドは分かりませんし、知りませんが、とにかく、Excel 2010 で考えてみました。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
rc = Application.Run("BOOK1.xlsm!終了処理")
If rc = True Then
Cancel = True

これでは、Close メソッドは利きません。Cacel =True は、「閉じる命令を止めます」という意味ですから。

Application.Quit では、マクロは、止めるようになっていませんから、動くでしょうね。

>バックアップをとるために新しいブックを作成してデータをコピーしたい

として、新しいブックを作成するというのは、
Workbooks.Add.SaveAs ということでしょうけれど、2013以降で、分からないから、旧式の書き方で恐縮ですが、考えてみました。

'//
'ThisWorkbook モジュール
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim fn As String
  Dim mPath As String
  On Error GoTo ErrHandler
  'バックアップファイルは、孫を作らない
  If InStr(1, ThisWorkbook.Name, "bk.", vbTextCompare) > 1 Then Exit Sub
  With CreateObject("Scripting.FilesystemObject")
    fn = .GetBaseName(ThisWorkbook.Name) & "bk"  'ベース名から、BackUp名を作る
  End With
  mPath = ThisWorkbook.Path & "\"  '別フォルダのほうがよい
  Cancel = True '命令を阻止
  Application.EnableEvents = False
  Application.DisplayAlerts = False
  With ThisWorkbook
    .Save '*
    .SaveAs mPath & fn, xlOpenXMLWorkbookMacroEnabled '*
    ActiveWorkbook.Close False 'ここは、必ず False です。
    .Close False
  End With
  Application.DisplayAlerts = True
  Application.EnableEvents = True
  Exit Sub
ErrHandler:
  MsgBox Err.Number & " :" & Err.Description
End Sub

'標準モジュールに念のためですが、

Sub Auto_Open()
 Application.EnableEvents = True
End Sub
'//---

*の部分が、新しいメソッドで統合できると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

紛らわしい書き方をしてしまって申し訳ありません。
  rc = Application.Run("BOOK1.xlsm!終了処理")
  If rc = True Then
    Cancel = True
のCancelの判定は質問には関係ない点でした。

Private Sub Workbook_BeforeClose(Cancel As Boolean)のなかで
bookの作成をしようとすると、
Application.Quitから起動されたときは作成できるのに、
ThisWorkbook.Close から起動されたときは作成できない
(起動はします)ということです。

ThisWorkbook.Close で終わりたいときは、Close命令を
出す前にあらかじめbookを作成しておくということで
解決しました。(本当の解決ではありませんがとりあえず
希望どうりに動くということで良しとしました)

お礼日時:2016/04/03 11:18

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