none
VBからExcel 2016を起動した場合のBeforeCloseイベントについて RRS feed

  • 質問

  • 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

    2016年6月29日 0:17

回答

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

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

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

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

    2016年6月30日 7:50

すべての返信

  • > 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 に渡すためです。
    2016年6月30日 3:21
  • 本件、Excel 2016 の不具合として既に修正リクエストが上がっており、今月時点で修正プログラム KB3115139 として公開されていました。

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

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

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

    2016年6月30日 7:50
  • 丁寧なアドバイスありがとうございます。
    Excel単体でも起こるのですか。。。。

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

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

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

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

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

    1ヶ月待つ事にします。

    感謝感謝です。

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

    2016年6月30日 8:04
  • > 高度な内容ということで有償サポートになるそうです。

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

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

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

    2016年7月6日 1:28
  • 本件に関して、Microsoft の Office サポートチームより blog 記事を公開して頂きました。

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

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

    2016年7月15日 10:17