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


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

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

2018/1/17 Update
Insider スローへ修正を公開しました。

2018/1/23 Update
Insider スローで問題が再発生する状況について追記しました。

2018/1/26 Update
Insider スローに再度修正されたバージョンを公開しました。

2018/2/5 Update
Insider ファーストに修正されたバージョンを公開しました。

 

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. オプションの [セキュリティ センター] - [セキュリティ センターの設定] - [信頼できる発行元]

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

 

2018/2/5 Update

3. 対応方法

問題が修正されたバージョンを公開しました。詳細は以下の通りです。
 
Insider ファースト

バージョン 1802 ビルド 16.0.9026.2006 (2018/2/3 公開) で本記事の問題を修正しました。
 
Insider スロー

以下の通り、一時的に問題が修正された後、問題が再発生するバージョンがあります。最新のバージョンでは修正されています。
バージョン 1712 ビルド 16.0.8827.2148 (2018/1/17 公開) : 本記事の問題を修正しました。
バージョン 1801 ビルド 16.0.9001.2080 (2018/1/20 公開) : 本記事の問題が再発生します。
バージョン 1801 ビルド 16.0.9001.2102 (2018/1/26 公開) : 本記事の問題を再修正しました。
 
月次チャネル (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


 

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

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

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

図 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

 

今回の投稿は以上です。

 

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

Skip to main content