はじめに
2007年12月に、Visual Studioの最新バージョンであるVisual Studio 2008(以下、VS2008)がリリースされました。従来のVS2005までは、Professional Editionを購入しただけでは、Office開発のための機能は付属しておらず、専用のVisual Studio 2005 Tools for the Office Systemを購入しなければ、.NETでOfficeアプリケーションを開発することができませんでした(Visual Studio 2005 Team Systemシリーズの各製品やMSDN Subscription契約の場合には付属していました)。
一方、VS2008ではProfessional EditionからOfficeカスタムアプリケーション開発を支援するVisual Studio Tools for the Microsoft Office System(以下、VSTO)が付属することとなり、VS2005よりもさらにOfficeカスタムアプリケーション開発が始めやすくなりました。ツールの導入のしやすさはもちろんですが、最新のVSTOではOffice 2007用の開発サポートなどをはじめ、次のリストにあげるようなさまざまな新機能が盛り込まれています。
- the 2007 Microsoft Office System対応のOfficeアプリケーションの作成*
- Word、Excel、PowerPointなどのアプリケーションアドインの作成*
- リボンのカスタマイズ(Office 2007のみ)*
- VBAや他Officeアプリケーションとの相互連携(Office 2007のみ)*
- ClickOnceによるアプリケーションの配布(Office 2007のみ)*
- SharePointワークフローの作成(SharePoint 2007のみ)
- カスタム作業ウィンドウの作成(Office 2007のみ)
- Outlookのための拡張機能(Outlook 2007のみ)
本稿では、上記リストの「*」のついた項目について紹介していきます。
対象読者
- Visual Studio 2008に興味がある方
- .NET Framework 3.5に興味がある方
- Officeアプリケーション開発に興味がある方
必要な環境と準備
Visual Studio 2008入門シリーズ「新しい統合開発環境 Visual Studio 2008 ってなんだ!?」の必要な環境と準備を参考にしてください。
いろいろと比較
VSTOを使ったアプリケーションの作成方法を紹介する前に、いろいろと比較をしてみたいと思います。1つは過去のVSTOとの比較、もう1つはVS2008のマルチターゲッティングを使用した場合の比較です。
過去のVSTOとの比較
VSTOのバージョン1はVS.NET2003にアドインとしてVSTO 2003がリリースされました。以降、VS2005の登場とともにバージョン2のVSTO 2005、the 2007 Microsoft Office System登場時にVSTO 2005に追加の形でVSTO 2005 SEがリリースされています。
今回、VS2008と同時にリリースされたものはバージョン3のVSTO 2008で、バージョンを重ねるごとに対応するOfficeアプリケーションの種類を増やしてきました。Visual Studioの1つ前のバージョンであるVS2005と同時にリリースされたVSTO 2005から今回のVSTO 2008までのそれぞれで、どのような開発種類をサポートしているかを以下の表1に示します。
VSTOバージョン | Officeバージョン | ドキュメントレベル | アプリケーションレベル |
VSTO 2005(v2) | Office 2003 | Excelブック Excelテンプレート Wordドキュメント Wordテンプレート |
Outlookアドイン |
VSTO 2005 SE | Office 2003 | Excelブック Excelテンプレート Wordドキュメント Wordテンプレート InfoPathフォームテンプレート |
Outlookアドイン |
Office 2007 | Excelアドイン Wordアドイン PowerPointアドイン Outlookアドイン Visioアドイン InfoPathアドイン |
||
VSTO 2008(v3) | Office 2003 | Excelブック Excelテンプレート Wordドキュメント Wordテンプレート |
Excelアドイン Wordアドイン PowerPointアドイン Outlookアドイン Visioアドイン Projectアドイン |
Office 2007 | Excelブック Excelテンプレート Wordドキュメント Wordテンプレート InfoPathフォームテンプレート |
Excelアドイン Wordアドイン PowerPointアドイン Outlookアドイン Visioアドイン Projectアドイン |
VSTO 2008ではかなりいろいろな種類の開発をサポートしていることが分かると思います。ドキュメントレベル、アプリケーションレベルの詳細については、後ほど解説します。
.NET Frameworkのバージョンによる比較
VSTO 2008ではさまざまな種類のOfficeカスタムアプリケーションが作成できますが、表1の一覧にあるVSTO 2008の部分はすべて、.NET Framework 3.5で開発することを前提としたものです。試しにVS2008でプロジェクトの種類をOfficeにして新しいプロジェクトを作成しようとしたものが図1です。
図1のように、.NET Frameworkのバージョンとして3.5を選択しているときには、表1のVSTO 2008に示したどおりのOfficeカスタムアプリケーションの開発が可能です。しかし、VS2008のマルチターゲッティング機能を利用して、.NET Framework 2.0(または3.0)にした場合には、図2に示すテンプレートが有効になります。
このように.NET Framework 3.5を選択しているときには、Office 2003/2007用のアプリケーションが作成できますが、.NET Framework 2.0(または3.0)を選択した場合には、Office 2003用のアプリケーションの作成のみになります。この種類はVSTO 2005やVSTO 2005 SEとも異なるものなのでそれぞれの違いには注意してください。
ドキュメントレベルとアプリケーションレベル
VSTO 2008というよりもVSTOにおける用語の確認です。先述したドキュメントレベル、アプリケーションレベルという言葉の指すものを説明します。これらについて、すでにご存じの場合にはこの部分は読み飛ばしてしまって構いません。
表1の中でも出てきましたが、VSTOを利用したOfficeカスタムアプリケーションを作成する場合、その形態により呼び名の違う2つの形式のアプリケーションを作成できます。この2種類がそれぞれドキュメントレベル、アプリケーションレベルと言われる開発手法になります。
ドキュメントレベル
ドキュメントレベル(正確にはドキュメントレベルのカスタマイズと言われます)は、WordやExcelなどの特定の文書やテンプレートに関連付けられるアプリケーションの形態のことを指します。ExcelなどでVBAを使ったアプリケーションを作ることは多いと思いますが、ちょうどそれと似たような位置づけのものです。開発したカスタムアプリケーションはドキュメントに関連づくため、対象のドキュメントが開いているときにのみ使用できます。
一方で、アプリケーション用にドキュメントの体裁を作成してしまうことができます。例えば注文書のひな形をExcelで作成し、ドロップダウンやボタンなどをWindowsフォームのコントロールで構成するといったことが可能です。このため、ドキュメントの見た目からその入力支援やバックエンド処理までの一連のプロセスをまとめて行いたいような場合に利用する形式となります。
アプリケーションレベル
アプリケーションレベル(正確にはアプリケーションレベルのアドインと言われます)は、WordやExcelなどのOfficeアプリケーションそのものに関連付けられるアプリケーション形態のことを指します。開発したカスタムアプリケーションはアプリケーションに関連づくため、Officeアプリケーションを起動したときに有効になり、どんなドキュメントが開かれているかに関わらず利用できます。
Office 2007用に、PDFやXPSの保存ができるようになるアドイン(2007 Microsoft Office プログラム用 Microsoft PDF/XPS 保存アドイン参照)が提供されていますが、このように特定の文書ではなく、アプリケーションそのものに追加の機能を提供する位置づけのものです。
ドキュメントレベル、アプリケーションレベルの選択は基本的にはその用途によって使い分けるべきですが、VSTOを利用してこれらの開発を行う場合には、それぞれの選択によって利用できない機能などがでてきます。
例えば、アプリケーションレベルのアドインではカスタム作業ウィンドウを作成できますが、ドキュメントレベルのカスタマイズでは作業ウィンドウの1つである「ドキュメントアクション」と呼ばれるウィンドウのみを変更することができます。これらの詳細についてはMSDNライブラリのアプリケーションおよびプロジェクトの種類別の使用可能な機能を参照してください。
アプリケーションの作成 1
だいぶ前置きが長くなりましたが、ここからは実際にサンプルのアプリケーションを作成する過程を通してVSTOの機能を見ていきます。
ドキュメントレベルのカスタマイズアプリケーションの作成
ドキュメントレベルのカスタマイズアプリケーションを作成するには、VS2008の新規プロジェクトの作成で図1のようにOfficeを選択し、ここからExcel 2007 ブックなどアドインではないテンプレートを選択します。次にVSTOプロジェクトウィザードでひな形にする文書を選択します。
Excelで新規の場合には図4に示す4種類の形式から選択できます。既存のドキュメントを選択する場合でも図4に示す4種類の拡張子のファイルを元にすることができます。
- *.xlsx
- *.xlsm
- *.xlsb
プロジェクトを作成すると以下のようなコードが生成されます(Excel 2007 ブックをC#で作成した場合のThisWorkbook.csクラスの初期コード)。
namespace ExcelWorkbook1 { public partial class ThisWorkbook { private void ThisWorkbook_Startup(object sender, System.EventArgs e) { } private void ThisWorkbook_Shutdown(object sender, System.EventArgs e) { } //VSTO で生成されたコード } }
VBAのコードを記述したことがある方であれば、StartupやShutdownなどにはなじみがあるかと思います。他にもVBAのときに利用できていたイベントのほとんどが利用可能です。
この方法により作成されたExcelシートに対して、コントロールなどを配置し、レイアウトしたものが図3に示すようなものになります。Excelシート上に張り付けたボタンなどはWindowsアプリケーション開発時と同様にダブルクリックすることでデフォルトイベントをコード内に実装できます。
本稿のサンプルとして付けている「DocumentLevel.zip」はこれらの手順を一通り終えた後のものになります(もっともサンプルですのでイベントハンドラの中身はまったく無意味です)。サンプルを実行すると注文票(のようなもの)がデザインされたExcelが立ち上がり、ボタンクリックや数量の変更イベントに応じたアクションが実行されます。
アプリケーションレベルのアドインアプリケーションの作成
アプリケーションレベルのアドインを作成するには、VS2008の新規プロジェクトの作成で図1のようにOfficeを選択し、ここから「Excel 2007 アドイン」など、最後に「アドイン」とつくテンプレートを選択します。ドキュメントレベルのカスタマイズとは違い、アプリケーションレベルのアドインプロジェクトの場合にはウィザードなどは無く、プロジェクトの作成が完了します。この状態ではUIにかかわる部分などもなくThisAddinクラスが生成されるだけです。
public partial class ThisAddIn { private void ThisAddIn_Startup(object sender, System.EventArgs e) { } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } //VSTO で生成されたコード }
StartupやShutdownなどのイベントがある点はドキュメントレベルで作成した場合と変わりませんが、こちらはOfficeアプリケーションの開始、終了に反応するイベントです。アプリケーションレベルの場合には、他にさまざまなイベントがあるわけではなく、Officeアプリケーションのメニューや作業ウィンドウを独自に定義して、それらから発生するイベントを処理するというのが一般的な形になります。
リボンの開発
VSTO 2008では、Office 2007から新しく導入されたリボンの開発を行うことができます。リボンはドキュメントレベルのカスタマイズでも、アプリケーションレベルのアドインでも作成できます。実際にリボンのデザインを行うためにはプロジェクトの「新しい項目の追加」でリボン(ビジュアルデザイナ)を選択します。
新しい項目を追加すると、図6のようなリボンのデザイン画面が開きます。
リボンにはWindowsフォームの一般的なコントロールではなく、リボン用のOfficeリボンコントロールを配置します。利用するコントロールは異なりますが、デザイナ上にドラッグ&ドロップでコントロールを配置し、コントロールをダブルクリックするなどしてイベントハンドラを作成して、処理を記述するという方法は変わりません。なお、Windowsフォームのボタンなどのコントロールは利用できませんがFileOpenDialogなどコンポーネントは利用できますので適宜活用してください。
先ほど選んだリボン(ビジュアルデザイナ)を利用すると簡単にリボンのUIをデザインできますが、より高度なリボンの処理をしたい場合には、図5の状態でリボン(XML)を選択する必要があります。そうすることによってリボンのデザイン以外にも、以下に示すようなより高度な処理を行うことができるようになります。
- カスタムタブ(アドインと表示されるタブなど)に他のタブのグループを表示する
- リボンコントロールの既存の処理をオーバーライドする
- クイックアクセスツールバーの表示項目をカスタマイズする
- アドイン間でリボンを共有する
すでにリボン(ビジュアルデザイナ)によって作成済みのリボンがある場合には、リボンのデザイナ画面を右クリックして[リボンをXMLにエクスポート]とすることによってもリボンのXML定義を出力できます。
本稿で提供している「ApplicationLevel.zip」は、Excel 2007用のアプリケーションレベルのアドインを作成し、カスタムのリボンを追加して、リボン内のボタンが押されたときのイベントハンドラを処理するまでのサンプルを示したものです。
サンプルを実行するとリボンのタブに「アドイン」が追加され、そこにgroup1およびbutton1が表示されます。button1のClickイベントがRibbon1.csに実装されているため、button1をクリックするとメッセージが表示されます。
アプリケーションの作成 2
.NETマネージクラスのVBAへの公開
Word 2007またはExcel 2007のドキュメントレベルのカスタマイズを作成する場合、.NETで作成したマネージクラスをVBAに対して公開できます。この機能を利用することによって、VBAで作成されている既存のアプリケーションの一部を.NETで機能拡張することができます。また、基本的な部分を.NETで作成しておいて一部をユーザーがカスタマイズ可能なものとしてVBA部分に公開するといった利用方法にすることもできます。
他にも、基本的にはVBAで作成しておき、Webサービス連携やWPF/WCFなどの新しいユーザーエクスペリエンス・ワークフローを実現する機能のうち、使いたい部分だけを.NETで作成するといった使い道など、さまざまな方法を考えることができます。
相互運用用のプロジェクトの作成
さて、実際に利用するまでの手順ですが、1番重要なことはプロジェクトを作成するときの設定にあります。例えば、Excelブックのプロジェクトの場合はドキュメントの形式として「Excelマクロ有効ブック(*.xlsm)」を選択します。
既存のドキュメントをコピーする場合でも、*.xlsmファイルをコピー元に選択する必要があります。Wordの場合も同様に、マクロをサポートする文書をもとにプロジェクトを作成しておく必要があります。マクロをサポートしない文書などの場合、以降で説明する内容ができないので注意してください。
Officeのセキュリティ設定の変更
プロジェクトの作成が終わったら、今後の作業のためにプロジェクトを作成したフォルダ(サブフォルダを含む)を、Officeアプリケーションの信頼できる場所として登録する必要があります。これにはExcelなどのオプションのセキュリティセンターから設定するのが最も簡単です。
この設定をしておかないと、VBAとの連携の設定やその後のテストがうまくいかない場合があるので注意してください。具体的な方法についてはMSDNライブラリのチュートリアル : VBA から Visual Basic プロジェクトのコードを呼び出すの「文書の場所に対する信頼の付与」を参照してください。
VBAマクロの追加
セキュリティ設定が終了したら、作成したプロジェクトのWordやExcelファイルにVBAマクロを追加してください。ドキュメントにマクロプロジェクトが存在していることが重要なため、マクロの内容はなんでも構いません。
すでにVBAマクロを含んだ既存のドキュメントをベースにしている場合にはこの手順は必要ありません。この手順を実施しておかないと最終的にエラーになってしまうため注意してください。
VBA公開用クラスの作成
一通りの設定が完了したら、VBAに公開するクラスを作成します。作成するものはどんなものでも構いませんが、以下の2つのポイントがあります。
- Publicクラスであること
- 2つの属性をクラスに設定すること
また、C#で作成する場合にはCOMに公開する用のパブリックインターフェースの定義も必須となります。VB.NETの場合にはクラスに対して「Microsoft.VisualBasic.ComClass(True)」という属性を付与することで省略可能です。
これらを満たすサンプルのクラスは以下のようなものになります。上記に挙げた2つの属性として、インターフェースには「ComVisibleAttribute」を、クラスには「[ComVisible」と「ClassInterfaceAttribute」を追加しています。これらの属性はCOM相互連携をするときによく使われる属性で、VBAとの連携の際にも変わらず必要となります。おまじないのようなものですので、そのままの形で記憶してしまうと楽です。
using System.Runtime.InteropServices; namespace ExcelWorkbook1 { [ComVisible(true)] public interface IClass1 { void Test(); } [ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] public class Class1 : IClass1 { public void Test() { System.Windows.Forms.MessageBox.Show("Hello World!"); } } }
クラスの作成が終了したら、ホスト項目に公開用の処理を記述します。ここでホスト項目とは、Excelの場合はSheet1やSheet2やThisWorkbook、Wordの場合はThisDocumentになります。このクラスのコードエディタを開き、以下のコードを追加します。
protected override object GetAutomationObject() { return new Class1(); }
なお、VB.NETでExcelブックなどのプロジェクトを作成した場合、ThisWorkbookクラス以外にはすでにGetAutomationObjectメソッドが実装されている(Designerクラスにホスト項目自身を返却する実装があります)ので注意してください。
VBA公開用のプロジェクトの設定
最後に、GetAutomationObjectメソッドを実装したホスト項目のプロパティ設定を変更します。ホスト項目のデザイナを開き、続けてプロパティウィンドウからC#の場合は「ReferenceAssemblyFromVbaProject」をtrueに、VB.NETの場合は「EnableVbaCollers」をTrueに設定します(VB.NETの場合、EnableVbaCollersプロパティをTrueに設定した段階で、ReferenceAssemblyFromVbaProjectプロパティもTrueに設定されます)。
これら一連の設定と作業により、ExcelブックなどのマクロプロジェクトにはVSTO側からGetManagedClassメソッドが公開されます。このメソッドの引数にホスト項目と同じVBAのオブジェクトを渡すことでGetAutomationObjectメソッドの戻り値のオブジェクトを取得できます。このオブジェクトを通して.NETで作成したメソッドなどにアクセスでき、これによって相互運用を実現しています。
本稿で提供している「ReferenceVBA.zip」は、VBAとの相互連携に必要な一連の手順を実装したものになります。zipを展開し、「ReferenceVBA\ExcelWorkBook2\bin\Debug」の中にある「ExcelWorkbook2.xlsm」を実行します(場合によってはマクロの有効化が必要です)。Visual Basicマクロを起動し、図11にある「TestVBA」関数のようなVBAコードを記述すると、図11右側にあるメッセージダイアログが表示されます。
また、方法は異なりますが、アプリケーションレベルのアドインの場合でも、VBAに対してマネージクラスを公開する方法が用意されています。こちらについてはMSDNライブラリのチュートリアル : アプリケーション レベルのアドインのコードを VBA から呼び出すを参照してください。さらに、マネージコードからVBAを呼び出す手立ても用意されています。こちらについてはMSDNライブラリのVBA とドキュメント レベルのカスタマイズの結合を参照してください。
ClickOnceによる配布
ClickOnceによるOfficeカスタムアプリケーションの配布はVSTO 2008の目玉機能の1つです。従来、Officeカスタムアプリケーションを配布する際には、配布するクライアントにセキュリティ設定の変更が必要であるということが大きな問題となっていました。しかし、VSTO 2008でClickOnceによる配布に対応したことで、この問題がクリアになりました。
ClickOnceによる配布は通常のWindowsアプリケーションとほぼ同様で、最も単純な方法は、VS2008でOfficeカスタムアプリケーションのプロジェクトを右クリックして発行するだけです。
発行を選択すると発行ウィザードが起動するので、ウィザードに従ってOfficeカスタムアプリケーション一式を配置する場所の入力などを行えば、コンパイルから配置までが完了します。
VSTO 2008を利用したアプリケーションを利用するためには、VSTO Runtimeや.NET Framework 3.5などがインストールされている必要がありますが、これらもOfficeカスタムアプリケーションの必須コンポートとして設定しておくだけで、アプリケーションのインストール時に自動的にインストールされます。これらの設定を行うにはプロジェクトのプロパティから[発行]タブを選択し、必須コンポーネントボタンを押します。
必須コンポーネントのダイアログを開くと、アプリケーションのために必要なランタイムを選択できます。VSTOのプロジェクトでは標準状態で以下の3つが必須コンポーネントとして設定されています。
- Windows インストーラ 3.1
- .NET Framework 3.5
- Visual Studio Tools for the Office system 3.0 Runtime
なお、[発行]の設定画面では他にもアプリケーションの更新間隔の設定や図13で入力したインストール場所の事前設定などの各種設定を行うことができるようになっています。
まとめ
VSTOを利用してできることからVSTO 2008の機能など多岐にわたり、すべてを紹介することはできませんでしたが、Officeをフロントエンドにしてアプリケーションを開発するという点について興味を持っていただくことができれば幸いです。
CodeZine内にはVSTO 2008を扱った記事としてVSTOでExcel 2007のカスタムリボンを作成するという記事も公開されています。このような記事も参考にぜひVSTO 2008での開発を試してみてください。
さて、次回はVisual Studio 2008入門の最終回です。最後はバージョン2となって進化を果たしたVisual Studio Team System 2008について紹介しますのでお楽しみに。