チュートリアル: C# での Office のプログラミング
C# には、Microsoft Office のプログラミングを向上させる機能が用意されています。 便利な C# の機能には、名前付き引数、省略可能な引数、型 dynamic
の戻り値があります。 COM プログラミングでは、ref
キーワードを省略し、インデックス付きプロパティにアクセスできます。
両方の言語で、ユーザーのコンピューターにプライマリ相互運用機能アセンブリ (PIA) を配置せずに COM コンポーネントとやり取りするアセンブリを配置できる型情報を埋め込むことができます。 詳細については、「チュートリアル:マネージド アセンブリからの型の埋め込み」をご覧ください。
このチュートリアルでは、Office プログラミングのコンテキストで機能を示しますが、これらの機能の多くは一般的なプログラミングにも便利です。 このチュートリアルでは、Excel ブックを作成する Excel アドイン アプリケーションを使用します。 次に、ブックへのリンクを含む Word 文書を作成します。 最後に、PIA 依存関係の有効/無効を切り替える方法を確認します。
重要
VSTO (Visual Studio Tools for Office) は、.NET Framework に依存しています。 COM アドインも .NET Framework を使用して記述することができます。 Office アドインは、.NET Core と .NET 5+ (.NET の最新バージョン) では作成できません。 これは、.NET Core と .NET 5+ を .NET Framework と同じプロセスで動作させることができず、アドインの読み込みエラーが発生する可能性があるためです。 引き続き .NET Framework を使用して、Office 用の VSTO アドインと COM アドインを記述できます。 Microsoft が VSTO または COM アドイン プラットフォームを、.NET Core または .NET 5+ を使用するように更新することはありません。 .NET Core と .NET 5+ (ASP.NET Core を含む) を利用して、Office Web アドインのサーバー側を作成できます。
必須コンポーネント
このチュートリアルを実行するには、Microsoft Office Excel と Microsoft Office Word をコンピューターにインストールしておく必要があります。
注意
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「IDE をカスタマイズする」をご覧ください。
Excel アドイン アプリケーションをセットアップする
- Visual Studio を起動します。
- [ファイル] メニューの [新規作成]をポイントし、 [プロジェクト]をクリックします。
- [インストール済みのテンプレート] ペインで、[C#]、[Office] の順に展開してから、Office 製品のバージョン年度を選びます。
- [テンプレート] ペインで、[Excel <バージョン> アドイン] を選びます。
- [テンプレート] ペインの上部で、 [ターゲット フレームワーク] ボックスに [.NET Framework 4] またはそれ以降のバージョンが表示されていることを確認します。
- 必要に応じて、 [名前] ボックスにプロジェクトの名前を入力します。
- [OK] を選択します。
- ソリューション エクスプローラーに新しいプロジェクトが表示されます。
参照の追加
- ソリューション エクスプローラーで、プロジェクトの名前を右クリックし、[参照の追加] を選択します。 [参照の追加] ダイアログ ボックスが表示されます。
- [アセンブリ] タブの [コンポーネント名] 一覧で、Microsoft.Office.Interop.Excel、バージョン
<version>.0.0.0
(Office 製品番号のキーについては、Microsoft バージョンに関するページを参照してください) を選択し、Ctrl キーを押しながら Microsoft.Office.Interop.Word、version <version>.0.0.0
を選択します。 アセンブリが表示されない場合は、それらをインストールすることが必要な場合があります (「方法: Office プライマリ相互運用機能アセンブリをインストールする」を参照)。 - [OK] を選択します。
必要な Imports ステートメントまたは using ディレクティブを追加する
ソリューション エクスプローラーで、ThisAddIn.cs ファイルを右クリックして、[コードの表示] を選びます。 次の using
ディレクティブ (C#) がまだ含まれていない場合は、コード ファイルの先頭に追加します。
using System.Collections.Generic;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
銀行口座のリストを作成する
ソリューション エクスプローラーで、プロジェクトの名前を右クリックし、[追加] を選んでから、[クラス] を選びます。 クラスに Account.cs という名前を付けます。 [追加] を選択します。 Account
クラスの定義を次のコードに置き換えます。 このクラス定義では、自動実装プロパティが使用されます。
class Account
{
public int ID { get; set; }
public double Balance { get; set; }
}
2 つの口座を含む bankAccounts
リストを作成するには、ThisAddIn.cs の ThisAddIn_Startup
メソッドに次のコードを追加します。 一覧の宣言では、コレクション初期化子が使用されます。
var bankAccounts = new List<Account>
{
new Account
{
ID = 345,
Balance = 541.27
},
new Account
{
ID = 123,
Balance = -127.44
}
};
Excel にデータをエクスポートする
同じファイル内で、次のメソッドを ThisAddIn
クラスに追加します。 このメソッドは、Excel ブックを設定し、データを Excel ブックにエクスポートします。
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();
}
- Add メソッドには、特定のテンプレートを指定する省略可能なパラメーターがあります。 省略可能なパラメーターでは、パラメーターの既定値を使用する場合、そのパラメーターの引数を省略することができます。 前の例には引数がないため、
Add
は既定のテンプレートを使って新しいブックを作成します。 以前のバージョンの C# では、同等のステートメントには、プレースホルダーの引数excelApp.Workbooks.Add(Type.Missing)
が必要です。 詳細については、「名前付き引数と省略可能な引数」を参照してください。 - Range オブジェクトの
Range
およびOffset
プロパティではインデックス付きプロパティ機能を使用します。 この機能では、次の一般的な C# 構文を使用して COM 型からこれらのプロパティを使用することができます。 また、インデックス付きプロパティを使用すると、Value
プロパティを使用せずに、Range
オブジェクトのValue2
プロパティを使用できます。Value
プロパティはインデックス付きですが、インデックスはオプションです。 次の例では、省略可能な引数とインデックス付きプロパティは連携しています。
// Visual C# 2010 provides indexed properties for COM programming.
excelApp.Range["A1"].Value = "ID";
excelApp.ActiveCell.Offset[1, 0].Select();
独自のインデックス付きプロパティを作成することはできません。 この機能では、既存のインデックス付きプロパティの使用のみがサポートされます。
次のコードを DisplayInExcel
の末尾に追加して、コンテンツに合わせて列の幅を調整します。
excelApp.Columns[1].AutoFit();
excelApp.Columns[2].AutoFit();
これらの追加機能では、C# の別の機能である、dynamic 型がある場合と同様に Office などの COM ホストから返される Object
値の処理を示します。 相互運用機能型の埋め込みが既定値の True
になっていると、またはそれと同等である EmbedInteropTypes コンパイラ オプションを指定してアセンブリを参照すると、COM オブジェクトは自動的に dynamic
として扱われます。 相互運用機能型の埋め込みの詳細については、この記事で後述する「PIA 参照を検索するには」および「PIA の依存関係を復元するには」の手順を参照してください。 dynamic
の詳細については、「dynamic (C# リファレンス)」または「dynamic 型の使用 (C# プログラミング ガイド)」を参照してください。
DisplayInExcel を呼び出す
ThisAddIn_StartUp
メソッドの末尾に、次のコードを追加します。 DisplayInExcel
に対する呼び出しには、2 つの引数が含まれています。 1 番目の引数は、処理する口座のリストの名前です。 2 番目の引数は、データの処理方法を定義する複数行のラムダ式です。 各口座の ID
値と balance
値が隣接するセルに表示され、残高が 0 より少ない場合、行が赤で表示されます。 詳細については、「ラムダ式」を参照してください。
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 文書を作成します。
var wordApp = new Word.Application();
wordApp.Visible = true;
wordApp.Documents.Add();
wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
このコードでは、次のようないくつかの C# の機能を示します: COM プログラミングで ref
キーワードを省略する機能、名前付き引数、省略可能な引数。PasteSpecial メソッドには 7 つのパラメーターがあり、これらはすべて省略可能な参照パラメーターです。 名前付き引数と省略可能な引数を使用すると、アクセスするパラメーターを名前で指定し、これらのパラメーターにのみ引数を渡すことができます。 この例の引数は、クリップボードのブックへのリンクを作成し (Link
パラメーター)、そのリンクをアイコンとして Word 文書に表示する (DisplayAsIcon
パラメーター) ことを示します。 C# では、これらの引数の ref
キーワードを省略することもできます。
アプリケーションの実行
F5 キーを押してアプリケーションを実行します。 Excel が起動し、bankAccounts
の 2 つの口座からの情報が格納されたテーブルが表示されます。 Excel テーブルへのリンクを含む Word 文書が表示されます。
完成したプロジェクトをクリーンアップする
Visual Studio で、[ビルド] メニューの [ソリューションのクリーン] を選びます。 そうしないと、コンピューターで Excel を開始するたびにアドインが実行されます。
PIA 参照を検索する
- もう一度アプリケーションを実行しますが、[ソリューションのクリーン] は選びません。
- [開始] を選択します。 Microsoft Visual Studio <バージョン> を見つけ、開発者コマンド プロンプトを開きます。
- [Developer Command Prompt for Visual Studio](Visual Studio 用開発者コマンド プロンプト) ウィンドウに「
ildasm
」と入力し、Enter キーを押します。 [IL DASM] ウィンドウが表示されます。 - [IL DASM] ウィンドウの [ファイル] メニューで [ファイル]>[開く] をクリックします。 [Visual Studio <バージョン>] をダブルクリックし、[プロジェクト] をダブルクリックします。 プロジェクトのフォルダーを開き、bin/Debug フォルダーでプロジェクト名.dll を見つけます。 プロジェクト名.dll をダブルクリックします。 新しいウィンドウに、他のモジュールおよびアセンブリへの参照に加えて、プロジェクトの属性が表示されます。 アセンブリには、名前空間
Microsoft.Office.Interop.Excel
とMicrosoft.Office.Interop.Word
が含まれています。 Visual Studio の既定では、コンパイラは、参照 PIA からアセンブリに必要な型をインポートします。 詳細については、「方法:アセンブリの内容を表示する」を参照してください。 - MANIFEST アイコンをダブルクリックします。 プロジェクトによって参照される項目を含んでいるアセンブリの一覧を含むウィンドウが表示されます。
Microsoft.Office.Interop.Excel
とMicrosoft.Office.Interop.Word
はリストに含まれません。 プロジェクトで必要な型をアセンブリにインポートしたため、PIA への参照をインストールする必要はありません。 アセンブリに型をインポートすると、展開が簡単になります。 PIA は、ユーザーのコンピューターに存在する必要はありません。 アプリケーションで、PIA の特定のバージョンを展開する必要はありません。 アプリケーションは、必要な API が存在する Office のすべてのバージョンで動作します。 PIA の配置が不要になったため、以前のバージョンを含む複数のバージョンの Office で動作する高度なシナリオで、アプリケーションを作成できます。 使用している Office のバージョンで使用できない API を、コードで使うことはできません。 特定の API が以前のバージョンで使用できたかどうか、明確ではないことがあります。 以前のバージョンの Office を使うことはお勧めしません。 - マニフェスト ウィンドウとアセンブリ ウィンドウを閉じます。
PIA の依存関係を復元する
- ソリューション エクスプローラーで、[すべてのファイルを表示] ボタンを選びます。 [参照] フォルダーを展開し、 [Microsoft.Office.Interop.Excel] を選択します。 F4 キーを押して [プロパティ] ウィンドウを表示します。
- [プロパティ] ウィンドウで、 [相互運用機能型の埋め込み] プロパティを [True] から [False] に変更します。
Microsoft.Office.Interop.Word
について、この手順の手順 1 と 2 を繰り返します。- C# では、
Autofit
メソッドの最後でDisplayInExcel
への 2 つの呼び出しをコメント化します。 - プロジェクトが正常に実行することを確認するには、F5 キーを押します。
- アセンブリ ウィンドウを開くには、前の手順の手順 1 ~ 3 を繰り返します。
Microsoft.Office.Interop.Word
とMicrosoft.Office.Interop.Excel
は、埋め込まれたアセンブリの一覧には表示されません。 - MANIFEST アイコンをダブルクリックし、参照アセンブリのリストをスクロールします。
Microsoft.Office.Interop.Word
とMicrosoft.Office.Interop.Excel
の両方が一覧に表示されています。 アプリケーションで Excel と Word の PIA が参照され、[相互運用型の埋め込み] プロパティが [False] であるため、両方のアセンブリがエンド ユーザーのコンピューター上に存在する必要があります。 - Visual Studio で、[ビルド] メニューの [ソリューションのクリーン] を選んで、完成したプロジェクトをクリーンアップします。
関連項目
.NET