Office をマルチスレッドでオートメーションすることの危険性

こんにちは、Office 開発 サポート チームの中村です。 今回は、Office をオートメーションするアプリケーションをマルチスレッドで作成する際の注意点について記載します。 Office は STA (Single-Threaded Apartment) モデルで動作しているため、マルチスレッドからの呼び出し、特に Office に重い処理を実行させているときや、ループ処理などでマルチスレッドから大量の呼び出しを行うと、エラーが発生することがあります。 この動作については、以下の弊社公開資料で解説していますが、開発者の皆様に知って頂く機会を増やすとともに、図等を用いてより親しみやすい内容でご案内するため、今回、本記事でも取り上げたいと思います。 タイトル : Office でのスレッドのサポート アドレス : https://msdn.microsoft.com/ja-jp/library/8sesy69e.aspx   目次 1. STA とは? 2. マルチスレッドからの呼び出しで想定されるエラー 3. 対処方法   1. STA とは? プロセスのスレッド モデルには、大きく分けて STA と MTA (Multi-Threaded Apartment) モデルがありますが、Office は STA を採用しています。(主に GUI でユーザー操作を行うアプリケーションでは、処理の整合性を確保するための実装が MTA と比較して容易なため、STA が採用されることが多いと思います。) STA モデルである Office では、他プロセスからの…


Windows 10 Version 1607 上で Workbook.Close 実行後に Excel がエラーとなってしまうことがある問題について

こんにちは、Office 開発 サポート チームの 遠藤です。 今回は、Windows 10 への対応を行われているお客様からいくつかいただくもので、Excel がクラッシュしてしまう、という問題について報告したいと思います。 2017/4/13 update 本 Blog で紹介した問題については、2017 年 4 月から提供を開始しました Windows 10 Creators Update にて修正されました。   この問題は以下の条件下で発生します。 (条件の 1 から 4 は必須条件となります。 5 については、結果的に何かしらのオブジェクトを破棄するような処理が影響する可能性があり、5  は一例となります。) OS が Windows 10 Version 1607 (Anniversary Update) であること Excel をオートメーションで操作していること Excel 内部から結果的にプリンタ情報を取得する処理を行うこと “Windows で通常使うプリンターを管理する” が既定値である “オン” になっていること Workbook オブジェクトの Close メソッドを呼び出すこと   なお、この問題は任意の Excel バージョンで発生し、以下のコードを VBScript…


Microsoft Graph – Excel REST API (C#) を使い Range を操作するサンプル コード

こんにちは、Office Developer サポートの森 健吾 (kenmori) です。 今回の投稿では、Microsoft Graph – Excel REST API を使用して、指定されたアドレスの Range オブジェクトを操作するプログラムを、実際に C# で開発するエクスペリエンスをご紹介します。 ウォークスルーのような形式にしておりますので、慣れていない方も今回の投稿を一通り実施することで、プログラム開発を経験し理解できると思います。前回の OneDrive API のウォークスルー同様、本投稿では、現実的な実装シナリオを重視するよりも、Excel REST API を理解するためになるべくシンプルなコードにすることを心掛けています。例外処理なども含めていませんので、実際にコーディングする際には、あくまでこのコードを参考する形でご検討ください。 Excel REST API は、OneDrive API が前提となります。OneDrive API エンドポイント配下で取得したファイルに対してのみ、Excel REST API は使用できます。Office 365 という前提はありますが、一度慣れてしまえばオートメーションの要件において、OpenXML などのプログラムを実装するよりも開発生産性が高いと思います。 事前準備 以前の投稿をもとに、Azure AD にアプリケーションの登録を完了してください。少なくとも以下の 2 つのデリゲートされたアクセス許可が必要です。 ・Have full access to all files user can access ・Sign users in その上で、クライアント…


Office プロセスを自プログラム専用にすることはできません

こんにちは、Office 開発 サポート チームです。 前回の投稿で Excel のプロセスを統合することについて記載しましたが、今回はこれに関連し、Office オートメーションを行うプログラムを開発するときにプログラムから操作する Office プロセスを自分のプログラム専用にできるか、という話を記載します。   Office オートメーションを行うプログラム開発を行う際、プログラムの処理が行いやすいよう、Office アプリケーションのプロパティを変更したり、画面を非表示にすることがあります。このとき、プログラムから行うプロパティ設定や画面の状態を、ユーザーが開いている他の Office ファイルには反映させたくないといった理由から、「ユーザーが起動する Office とプログラムが起動する Office でプロセスを分けたい」というご相談を頂くことがあります。   結論から申し上げますと、このような動作を完全に実現することはできません。   過去投稿で、Office では起動方法によって、既に起動されたプロセスがある場合には、これを利用して新しいファイルを開く動作となることをご紹介しています。 過去の投稿) タイトル : Excel 2013 からのウィンドウ管理方法変更について – シングル ドキュメント インターフェイス (SDI) アドレス : https://blogs.msdn.microsoft.com/office_client_development_support_blog/2016/12/19/excel2013-changes-to-sdi/ タイトル : Office のプロセス インスタンス制御について アドレス : https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/02/14/office-4/   過去投稿でご案内している Excel の /x コマンドライン スイッチのように、新規プロセスで起動するよう変更できる起動方法もありますが、ショートカットをこのように変更しても、ユーザーが直接 Office…


Excel でブックを開くプロセスを統合するメリット

こんにちは、Office 開発 サポート チームです。 今回は、前回の投稿の 3-1. ブックが開かれるプロセス で説明した動作に関連して、複数のブックを 1 つのプロセスで開くことのメリットについて記載します。 前回の投稿の通り、Excel 2013 以降のバージョンでは Excel 2010 までは新規プロセスを起動していたスタートメニューなどからの起動シナリオで、既存プロセスが使用されるように変更されました。 これは、Excel アプリケーションが MDI から SDI に変更された影響でもありますが、Excel 動作上のメリットもあります。以下に、主なメリットについて、いくつかご案内したいと思います。   目次 1. Excel 機能上のメリット 2. リソース上のメリット 3. プログラム上のメリット   1. Excel 機能上のメリット Excel には、ブックをまたがって実行することができるいくつかの機能がありますが、これらの機能が動作するためには、ブックを開いているプロセスが同じであることが条件となります。Excel 2013 以降のバージョンで新しいブックを開いたときに既存プロセスが利用されるようになると、ユーザーは、現在のブックが開かれているプロセスをこれまでより意識することなく、これらの機能を利用することができます。 以下が、同一プロセス内のブック間で利用できる主な機能です。  外部参照 (リンク) セルに “=[ブック名]シート!セル” のように設定して別ブックのセルに設定された値を参照する機能です。新規作成や、参照先セルの変更に伴って外部参照式が入力されたセルの値を更新するためには、同じプロセスでブックを開く必要があります。 関連情報) タイトル : 外部参照 (リンク) の更新方法を制御する アドレス : https://support.office.com/ja-JP/article/21E995B5-BAB1-4328-8AB3-DD357FE0E653…