Excel 2013 からのウィンドウ管理方法変更について – シングル ドキュメント インターフェイス (SDI)

Last Update:

(※ 2016 年 12 月 19 日に Japan Office Developer Support Blog に公開した情報のアーカイブです。)

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

先日、本ブログの更新再開をお知らせさせて頂きましたが、今回の投稿では Office クライアント開発に関する投稿の第一弾として、Excel 2013 から変更された Excel のウィンドウ管理方法について記載します。

今回の内容は、Office クライアント製品を利用した開発を行う場合だけでなく、画面操作で Excel を操作する上でも影響がありますが、特に開発観点でチェックして頂きたいポイントを解説していきます。

2018/4/4 Update
3-1. に DisableMergeInstance に関する情報を追記しました。

2020/7/6 Update
3-1. に関連記事へのリンクを追記しました。

目次

1. MDI と SDI とは?
2. Excel のウィンドウ管理の変更
3. Excel を利用するプログラムへの影響

3-1. ブックが開かれるプロセス
3-2. リボン カスタマイズ
3-3. 複数ウィンドウをまたがる操作 (サポート技術情報のご案内)

1. MDI と SDI とは?

Windows OS上で動作するアプリケーションは、1 つのアプリケーション インスタンスから複数のウィンドウを開いて作業を行うことができ、これらのウィンドウに親子関係を持たせて管理することができます。アプリケーションが、自身で扱うウィンドウを管理する仕組みの種類として、「マルチ ドキュメント インターフェイス (MDI)」と「シングル ドキュメント インターフェイス (SDI)」があります。

以下は、これらの違いを図で表しています。このように、MDI はウィンドウの親子関係を持ちますが、SDI はそれぞれが独立したウィンドウになります。

図 1. MDI と SDI の違い

2. Excel のウィンドウ管理の変更

Excel アプリケーションは、Excel 2010 までは MDI を採用していました。つまり、Excel を起動すると、まず親ウィンドウとしてリボン メニューなどを持つウィンドウが作成され、その中に開かれたブック毎に子ウィンドウが作成されました。

一方で Excel 2013 以降のバージョンでは、ウィンドウ管理の方法が SDI に変更されました。この結果、Excel 2013 以降のバージョンでは、リボンとブックの内容を表示する独立したウィンドウがブック毎に作成されます。

この動作変更については、以下の公開資料でまとめられています。画面の見え方の違いなども画像付きで説明されていますので、ぜひご一読ください。

タイトル : Excel の単一ドキュメント インターフェイスのプログラミング
アドレス : https://msdn.microsoft.com/ja-jp/library/office/dn251093.aspx

Excel の SDI 化のメリット

SDI は、GUI で操作するユーザーにとって以下のようなメリットがあります。

  • マルチ ディスプレイ環境でそれぞれのディスプレイにブックを表示できるので、ブックを並べて見たい場合に便利です。
  • 1 つのディスプレイであっても、ユーザーがウィンドウのドラッグ操作で自由にウィンドウをレイアウトできます。(MDI ですと、親ウィンドウ内のリボンより下の範囲でだけレイアウト可能でした。)
  • リボン メニュー、名前ボックス、数式バー、ステータスバーなどがブック毎に作成されるので、それぞれのブックでの現在の作業内容が視覚的に分かりやすくなります。

また、昨今ではタッチ パネルで操作する利用シーンも増えてきています。以前の MDI ですと、タッチ操作でブックを閉じるため子ウィンドウの右上×ボタンをタッチしようとして、すぐ上にある親ウィンドウのボタンをタッチしてしまった・・・ということも起きてしまいますが、SDI のインターフェイスではこのあたりも操作しやすくなっているかと思います。

(SDI から話は逸れますが、Excel 2013 からは [タッチ/マウス モードの切り替え] というコマンドが追加されており、タッチ操作向けにリボン メニューのメニュー同士の間隔を広げてさらに操作しやすくすることもできます。)

3. Excel を利用するプログラムへの影響

さて、このブログ記事の本題です。

Excel のウィンドウ管理が MDI から SDI に変更されたことで、Excel VBA マクロ、Excel をオートメーションするアプリケーション、Excel アドインなどのプログラムへは、どのような影響があるのでしょうか。上記の公開資料にも記載がありますが、ここでは、特に代表的なものをご紹介します。

以前のバージョンの Excel で利用していたアプリケーションが、新しいバージョンの Excel でそのまま動作するかを検討するときには、これらの観点でプログラムをご確認ください。

3-1. ブックが開かれるプロセス

Excel 2010 以前から、既に起動されている Excel プロセスがある場合に、新しく Excel ブックを開いたり、スタート メニューやプログラムから Excel アプリケーションを起動したとき、同じプロセスが利用されるか、新しいプロセスが起動されるかは、起動方法によって異なります。

Excel 2010 までの動作については、以下の過去投稿で説明しています。

タイトル : Office のプロセス インスタンス制御について
アドレス : https://officesupportjp.github.io/blog/Office のプロセス インスタンス制御について/

Excel 2013 からは、SDI 化に伴って、下表の 「No.1 プログラムを起動する」のシナリオの動作が変更されました。Excel 2010 では新規プロセスが使用されていましたが、Excel 2013 以降、既存プロセスが使用されるよう変更されました。なお、下表の各操作の詳細は、先述の過去投稿をご参照ください。

表 1. 新規 / 既存プロセスで開く操作に関する一覧 (Excel 2013 以降)

No 操作 Excel
1 プログラムを起動する 既存
2 エクスプローラからファイルを開く 既存
3 オブジェクト生成 (CreateObject) 新規
4 OLE 埋め込みオブジェクト 既存

対応が必要なプログラムの例:

既存の動作では、プログラムから起動した Excel プロセスとユーザーが任意に起動した Excel プロセスが別であるため、これを期待して、プログラムから加えた Excel へのプロパティ設定などが、ユーザーが任意に起動した Excel には反映されないことを期待している場合

以前と同等の動作を実現したい場合:

プログラムからオートメーションで Excel を起動する場合に Process.Start を使用していることで影響が生じる場合、先述の表の No.3 のように、オブジェクト生成で起動することをお勧めします。プログラムから Excel をオートメ―ションして様々な処理を行う場合、このように起動する方が以後の処理が実装しやすくなります。

ただこの場合も、ユーザーがプログラムより後からスタート メニューからプロセスを起動すると、プログラムが先に起動したプロセスが利用されます。

プログラムからの起動に引き続き Process.Start を使用したい場合や、後からユーザーが起動した Excel を新規プロセスで起動したい場合には、コマンドライン スイッチに Excel 2013 から追加された「/x」を付与することが検討できます。スタートメニューのショートカットを、このスイッチ付きのものに変更するといった運用が想定されます。

注:

Excel 2010 以前からの動作ですが、No.2 や No.4 に相当する動作の場合は、既存プロセスで起動します。このため、スタートメニューのショートカットを /x スイッチに変更しても、既存プロセスが使われるシナリオもあることには十分ご留意ください。

タイトル : Excel のコマンド ライン スイッチ
アドレス : https://support.office.com/ja-jp/article/c6f24136-e80c-4de9-a0ca-d5c68792cc6f
コマンドラインの例) excel.exe /x

また、プログラムから、次の Excel 起動時に新規プロセスで起動するよう制御する場合は、以下の MergeInstances プロパティが利用できます。

タイトル : Application.MergeInstances プロパティ (Excel)
アドレス : https://msdn.microsoft.com/ja-jp/library/office/dn481210.aspx

さらに、必要な更新プログラムを適用していただくと、DisableMergeInstance というレジストリによる制御も可能です。詳細は以下のサポート技術情報をご参照ください。

文書番号 : 3165211
タイトル : How to force Excel to open in a new instance by default
アドレス : https://support.microsoft.com/en-us/help/3165211

 
関連情報

プロセスの統合・分離に関連する以下のフォーラム記事も公開しています。

Office プロセスを自プログラム専用にすることはできません
https://officesupportjp.github.io/blog/Office プロセスを自プログラム専用にすることはできません/

Excel でブックを開くプロセスを統合するメリット
https://officesupportjp.github.io/blog/Excel でブックを開くプロセスを統合するメリット/

3-2. リボン カスタマイズ

Excel 2010 までの MDI では、Excel のリボンは親ウィンドウに 1 つだけ存在し、リボンに独自メニューを追加したり、特定のメニューを無効化したりといったカスタマイズを行うと、このプロセスで開かれている全てのブック (子ウィンドウ) にカスタマイズした内容が反映されました。

一方、Excel 2013 からの SDI では、リボンはウィンドウ毎、つまりブック毎に複数作成されます。このため、リボンへのカスタマイズは、全てのウィンドウに対して処理を行う必要があります。

対応が必要なプログラムの例:

Excel 起動時に 1 回だけリボン カスタマイズを行い、その後さらにブックが開かれるとき、初めに行ったカスタマイズが全てのブックに有効なことを期待している場合

この動作については、以下のサポート技術情報で説明しています。対処方法は、サポート技術情報に記載の通り、すべてのウィンドウに対してリボン カスタマイズを行います。

文書番号 : 2761240
タイトル : Command bars of Excel add-ins are not displayed or removed automatically in Excel 2013 or later when you load or unload the add-ins
アドレス : https://support.microsoft.com/ja-jp/kb/2761240 (日本語機械翻訳版)
アドレス : https://support.microsoft.com/en-us/kb/2761240 (英語版)

ただし、ここで使用されている CommandBars オブジェクトを使用してリボンをカスタマイズする方法は、レガシーな方法となります。Excel 2007 でリボン メニューが採用されて以降、CommandBars を用いたリボン カスタマイズは推奨していません。Excel 2007 以降では、リボンのカスタマイズは XML を用いて行うことを推奨しています。一部の制御は XML でしかできないものもありますので、ぜひXML での実装をご検討ください。

XML を用いたリボン カスタマイズの詳細については、また別の機会に詳しく解説したいと思います。

3-3. 複数ウィンドウをまたがる操作

Excel 2013 の SDI 化によって、意図した動作、および製品の不具合などによって、複数のウィンドウ間での遷移でこれまでと異なる動作が生じることがあります。以下に Excel 2013 で SDI 化に関連して発生する現象のサポート技術情報をまとめました。

文書番号 : 2827321
タイトル : Sheet focus changes when you click a button to run a macro to protect or unprotect some Excel 2013 worksheets
アドレス : https://support.microsoft.com/ja-jp/kb/2827321 (日本語機械翻訳版)
アドレス : https://support.microsoft.com/en-us/kb/2827321 (英語版)

文書番号 : 2851316
タイトル : Excel 2013 でモーダル ダイアログから開かれたブックのメニューバーやリボンの操作ができずウィンドウを閉じることができない
アドレス : https://support.microsoft.com/ja-jp/kb/2851316

文書番号 : 2861288
タイトル : Excel 2013 で複数のブックを開き Appliction.ScreenUpdating プロパティ使用中にアクティブ ブックが切り替わるとウィンドウが点滅しデスクトップが見えることがある
アドレス : https://support.microsoft.com/ja-jp/kb/2861288

文書番号 : 2928902
タイトル : Excel 2013 をオートメーションで実行し、異なるウィンドウのシートをコピー後にブックのシートを削除すると、エラーが発生する
アドレス : https://support.microsoft.com/ja-jp/kb/2928902

文書番号 : 3083825
タイトル : Excel workbook is not activated when you run a macro that calls the Workbook.Activate method
アドレス : https://support.microsoft.com/ja-jp/kb/3083825 (日本語機械翻訳版)
アドレス : https://support.microsoft.com/en-us/kb/3083825 (英語版)

これらの他にも、主に複数のウィンドウをまたがった操作などで、類似の現象が生じることがあります。(例 : 新規ブックの追加、シートのセル範囲の選択 など)

これらの現象には、以下のような対処が有効なことが多いため、まずはこれらの対処をお試し頂くことをお勧めします。

・処理対象のブックやシートを明示的に Activate してから目的の処理を行う
・ウィンドウを表示状態で処理を行う
・不要なブックを閉じてから目的の処理を行う

今回の投稿は以上です。

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