Question

kenshiro_kobe on Wed, 29 Jun 2016 00:17:43


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.Workbook

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load

        XlApp = CreateObject("Excel.Application")
        XlApp.Visible = True

        Try
            XlApp.Workbooks.Open(Filename:="XXXXXX.xlsx",
                     IgnoreReadOnlyRecommended:=True)
            xlBook = XlApp.Workbooks(1)

        Catch

            Call MsgBox("指定申請書類は他のユーザーが使用している可能性があります。" &
                         vbNewLine & "しばらくして、もう一度実行してください。", vbExclamation, "共有チェック")
            XlApp.Quit
            XlApp = Nothing

            Exit Sub

        End Try


    End Sub

    Private Sub xlBook_BeforeClose(ByRef Cancel As Boolean) Handles xlBook.BeforeClose
        Cancel = True
    End Sub

End Class


Sponsored



Replies

魔界の仮面弁士 on Thu, 30 Jun 2016 03:21:48


> 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 に渡すためです。

魔界の仮面弁士 on Thu, 30 Jun 2016 07:50:15


本件、Excel 2016 の不具合として既に修正リクエストが上がっており、今月時点で修正プログラム KB3115139 として公開されていました。

https://support.microsoft.com/ja-jp/kb/3115139

本パッチの適用により、Workbook_BeforeClose イベントが修正されます。(Application_WorkbookBeforeClose イベントについては未確認です)

また、上記は MSI インストール版に対する修正モジュールですが、クイック実行版に対する修正も近いうち(1ヶ月ぐらい?)で提供される予定とのことです。

kenshiro_kobe on Thu, 30 Jun 2016 08:04:40


丁寧なアドバイスありがとうございます。
Excel単体でも起こるのですか。。。。

XlAppにワークブックが2つ存在すれば思い通りに動作してくれます。
ワークブックが1つの時はExcelアプリケーションも閉じにいって
そちらのキャンセルが中途半端になっているのかなと妄想しております。

ワークブックをダミーで開き、そちらのwindowのvisibleをFALSEにして
無理やり実現しようとしても、xlapp.visible=TRUE 時にダミーのExcelno外枠?
だけ表示されちゃいますし。。。

高度な内容ということで有償サポートになるそうです。
早急な解決はあまり期待できそうになさげですが検討してみようと思います。

ありがとうございました。

と返信しようとしたときに新たなアドバイスに気づきました。

1ヶ月待つ事にします。

感謝感謝です。

本当にありがとうございます。

魔界の仮面弁士 on Wed, 06 Jul 2016 01:28:32


> 高度な内容ということで有償サポートになるそうです。

問い合わせ用のインシデントの持ち合わせがありましたので、
今回は私の方から、Microsoft に問い合わせを行っております。

そしてそのサポートより、先ほど追加連絡がありまして、
本日の「7 月の更新プログラム」バージョン 6.0.7070.2022 にて、
Application_WorkbookBeforeClose および
Workbook_BeforeClose イベントの問題が
修正されていることを確認できたとのことです。

クイック実行版を御利用いただいている場合は、アカウントの画面から、更新オプションの今すぐ更新を試してみてください。MSI 版を御利用頂いていた場合は、前回の投稿で紹介した URL を御利用いただけます。

魔界の仮面弁士 on Fri, 15 Jul 2016 10:17:51


本件に関して、Microsoft の Office サポートチームより blog 記事を公開して頂きました。

Excel 2016 で、2 回目以降の BeforeClose イベントが正しく処理されない事象について

2 回目のイベントが発生しないという今回の問題は、WorkbookBeforeClose でも発生しますが
KB3115139においては BeforeClose イベントの動作についてしか言及されていなかったため
参考情報としてフィードバックさせていただきます。