特集
.NET言語による次世代Officeソリューションの開発

4. VSTOのコードとプログラミング

デジタルアドバンテージ 一色 政彦
2003/12/17

Page1 Page2 Page3 Page4

 まずは先頭のImportステートメント(C#では、usingディレクティブ)のコードを見てみよう。

Imports Office = Microsoft.Office.Core
Imports Excel = Microsoft.Office.Interop.Excel
Imports MSForms = Microsoft.Vbe.Interop.Forms

 Importsステートメントは名前空間に含まれるクラスへのアクセスを有効にするためのものだ。この例では、「インポート・エイリアス(C#では、エイリアス・ディレクティブ)」という機能が使われている。ここでエイリアス(別名)が使用されている理由は、クラスの名前が重複するのを防ぐためである。例えば、.NET Frameworkの「System.Windows.Forms」名前空間と、Office COMアドインAPIの「Microsoft.Vbe.Interop.Forms」パッケージのそれぞれには、ComboBoxクラスとListBoxクラスという同名のクラスが存在している。このため、「Microsoft.Vbe.Interop.Forms」パッケージに対し「MSForms」という別名を設定することで、「MSForms.ComboBox」のように呼び出すことができるようになり、System.Windows.Forms名前空間のComboBoxクラスと重複しないようになる。このように、VSTOの開発では、Office COMに対しエイリアスを指定した方が効率のよい開発ができる。

 なお、ここでインポートされているパッケージは、すべてOffice 2003のPIAを参照している。「Microsoft.Office.Core」はOffice全体における共有機能を提供する「Microsoft Office 11.0 Object Library PIA(office.dll)」を参照し、「Microsoft.Office.Interop.Excel」はExcelアプリケーションの「Microsoft Excel 11 PIA(microsoft.office.interop.excel.dll)」を、「Microsoft.Vbe.Interop.Forms」はVBAコントロールを扱う「Microsoft Forms 2.0 PIA(microsoft.vbe.interop.forms.dll)」を参照している。

 それでは次のコードに移ろう。続くコードは、Office用のアセンブリ属性の指定である。

<Assembly: System.ComponentModel.DescriptionAttribute("OfficeStartupClass, Version=1.0, Class=ExcelProject1.OfficeCodeBehind")>

 この例では、アセンブリにおける属性の記述(System.ComponentModel.DescriptionAttribute)として、次の値を指定している。

  • アセンブリ属性の種類=「OfficeStartupClass(Officeのスタートアップ・クラス)」
  • VSTOのバージョン=「1.0」
  • クラス完全限定名=「ExcelProject1.OfficeCodeBehind」クラス

 さらに次のコードで、アセンブリ属性で指定したスタートアップ・クラスの「OfficeCodeBehind」クラス(ExcelProject1名前空間)が生成されている。このクラスでは、既定(デフォルト)のコンストラクタのほか、次の5つのメソッドが追加されている。
 
(1)_Startup(ByVal application As Object, ByVal workbook As Object)
(2)_Shutdown()
(3)FindControl(ByVal name As String) As Object
   FindControl(ByVal name As String, ByVal sheet As Excel.Worksheet) As Object
(4)ThisWorkbook_Open() Handles ThisWorkbook.Open
(5)ThisWorkbook_BeforeClose(ByRef Cancel As Boolean) Handles ThisWorkbook.BeforeClose

 これらのメソッドについて解説しよう。

 まず、(1)の_Startupメソッドは.NETアセンブリをロードするときにホスト・アプリケーション(Word/Excel)から呼び出される。(2)の_Shutdownメソッドは.NETアセンブリのアンロード時に呼び出される。よって、_StartupメソッドではVSTOプロジェクト全体にかかわる初期化処理を行い、_ShutdownメソッドではVSTOプロジェクト全体にかかわる終了処理を行うとよい。

 次に、(3)のFindControlメソッドは、Officeドキュメント上に配置したVBAコントロールをハンドルするのに使用する。このメソッドでVBAコントロールの配置、プロパティ設定、メソッド実行などを行うことができる。また、このメソッドでVBAコントロールのイベント・ハンドラの実装も行うことができる。FindControlメソッドは2つあるが、実際の処理は2つのパラメータを取る2番目のオーバーロード・メソッドが行っている。

 最後に、(4)ThisWorkbook_Openメソッド(Excel.WorkbookクラスのOpenイベントのハンドラ)はExcelワークブックが開かれるときに呼び出され、(5)のThisWorkbook_BeforeCloseメソッド(Excel.WorkbookクラスのBeforeCloseイベントのハンドラ)はExcelワークブックを閉じられるときに呼び出されるメソッドである。Excelアプリケーションを起動させたまま、Excelワークブックを閉じたり開いたりすることもあるので、必ずしも上記の(1)の_Startupメソッドや(2)の_Shutdownメソッドと同じように呼び出されるとは限らないので、注意が必要である。

 なお今回のように、プロジェクト・テンプレートがExcelワークブックの場合は、上述のようにExcel.Workbookクラスのイベントをハンドルするが、WordドキュメントやWordテンプレートの場合はWord.DocumentクラスのOpenイベントやCloseイベントなどをハンドルする。

 それでは、ExcelワークブックにおけるVSTOソリューションの初歩的な開発について見ていこう。

Excelワークブックのセルへの書き込み

 以下は、Excelワークブックのセルへの書き込みの実装例だ。

' ワークブックが開かれたときに呼び出されます。
Private Sub ThisWorkbook_Open() Handles ThisWorkbook.Open
  Dim Sheet1 As Excel.Worksheet = ThisWorkbook.Sheets.Item(1) 
  Sheet1.Cells(1, 1).Value = "Hello World!" 
End Sub
Excelのセルへの書き込みのサンプル・コード(VB.NET版:writecell.vbC#版:writecell.cs

 ここでは、前述したExcel.WorkbookクラスのOpenイベントのハンドラであるThisWorkbook_Openメソッドで、セルへの書き込みを実装している。まず、のコードでExcelワークブックの最初のシートを取得して、のコードで1行1列目のセルの値に「Hello World!」を代入している。

 プロジェクト・ウィザードによって自動生成されるThisWorkbook_Openイベント・ハンドラに上記のコードを追加してソリューションをビルドし、Microsoft Officeプロジェクト・ウィザードで指定したフォルダ(デフォルトの設定ではプロジェクトのフォルダ)に出力されるXLS(Excelワークシート)ファイルを開けば、左上隅のセルに「Hello World!」が表示されるはずだ。

Excelのセルへの書き込みのサンプル実行例
XLS(Excelワークシート)ファイルを開いたところ。VSTOソリューションをビルドした後、XLSファイルを実行すれば、前述した「VSTOソリューション実行の仕組み」に沿ってVSTOソリューションがロードされ、プログラム・コードが実行される。この例では、上記のサンプル・コードが実行されて、「Hello World!」という文字列が1行1列目に表示されている。

 このサンプル・コードを含むVS.NET 2003のプロジェクトを用意した。また、参照用にVS.NET2002版も用意した。このサンプル・プロジェクトでは、今回の解説では割愛した「メニュー作成」や「チャート作成」などのサンプル・コードも含まれている。ただし、当然ながらOffice 2003やVSTO、VS.NET 2003がインストールされていない環境では、正常に実行できない。このVSTOサンプル・プロジェクトは以下からダウンロードできる。

  • Visual Studio .NET 2003 VB.NET / C# 
  • Visual Studio .NET 2002 VB.NET / C# 

 ここではVSTOの開発について、ほんの触りの部分しか解説できなかったが、より詳しい情報はMSDNサイトの「Visual Studio Tools for Office開発情報」を参照されたい。また、Excelのオブジェクトの詳細については、「.NET 開発者の観点から捉えた Excel オブジェクト モデル」を、Wordのオブジェクトに関しては「.NET 開発者の観点から捉えた Word オブジェクト モデル」を参照していただきたい。

 以上、VSTOのメリットや実行の仕組み、VSTOプロジェクトの初期コードと簡単な実装例について見てきた。VSTOの開発のイメージをつかんでいただけただろうか。本稿が、Officeドキュメントをフロントエンドにした業務アプリケーションを構築する際の始めの1歩になれれば幸いである。

 今回のVSTOでは、主にVB.NETのコードで紹介したが、片やC#でのOfficeプログラミングはまだまだ発展途上にあるといえる。将来、コード名「Office for Longhorn」で知られる次期Officeでは、完全に.NET Frameworkマネージド・コードに移行するという話がある。これが実現すれば、C#によるOffice開発がもっと快適になるだろう。C#ファンの筆者としてはそれに期待したい。End of Article

 

 INDEX
  [特集].NET言語による次世代Officeソリューションの開発
     1.VSTOソリューションとは
     2.VSTOソリューションのメリットと実行の仕組み
     3.VSTOソリューションの開発
   4.VSTOのコードとプログラミング
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間