チュートリアル: Office のプログラミング (C# および Visual Basic)
Visual Studio 2010 には、Microsoft Office のプログラミングを強化する C# と Visual Basic の新しい機能が導入されました。また、各言語に対して、既に他の言語に存在していた機能が追加されました。
C# の新機能には、名前付き引数とオプション引数、dynamic 型の戻り値、COM プログラミングの ref キーワードを省略する機能、インデックス付きプロパティにアクセスする機能などがあります。Visual Basic の新機能には、自動実装プロパティ、ラムダ式のステートメント、およびコレクション初期化子が含まれています。
この 2 つの言語では、型情報を埋め込むことができます。これにより、プライマリ相互運用機能アセンブリ (PIA: Primary Interop Assemblies) をユーザーのコンピューターに配置しなくても、COM コンポーネントとやり取りするアセンブリを配置できます。詳細については、「チュートリアル: マネージ アセンブリからの型の埋め込み (C# および Visual Basic)」を参照してください。
このチュートリアルでは、Office プログラミングのコンテキストにおける新機能について説明しますが、それらの多くは一般的なプログラミングでも役立ちます。このチュートリアルでは、まず、Excel アドイン アプリケーションを使用して Excel ブックを作成します。さらに、そのブックへのリンクを含む Word 文書を作成します。最後に、PIA の依存関係を有効または無効にする方法について確認します。
必須コンポーネント
このチュートリアルを実行するには、Microsoft Office Excel 2010 または 2007 と、Microsoft Office Word 2010 または 2007 がコンピューターにインストールされている必要があります。
Windows Vista よりも古いオペレーティング システムを使用している場合は、.NET Framework 2.0 がインストールされていることを確認してください。
[!メモ]
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。
Excel アドイン アプリケーションをセットアップするには
Visual Studio を起動します。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[インストールされたテンプレート] ペインで、[Visual Basic] または [Visual C#] を展開し、[Office] を展開して、[2010] (Office 2007 を使用している場合は [2007]) をクリックします。
[テンプレート] ペインで、[Excel 2010 アドイン] (または [Excel 2007 アドイン]) をクリックします。
[テンプレート] ペインの最上部を見て、[ターゲット フレームワーク] ボックスに [.NET Framework 4] が表示されていることを確認します。
必要に応じて、[名前] ボックスにプロジェクトの名前を入力します。
[OK] をクリックします。
ソリューション エクスプローラーに新しいプロジェクトが表示されます。
参照を追加するには
ソリューション エクスプローラーで、プロジェクト名を右クリックし、[参照の追加] をクリックします。[参照の追加] ダイアログ ボックスが表示されます。
[.NET] タブで、[コンポーネント名] ボックスの一覧の [Microsoft.Office.Interop.Excel] (Version 14.0.0.0。Excel 2007 の場合は Version 12.0.0.0) を選択し、Ctrl キーを押しながら [Microsoft.Office.Interop.Word] (Version 14.0.0.0。Word 2007 の場合は Version 12.0.0.0) を選択します。
[OK] をクリックします。
必要な Imports ステートメントまたは using ディレクティブを追加するには
ソリューション エクスプローラーで、ThisAddIn.vb ファイルまたは ThisAddIn.cs ファイルを右クリックし、[コードの表示] をクリックします。
次の Imports ステートメント (Visual Basic) または using ディレクティブ (C#) をコード ファイルの一番上に追加します (まだ追加されていない場合)。
Imports Microsoft.Office.Interop
using System.Collections.Generic; using Excel = Microsoft.Office.Interop.Excel; using Word = Microsoft.Office.Interop.Word;
銀行口座の一覧を作成するには
ソリューション エクスプローラーで、プロジェクトの名前を右クリックし、[追加] をポイントして、[クラス] をクリックします。クラスに Account.vb (Visual Basic を使用している場合) または Account.cs (C# を使用している場合) という名前を付けます。[追加] をクリックします。
Account クラスの定義を次のコードに置き換えます。クラス定義では、Visual Studio 2010 の Visual Basic に新しく追加された自動実装プロパティを使用します。詳細については、「自動実装プロパティ (Visual Basic)」を参照してください。
Public Class Account Property ID As Integer = -1 Property Balance As Double End Class
class Account { public int ID { get; set; } public double Balance { get; set; } }
2 つの口座を含む bankAccounts 一覧を作成するには、ThisAddIn.vb または ThisAddIn.cs で、ThisAddIn_Startup メソッドに次のコードを追加します。一覧の宣言では、Visual Studio 2010 の Visual Basic に新しく追加されたコレクション初期化子を使用します。詳細については、「コレクション初期化子 (Visual Basic)」を参照してください。
Dim bankAccounts As New List(Of Account) From { New Account With { .ID = 345, .Balance = 541.27 }, New Account With { .ID = 123, .Balance = -127.44 } }
var bankAccounts = new List<Account> { new Account { ID = 345, Balance = 541.27 }, new Account { ID = 123, Balance = -127.44 } };
データを Excel にエクスポートするには
同じファイルで、ThisAddIn クラスに次のメソッドを追加します。このメソッドは、Excel ブックを設定して、そこにデータをエクスポートします。
Sub DisplayInExcel(ByVal accounts As IEnumerable(Of Account), ByVal DisplayAction As Action(Of Account, Excel.Range)) With Me.Application ' Add a new Excel workbook. .Workbooks.Add() .Visible = True .Range("A1").Value = "ID" .Range("B1").Value = "Balance" .Range("A2").Select() For Each ac In accounts DisplayAction(ac, .ActiveCell) .ActiveCell.Offset(1, 0).Select() Next ' Copy the results to the Clipboard. .Range("A1:B3").Copy() End With End Sub
void DisplayInExcel(IEnumerable<Account> accounts, Action<Account, Excel.Range> DisplayFunc) { var excelApp = this.Application; // Add a new Excel workbook. excelApp.Workbooks.Add(); excelApp.Visible = true; excelApp.Range["A1"].Value = "ID"; excelApp.Range["B1"].Value = "Balance"; excelApp.Range["A2"].Select(); foreach (var ac in accounts) { DisplayFunc(ac, excelApp.ActiveCell); excelApp.ActiveCell.Offset[1, 0].Select(); } // Copy the results to the Clipboard. excelApp.Range["A1:B3"].Copy(); }
このメソッドでは、C# の 2 つの新機能が使用されています。これらは両方とも Visual Basic には既に用意されている機能です。
Add メソッドには特定のテンプレートを指定する省略可能なパラメーターがあります。Visual C# 2010 の新機能である省略可能なパラメーターでは、パラメーターの既定値を使用する場合、そのパラメーターの引数を省略できます。前の例では引数が渡されないので、Add は既定のテンプレートを使用し、新しいブックを作成します。C# の旧バージョンの同等のステートメントには、プレースホルダー引数 excelApp.Workbooks.Add(Type.Missing) が必要です。
詳細については、「名前付き引数と省略可能な引数 (C# プログラミング ガイド)」を参照してください。
Range オブジェクトの Range プロパティと Offset プロパティでは、インデックス付きプロパティ機能を使用します。この機能により、次の一般的な C# 構文を使用して COM 型からこれらのプロパティを使用できます。また、インデックス付きプロパティによって Range オブジェクトの Value プロパティを使用できるようになります。Value2 プロパティを使用する必要はありません。Value プロパティはインデックス付きですが、インデックスはオプションです。次の例では、オプションの引数とインデックス付きプロパティを同時に使用しています。
// Visual C# 2010 provides indexed properties for COM programming. excelApp.Range["A1"].Value = "ID"; excelApp.ActiveCell.Offset[1, 0].Select();
この言語の旧バージョンでは、次に示す特殊な構文が必要です。
// In Visual C# 2008, you cannot access the Range, Offset, and Value // properties directly. excelApp.get_Range("A1").Value2 = "ID"; excelApp.ActiveCell.get_Offset(1, 0).Select();
独自のインデックス付きプロパティを作成することはできません。この機能でサポートされているのは、既存のインデックス付きプロパティの使用だけです。
詳細については、「方法: COM 相互運用機能を使用したプログラミングでインデックス付きプロパティを使用する (C# プログラミング ガイド)」を参照してください。
DisplayInExcel の最後に次のコードを追加して、内容に合わせて列幅を調整します。
' Add the following two lines at the end of the With statement. .Columns(1).AutoFit() .Columns(2).AutoFit()
excelApp.Columns[1].AutoFit(); excelApp.Columns[2].AutoFit();
これらの操作は、C# 2010 の別の新機能 (Office などの COM ホストから返される Object 値を dynamic 型の値として処理する) を示しています。これは、[相互運用型の埋め込み] が既定値である True に設定されている場合、または同等に、アセンブリが /link コンパイラ オプションによって参照されている場合に自動的に実行されます。dynamic 型では遅延バインディングが許可されています (Visual Basic では既に使用できます)。また、Visual C# 2008 およびこの言語の旧バージョンで必要な明示的なキャストは行われません。
たとえば、excelApp.Columns[1] は Objectを返し、AutoFit は、Excel スコープ のメソッドです。dynamic を指定しない場合は、AutoFit メソッドを呼び出す前に、excelApp.Columns[1] が返すオブジェクトを Range のインスタンスとしてキャストする必要があります。
// Casting is required in Visual C# 2008. ((Excel.Range)excelApp.Columns[1]).AutoFit(); // Casting is not required in Visual C# 2010. excelApp.Columns[1].AutoFit();
相互運用型の埋め込みの詳細については、このトピックに後述する「PIA 参照を検索するには」および「PIA の依存関係を復元するには」の手順を参照してください。dynamic の詳細については、「dynamic (C# リファレンス)」または「dynamic 型の使用 (C# プログラミング ガイド)」を参照してください。
DisplayInExcel を呼び出すには
ThisAddIn_StartUp メソッドの最後に次のコードを追加します。DisplayInExcel の呼び出しには 2 つの引数が含まれています。1 番目の引数は、処理する口座の一覧の名前です。2 番目の引数は、データの処理方法を定義する複数行のラムダ式です。各口座の ID 値と balance 値は隣接するセルに表示されます。残高が 0 未満の場合、行は赤色で表示されます。複数行のラムダ式は、Visual Basic 2010 の新機能です。詳細については、「ラムダ式 (Visual Basic)」を参照してください。
DisplayInExcel(bankAccounts, Sub(account, cell) ' This multiline lambda expression sets custom ' processing rules for the bankAccounts. cell.Value = account.ID cell.Offset(0, 1).Value = account.Balance If account.Balance < 0 Then cell.Interior.Color = RGB(255, 0, 0) cell.Offset(0, 1).Interior.Color = RGB(255, 0, 0) End If End Sub)
DisplayInExcel(bankAccounts, (account, cell) => // This multiline lambda expression sets custom processing rules // for the bankAccounts. { cell.Value = account.ID; cell.Offset[0, 1].Value = account.Balance; if (account.Balance < 0) { cell.Interior.Color = 255; cell.Offset[0, 1].Interior.Color = 255; } });
プログラムを実行するには、F5 キーを押します。口座のデータを含む Excel ワークシートが表示されます。
Word 文書を追加するには
ThisAddIn_StartUp メソッドの最後に次のコードを追加して、Excel ブックへのリンクを含む Word 文書を作成します。
Dim wordApp As New Word.Application wordApp.Visible = True wordApp.Documents.Add() wordApp.Selection.PasteSpecial(Link:=True, DisplayAsIcon:=True)
var wordApp = new Word.Application(); wordApp.Visible = true; wordApp.Documents.Add(); wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
このコードは、C# のいくつかの新機能 (COM プログラミングで ref キーワードを省略する機能、名前付き引数、および省略可能な引数) を示しています。これらは Visual Basic には既に用意されている機能です。PasteSpecial メソッドに省略可能な参照パラメーターで定義された7個のパラメーターがあります。Visual C# 2010 より前のバージョンでは、指定する有効な値がない場合でも、7 つのパラメーターの引数として使用するオブジェクト変数を定義する必要がありました。名前付き引数と省略可能な引数を使用すると、名前によってアクセスするパラメーターを指定し、それらのパラメーターにのみ引数を渡すことができます。この例では、クリップボードのブックへのリンクを作成し (パラメーター Link)、そのリンクを Word 文書にアイコンとして表示する (パラメーター DisplayAsIcon) 必要があることを示すために引数を渡します。また、Visual C# 2010 では、これらの引数の ref キーワードを省略できます。次に示す Visual C# 2008 のコード セグメントを、Visual C# 2010 で必要な 1 行と比較してください。
// Call to PasteSpecial in Visual C# 2008. object iconIndex = Type.Missing; object link = true; object placement = Type.Missing; object displayAsIcon = true; object dataType = Type.Missing; object iconFileName = Type.Missing; object iconLabel = Type.Missing; wordApp.Selection.PasteSpecial(ref iconIndex, ref link, ref placement, ref displayAsIcon, ref dataType, ref iconFileName, ref iconLabel); // Call to PasteSpecial in Visual C# 2010. wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
アプリケーションを実行するには
- F5 キーを押してアプリケーションを実行します。Excel が起動し、bankAccounts の 2 つの口座の情報を含む表が表示されます。次に、その Excel の表へのリンクを含む Word 文書が表示されます。
完成したプロジェクトをクリーンアップするには
- Visual Studio で、[ビルド] メニューの [ソリューションのクリーン] をクリックします。この操作を行わないと、今後もコンピューター上で Excel を起動するたびにアドインが実行されます。
PIA 参照を検索するには
アプリケーションをもう一度実行します。ただし、[ソリューションのクリーン] はクリックしないでください。
[スタート] メニューをクリックし、[すべてのプログラム] をクリックします。次に、[Microsoft Visual Studio 2010]、[Visual Studio Tools]、[Visual Studio コマンド プロンプト (2010)] の順にクリックします。
Visual Studio コマンド プロンプト (2010) ウィンドウに「ildasm」と入力し、Enter キーを押します。IL 逆アセンブラー ウィンドウが表示されます。
IL 逆アセンブラー ウィンドウで、[ファイル] メニューの [開く] をクリックします。[Visual Studio 2010] をダブルクリックし、[プロジェクト] をダブルクリックします。プロジェクトのフォルダーを開き、bin/Debug フォルダーでプロジェクト名.dll を探します。プロジェクト名.dll をダブルクリックします。他のモジュールおよびアセンブリへの参照に加えて、プロジェクトの属性が新しいウィンドウに表示されます。名前空間 Microsoft.Office.Interop.Excel と Microsoft.Office.Interop.Word はアセンブリに含まれています。既定では、Visual Studio 2010 のコンパイラは必要な型を参照先の PIA からアセンブリにインポートします。
詳細については、「方法 : アセンブリの内容を表示する」を参照してください。
マニフェストのアイコンをダブルクリックします。アセンブリの一覧を含むウィンドウが表示されます。これは、プロジェクトで参照される項目を含むアセンブリの一覧です。Microsoft.Office.Interop.Excel と Microsoft.Office.Interop.Word はこの一覧には含まれません。プロジェクトで必要な型はアセンブリにインポートされているので、PIA への参照は不要です。これにより、配置が簡単になります。PIA はユーザーのコンピューターには不要です。アプリケーションでは特定のバージョンの PIA を配置する必要がないため、必要な API がすべてのバージョンに存在する場合は、複数のバージョンの Office で動作するようにアプリケーションをデザインすることができます。
PIA の配置が不要になったため、旧バージョンを含む複数のバージョンの Office で動作するアプリケーションを高度なシナリオで作成できます。ただし、これができるのは、利用している Office のバージョンに対応しない API をコードで使用していない場合のみです。特定の API が旧バージョンに対応していたかどうかは必ずしも明らかではないため、旧バージョンの Office の使用はお勧めしません。
[!メモ]
Office 2003 より前のバージョンでは PIA が発行されていませんでした。そのため、Office 2002 以前のバージョンの相互運用機能アセンブリを生成する唯一の方法は、COM 参照をインポートすることです。
マニフェスト ウィンドウとアセンブリ ウィンドウを閉じます。
PIA の依存関係を復元するには
ソリューション エクスプローラーの [すべてのファイルを表示] をクリックします。[参照設定] フォルダーを展開し、[Microsoft.Office.Interop.Excel] を選択します。F4 キーを押して [プロパティ] ウィンドウを表示します。
プロパティ ウィンドウで、[相互運用型の埋め込み] プロパティを True から False に変更します。
Microsoft.Office.Interop.Word について、この手順の 1. と 2. を繰り返します。
C# では、DisplayInExcel メソッドの最後にある Autofit の 2 つの呼び出しをコメント アウトします。
F5 キーを押して、プロジェクトが正常に実行されることを検証します。
前の手順の 1. ~ 3. を繰り返してアセンブリ ウィンドウを開きます。Microsoft.Office.Interop.Word と Microsoft.Office.Interop.Excel は、埋め込まれたアセンブリの一覧には表示されなくなります。
マニフェストのアイコンをダブルクリックし、参照アセンブリの一覧をスクロールします。Microsoft.Office.Interop.Word と Microsoft.Office.Interop.Excel の両方が一覧に含まれています。アプリケーションは Excel と Word の PIA を参照し、[相互運用型の埋め込み] プロパティは False に設定されるため、両方のアセンブリがエンド ユーザーのコンピューターに存在する必要があります。
Visual Studio で、[ビルド] メニューの [ソリューションのクリーン] をクリックして、完成したプロジェクトをクリーンアップします。
参照
処理手順
方法: COM 相互運用機能を使用したプログラミングでインデックス付きプロパティを使用する (C# プログラミング ガイド)
チュートリアル: Microsoft Office アセンブリからの型情報の埋め込み (C# および Visual Basic)
チュートリアル: マネージ アセンブリからの型の埋め込み (C# および Visual Basic)
チュートリアル : 初めての Excel 用アプリケーション レベルのアドインの作成
関連項目
オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)
概念
名前付き引数と省略可能な引数 (C# プログラミング ガイド)
事前バインディングと遅延バインディング (Visual Basic)