トップ回答者
VBからExcel 2016を起動した場合のBeforeCloseイベントについて

質問
-
VBからExcel 2016を起動しユーザー操作によるEXCEL終了を管理(キャンセル)しようとしています。
EXCELメニューバーから「ファイル」→「閉じる」を選択した場合は何度でもイベントを捉えられますが、
EXCELのウィンドウ右上のバツマークからの場合、初回操作による終了はVBでイベントをとらえられ
キャンセルできますが、2回目のユーザー操作による終了をVBで捉えることができず終了してしまいます。
EXCEL2013ではどちらの操作でもイベントを捉えることができます。
OSはWindows7 64bit VBは2015communityです。
2回目以降もイベントを捕らえる方法があればご教授お願いします。
Imports Microsoft.Office.Interop
Public Class Form1
Public XlApp As Excel.Application
Public WithEvents xlBook As Excel.WorkbookPrivate Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
XlApp = CreateObject("Excel.Application")
XlApp.Visible = TrueTry
XlApp.Workbooks.Open(Filename:="XXXXXX.xlsx",
IgnoreReadOnlyRecommended:=True)
xlBook = XlApp.Workbooks(1)Catch
Call MsgBox("指定申請書類は他のユーザーが使用している可能性があります。" &
vbNewLine & "しばらくして、もう一度実行してください。", vbExclamation, "共有チェック")
XlApp.Quit
XlApp = NothingExit Sub
End Try
End SubPrivate Sub xlBook_BeforeClose(ByRef Cancel As Boolean) Handles xlBook.BeforeClose
Cancel = True
End SubEnd Class
回答
-
本件、Excel 2016 の不具合として既に修正リクエストが上がっており、今月時点で修正プログラム KB3115139 として公開されていました。
https://support.microsoft.com/ja-jp/kb/3115139
本パッチの適用により、Workbook_BeforeClose イベントが修正されます。(Application_WorkbookBeforeClose イベントについては未確認です)
また、上記は MSI インストール版に対する修正モジュールですが、クイック実行版に対する修正も近いうち(1ヶ月ぐらい?)で提供される予定とのことです。
- 回答の候補に設定 魔界の仮面弁士MVP 2016年6月30日 8:03
- 回答としてマーク 星 睦美 2016年7月11日 7:05
すべての返信
-
> Public XlApp As Excel.Application
> Public WithEvents xlBook As Excel.Workbook
今回の要件であれば、XlApp 側の WorkbookBeforeClose イベントを用いたほうが手っ取り早いかもしれません。
それで問題が解決するわけではないですけれども。
手元の環境では、Excel 2016 VBA 単体でも再現しました。
VB コードではなく Excel 側の問題だと思いますので、フォーラムへ質問するよりは、Microsoft のサポートに直接問い合わせることをお奨めします。
以下、質問への回答ではありませんが:
> XlApp = CreateObject("Excel.Application")
参照設定しているのであれば、
XlApp = New Excel.Application()
の方が良いと思います。
> XlApp.Workbooks.Open(Filename:="XXXXXX.xlsx", IgnoreReadOnlyRecommended:=True)
> xlBook = XlApp.Workbooks(1)
Workbook 単位で BeforeClose イベントを使うのであれば、
インスタンスの受け取りに「XlApp.Workbooks(1)」を使うのではなく、
xlBooks = xlApp.Workbooks
xlBook = xlBooks.Open(Filename:="XXXXXX.xlsx", IgnoreReadOnlyRecommended:=True)
にした方が良いでしょう。Open メソッドが Workbook を返します。
※Workbooks を一度変数に受けているのは、解放処理の Marshal.ReleaseComObject に渡すためです。 -
本件、Excel 2016 の不具合として既に修正リクエストが上がっており、今月時点で修正プログラム KB3115139 として公開されていました。
https://support.microsoft.com/ja-jp/kb/3115139
本パッチの適用により、Workbook_BeforeClose イベントが修正されます。(Application_WorkbookBeforeClose イベントについては未確認です)
また、上記は MSI インストール版に対する修正モジュールですが、クイック実行版に対する修正も近いうち(1ヶ月ぐらい?)で提供される予定とのことです。
- 回答の候補に設定 魔界の仮面弁士MVP 2016年6月30日 8:03
- 回答としてマーク 星 睦美 2016年7月11日 7:05
-
丁寧なアドバイスありがとうございます。
Excel単体でも起こるのですか。。。。XlAppにワークブックが2つ存在すれば思い通りに動作してくれます。
ワークブックが1つの時はExcelアプリケーションも閉じにいって
そちらのキャンセルが中途半端になっているのかなと妄想しております。ワークブックをダミーで開き、そちらのwindowのvisibleをFALSEにして
無理やり実現しようとしても、xlapp.visible=TRUE 時にダミーのExcelno外枠?
だけ表示されちゃいますし。。。高度な内容ということで有償サポートになるそうです。
早急な解決はあまり期待できそうになさげですが検討してみようと思います。ありがとうございました。
と返信しようとしたときに新たなアドバイスに気づきました。
1ヶ月待つ事にします。
感謝感謝です。
本当にありがとうございます。
-
> 高度な内容ということで有償サポートになるそうです。
問い合わせ用のインシデントの持ち合わせがありましたので、
今回は私の方から、Microsoft に問い合わせを行っております。そしてそのサポートより、先ほど追加連絡がありまして、
本日の「7 月の更新プログラム」バージョン 6.0.7070.2022 にて、
Application_WorkbookBeforeClose および
Workbook_BeforeClose イベントの問題が
修正されていることを確認できたとのことです。
クイック実行版を御利用いただいている場合は、アカウントの画面から、更新オプションの今すぐ更新を試してみてください。MSI 版を御利用頂いていた場合は、前回の投稿で紹介した URL を御利用いただけます。