Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Excel 2016 バージョン 1712 で Workbook_Open から表示したユーザーフォームを閉じるとクラッシュする

こんにちは、Office 開発サポート チームの中村です。

2017 年 12 月に先行リリース チャネルに公開済み / 2018 年 1 月以降に他チャネルに公開予定の Office 2016 の更新バージョン 1712 を適用した環境の Excel 2016 で、ブック オープンと同時にユーザーフォームを表示している場合に、これを閉じると Excel がクラッシュする現象を確認しています。本記事では、現象が発生する状況と、現時点での回避策についてご案内します。今後、修正状況など随時更新を予定しています。

1. 現象の詳細

Office 2016 バージョン 1712 (8827.2082 以降) の環境で、Workbook_Open イベント ハンドラなどのブック オープンと同時に実行される処理からユーザーフォームをモーダル表示するマクロが組み込まれているファイルを開くときに、ユーザーフォームは正常に表示されますが、ユーザーフォームを閉じると Excel がクラッシュします。

再現手順
1. 新規 Excel ファイルを作成します。
2. Visual Basic Editor を起動し、ユーザーフォームを追加します。(UserForm1)
3. ThisWorkbook オブジェクトに以下のコードを記述します。

Private Sub Workbook_Open()
    UserForm1.Show
End Sub

4. ファイルを .xlsm 形式、または .xls 形式で保存していったん閉じます。
5. 4. で保存したファイルを開きます。
6. マクロが自動実行されてユーザーフォームが表示されます。 ※ マクロのセキュリティ設定やドキュメントの信頼状況によっては、警告バーが表示されてマクロが自動実行されません。これについては、2. で詳細を記載します。
7. 表示されたユーザーフォームを閉じます。
結果 : Excel がクラッシュします。

発生条件詳細

  • マクロがブック オープンと同時に自動実行される場合にのみ発生します。セキュリティの警告の黄色いバーが表示されて一旦マクロが無効化され、[コンテンツの有効化] でマクロを実行する場合は問題ありません。
  • ブック オープン時に動作する Workbook_Open イベント ハンドラ、Application.WorkbookOpen イベント ハンドラ、Auto_Open メソッドのいずれも現象が発生します。
  • ユーザーフォームを閉じる操作は、×ボタン、Unload メソッド、Hide メソッドのいずれも現象が発生します。
  • ユーザーフォームがモーダル表示の場合にのみ現象が発生します。モードレス表示の場合は問題ありません。
  • Excel アドイン (.xlam / .xla) をアドインとして登録して同様の処理を行う場合は問題ありません。

2. マクロの自動実行に関する設定

現象の再現条件であるブック オープン同時に Workbook_Open イベント ハンドラが実行される動作は、以下の設定によって制御されます。

1. オプションの [セキュリティ センター] - [セキュリティ センターの設定] - [マクロの設定]

  •  [すべてのマクロを有効にする] に設定されている場合
  • [デジタル署名されたマクロを除き、全てのマクロを無効にする] に設定されており、かつマクロに信頼された証明書でデジタル署名が行われている場合
  • [警告を表示してすべてのマクロを無効にする] または [警告を表示せずにすべてのマクロを無効にする] に設定されており、ドキュメントが信頼できる状態である場合

2. オプションの [セキュリティ センター] - [セキュリティ センターの設定] - [信頼済みドキュメント]

マクロのセキュリティ設定が [警告を表示してすべてのマクロを無効にする] の場合に、1 度そのブックを開いてマクロを有効にすると、そのブックは信頼できるドキュメントに登録され、次回以降マクロが自動的に有効化されます。

3. オプションの [セキュリティ センター] - [セキュリティ センターの設定] - [信頼できる場所]

ここに登録されたフォルダに格納されたブックは信頼され、マクロが自動的に実行されます。

4. オプションの [セキュリティ センター] - [セキュリティ センターの設定] - [信頼できる発行元]

ここに表示されている証明書 (ユーザーの証明書ストア [信頼された発行元] に登録された証明書) でマクロにコード署名が行われているブックは信頼され、マクロが自動的に実行されます。

3. 状況

2017 年 12 月 28 日現在、バージョン 1712 は Insider ファースト、および Insider スローに公開されています。月次チャネル (Monthly Channel) へも 1 月初旬に公開が予定されています。 現在弊社内で調査を進め、修正を検討していますので、進展があり次第本記事でお知らせします。

4. 暫定回避方法

修正が行われるまでの間、以下のいずれかの方法での回避をご検討ください。

4-1. Office 2016 の自動更新を停止し、バージョンを 1711 以前のままで利用する
4-2. マクロが自動実行されず警告が表示されるようにする
4-3. ユーザーフォームをモードレス表示にする
4-4. Application.OnTime メソッドでユーザーフォームを表示する

以下にそれぞれ詳細を記載します。

 

4-1. Office 2016 の自動更新を停止し、バージョンを 1711 以前のままで利用する

Office 2016 の自動更新を停止し、またすでにバージョン 1712 に更新してしまっている場合は、以前のバージョンに戻します。これらの手順は、以下の記事で以前に紹介した手順と同様となりますので、詳しい手順はリンク先を参照してください。

タイトル : Office 2016 バージョン 1708 以降で日本語の VBA モジュール名を含むファイルを開くとエラー
アドレス : https://blogs.msdn.microsoft.com/office_client_development_support_blog/2017/08/23/ver1708-issue-japanesenamevbamodule/
該当箇所 : ”3. 対応状況" の "暫定対応手順"

今回、戻すときに指定するバージョンは、それぞれ以下の通りです。

Insider ファースト : 16.0.8730.2122
Insider スロー : 16.0.8730.2127
月次チャネル : 16.0.8730.2127 (12/28 時点での最新です。月次チャネルはまだ問題は発生しませんが、本日以降、問題が発生した場合はこのバージョンに戻して回避できます)

 

4-2. マクロが自動実行されず警告が表示されるようにする

ブックを開いたときに、以下のように [セキュリティの警告] が一旦表示される状態にし、[コンテンツの有効化] をクリックしてマクロが実行されるようにします。

図 1. マクロのセキュリティ警告

このような状態とするには、「2. マクロの自動実行に関する設定」に記載した自動実行される条件を満たさないように Excel を構成します。ユーザーの環境やマクロの運用によって様々な構成が想定されるため、推奨される設定を一概にご案内することは難しいですが、一般的には以下の設定としていただくとほとんどのブックでセキュリティの警告を表示できます。

  • オプションの [セキュリティ センター] - [セキュリティ センターの設定] - [マクロの設定] を [警告を表示してすべてのマクロを無効にする] に設定 (既定)
  • オプションの [セキュリティ センター] - [セキュリティ センターの設定] - [信頼済みドキュメント] の [信頼済みドキュメントを無効にする] のチェックを入れる

このように設定すると、信頼できる場所にあるか、信頼済みの証明書で署名されたブック以外はセキュリティの警告が表示されます。
信頼できる場所は、既定ではアドイン格納フォルダ等の Excel で特別な意味を持つフォルダのみが登録されているため、これらのフォルダにユーザーが作成したマクロ ブックが格納されるケースは少ないかと思います。また、署名がマクロに付与されていることもあまり多くはありません。したがって、このように設定すると、一般的な構成ではほとんどのファイルでセキュリティの警告が表示されます。

ただし、組織のポリシーやご利用のシステムの要件などで、独自のフォルダを信頼できる場所に登録していたり、マクロのセキュリティ設定を変更しているといった状況も考えられますので、この方法で回避する場合には、環境構成を十分にご確認ください。


 

4-3. ユーザーフォームをモードレス表示にする

以下のようにコードを記述すると、ユーザーフォームをモードレスで表示できます。モードレスでの表示で問題ない場合は、モードレス表示に変更することで回避できます。

UserForm1.Show vbModeless


 

4-4. Application.OnTime メソッドでユーザーフォームを表示する

Application.OnTime メソッドを利用すると、一定時間の経過後に指定した標準モジュールの関数を呼び出すことができます。

タイトル : Application.OnTime メソッド (Excel)
アドレス : https://msdn.microsoft.com/ja-jp/library/office/ff196165(v=office.15).aspx

例えば以下のように記述すると、1 秒後に Sample メソッドを実行します。

Application.OnTime Now + TimeValue("00:00:01"), "Sample"

Workbook_Open イベント ハンドラには Application.OnTime で指定したメソッドを呼び出すように記述し、呼び出し先のメソッドでユーザーフォームの表示などの現在 Workbook_Open で行っている一連の処理を実行するように変更します。Application.OnTime メソッドでの関数呼び出しは、一旦ブック オープンの一連の処理の流れから抜けた後に実行される内部動作となりますので、今回の現象を回避できます。


ThisWorkbook オブジェクト に以下を記述

Private Sub Workbook_Open()
    Application.OnTime Now + TimeValue("00:00:01"), "Sample"
End Sub

標準モジュールに以下を記述 (ThisWorkbook オブジェクトなどに記述すると呼び出せませんのでご注意ください)

Public Sub Sample()
    UserForm1.Show
End Sub

今回の投稿は以上です。

本情報の内容 (添付文書、リンク先などを含む) は、作成日時点でのものであり、予告なく変更される場合があります。

Share the post

Excel 2016 バージョン 1712 で Workbook_Open から表示したユーザーフォームを閉じるとクラッシュする

×

Subscribe to Msdn Blogs | Get The Latest Information, Insights, Announcements, And News From Microsoft Experts And Developers In The Msdn Blogs.

Get updates delivered right to your inbox!

Thank you for your subscription

×