チュートリアル: Office のプログラミング (C# および Visual Basic)

Visual Studio には、Microsoft Office のプログラミングを改善する C# および Visual Basic の新機能が導入されています。 便利な C# の機能には、名前付き引数、省略可能な引数、型 dynamic の戻り値があります。 COM プログラミングでは、ref キーワードを省略し、インデックス付きプロパティにアクセスできます。 Visual Basic の機能には、自動実装プロパティ、ラムダ式内のステートメント、コレクション初期化子などがあります。

両方の言語で、ユーザーのコンピューターにプライマリ相互運用機能アセンブリ (PIA) を配置せずに COM コンポーネントとやり取りするアセンブリを配置できる型情報を埋め込むことができます。 詳細については、「チュートリアル:マネージド アセンブリからの型の埋め込み」をご覧ください。

このチュートリアルでは、Office プログラミングのコンテキストで機能を示しますが、これらの機能の多くは一般的なプログラミングにも便利です。 このチュートリアルでは、Excel ブックを作成する Excel アドイン アプリケーションを使用します。 次に、ブックへのリンクを含む Word 文書を作成します。 最後に、PIA 依存関係の有効/無効を切り替える方法を確認します。

必須コンポーネント

このチュートリアルを実行するには、Microsoft Office Excel と Microsoft Office Word をコンピューターにインストールしておく必要があります。

注意

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「IDE をカスタマイズする」をご覧ください。

Excel アドイン アプリケーションをセットアップするには

  1. Visual Studio を起動します。

  2. [ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。

  3. [インストールされたテンプレート] ペインで、 [Visual Basic] または [Visual C#] を展開し、 [Office] を展開して、Office 製品のバージョン年度をクリックします。

  4. [テンプレート] ペインで、[Excel <バージョン> アドイン] をクリックします。

  5. [テンプレート] ペインの上部で、 [ターゲット フレームワーク] ボックスに [.NET Framework 4] またはそれ以降のバージョンが表示されていることを確認します。

  6. 必要に応じて、 [名前] ボックスにプロジェクトの名前を入力します。

  7. [OK] をクリックします。

  8. ソリューション エクスプローラーに新しいプロジェクトが表示されます。

参照を追加するには

  1. ソリューション エクスプローラーで、プロジェクトの名前を右クリックし、 [参照の追加] をクリックします。 [参照の追加] ダイアログ ボックスが表示されます。

  2. [アセンブリ] タブの [コンポーネント名] 一覧で、Microsoft.Office.Interop.Excel、バージョン <version>.0.0.0 (Office 製品番号のキーについては、Microsoft バージョンに関するページを参照してください) を選択し、Ctrl キーを押しながら Microsoft.Office.Interop.Wordversion <version>.0.0.0 を選択します。 アセンブリが表示されない場合は、アセンブリがインストールされ、表示されることの確認が必要になることがあります (「方法: Office のプライマリ相互運用機能アセンブリをインストールする」を参照)。

  3. [OK] をクリックします。

必要な Imports ステートメントまたはディレクティブの使用を追加するには

  1. ソリューション エクスプローラーで、 [ThisAddIn.vb] または [ThisAddIn.cs] ファイルを右クリックし、 [コードの表示] をクリックします。

  2. 次の Imports ステートメント (Visual Basic) または using ディレクティブ (C#) が含まれていない場合は、コード ファイルの先頭に追加します。

    using System.Collections.Generic;
    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    
    Imports Microsoft.Office.Interop
    

銀行口座の一覧を作成するには

  1. ソリューション エクスプローラーで、プロジェクト名を右クリックし、 [追加] をクリックしてから [クラス] をクリックします。 Visual Basic を使用している場合は Account.vb、C# を使用している場合は Account.cs という名前をクラスに付けます。 [追加] をクリックします。

  2. Account クラスの定義を次のコードに置き換えます。 このクラス定義では、自動実装プロパティが使用されます。 詳細については、「自動実装プロパティ」を参照してください。

    class Account
    {
        public int ID { get; set; }
        public double Balance { get; set; }
    }
    
    Public Class Account
        Property ID As Integer = -1
        Property Balance As Double
    End Class
    
  3. 2 つの口座を含む bankAccounts 一覧を作成するには、次のコードを追加する、ThisAddIn.vb または ThisAddIn.csThisAddIn_Startup メソッドに追加します。 一覧の宣言では、コレクション初期化子が使用されます。 詳細については、「コレクション初期化子」を参照してください。

    var bankAccounts = new List<Account>
    {
        new Account
        {
            ID = 345,
            Balance = 541.27
        },
        new Account
        {
            ID = 123,
            Balance = -127.44
        }
    };
    
    Dim bankAccounts As New List(Of Account) From {
        New Account With {
                              .ID = 345,
                              .Balance = 541.27
                         },
        New Account With {
                              .ID = 123,
                              .Balance = -127.44
                         }
        }
    

データを Excel にエクスポートするには

  1. 同じファイル内で、次のメソッドを 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();
    }
    
    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
    

    C# の 2 つの新しい機能は、このメソッドで使用されます。 これら両方の機能は、Visual Basic で既に存在します。

    • 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();
      

      以前のバージョンの言語では、次の特殊な構文が必要です。

      // 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 相互運用機能を使用したプログラミングでインデックス付きプロパティを使用する方法」を参照してください。

  2. 次のコードを DisplayInExcel の末尾に追加して、コンテンツに合わせて列の幅を調整します。

    excelApp.Columns[1].AutoFit();
    excelApp.Columns[2].AutoFit();
    
    ' Add the following two lines at the end of the With statement.
    .Columns(1).AutoFit()
    .Columns(2).AutoFit()
    

    これらの追加機能では、C# の別の機能である、dynamic 型がある場合と同様に Office などの COM ホストから返される Object 値の処理を示します。 これは、 [相互運用機能型の埋め込み] が既定値の True に設定されている場合、または同様に、アセンブリが EmbedInteropTypes コンパイラ オプションによって参照されている場合に発生します。

    たとえば、excelApp.Columns[1]Object を返し、AutoFit は Excel の Range メソッドであるとします。 dynamic がない場合、excelApp.Columns[1] のインスタンスとして、Range によって返されたオブジェクトをキャストしてから、AutoFit メソッドを呼び出す必要があります。

    // 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 を起動するには

  1. ThisAddIn_StartUp メソッドの末尾に、次のコードを追加します。 DisplayInExcel に対する呼び出しには、2 つの引数が含まれています。 最初の引数は、処理する口座の一覧の名前です。 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;
        }
    });
    
    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)
    
  2. プログラムを実行するには、F5 キーを押します。 口座からのデータを含む Excel ワークシートが表示されます。

Word 文書を追加するには

  1. ThisAddIn_StartUp メソッドの末尾に次のコードを追加して、Excel ブックへのリンクを含む Word 文書を作成します。

    var wordApp = new Word.Application();
    wordApp.Visible = true;
    wordApp.Documents.Add();
    wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
    
    Dim wordApp As New Word.Application
    wordApp.Visible = True
    wordApp.Documents.Add()
    wordApp.Selection.PasteSpecial(Link:=True, DisplayAsIcon:=True)
    

    このコードは、COM プログラミングで ref キーワードを省略する機能、名前付き引数、省略可能な引数など、C# の新機能のいくつかを示します。 Visual Basic でこれらの機能は既に存在します。 PasteSpecial メソッドには 7 つのパラメーターがあります。これらはすべて省略可能な参照パラメーターとして定義されます。 名前付き引数と省略可能な引数を使用すると、アクセスするパラメーターを名前で指定し、これらのパラメーターにのみ引数を渡すことができます。 この例では、引数は、クリップボードのブックへのリンクを作成する必要があること (Link パラメーター)、およびリンクがアイコンとして Word 文書に表示されること (DisplayAsIcon パラメーター) を示すために渡されます。 Visual C# では、これらの引数の ref キーワードを省略することもできます。

アプリケーションを実行するには

  1. F5 キーを押してアプリケーションを実行します。 Excel が起動し、bankAccounts の 2 つの口座からの情報が格納されたテーブルが表示されます。 Excel テーブルへのリンクを含む Word 文書が表示されます。

完成したプロジェクトをクリーンアップするには

  1. Visual Studio で、 [ビルド] メニューの [ソリューションのクリーン] をクリックします。 それ以外の場合は、コンピューターで Excel を起動するたびにアドインが実行されます。

PIA 参照を検索するには

  1. もう一度アプリケーションを実行しますが、 [ソリューションのクリーン] はクリックしません。

  2. [開始] を選択します。 Microsoft Visual Studio <バージョン> を見つけ、開発者コマンド プロンプトを開きます。

  3. [Developer Command Prompt for Visual Studio](Visual Studio 用開発者コマンド プロンプト) ウィンドウに「ildasm」と入力し、Enter キーを押します。 [IL DASM] ウィンドウが表示されます。

  4. [IL DASM] ウィンドウの [ファイル] メニューで [ファイル]>[開く] をクリックします。 [Visual Studio <バージョン>] をダブルクリックし、[プロジェクト] をダブルクリックします。 プロジェクトのフォルダーを開き、bin/Debug フォルダーでプロジェクト名.dll を見つけます。 プロジェクト名.dll をダブルクリックします。 新しいウィンドウに、他のモジュールおよびアセンブリへの参照に加えて、プロジェクトの属性が表示されます。 名前空間 Microsoft.Office.Interop.ExcelMicrosoft.Office.Interop.Word はアセンブリに含まれています。 Visual Studio の既定では、コンパイラは、参照 PIA からアセンブリに必要な型をインポートします。

    詳細については、「方法:アセンブリの内容を表示する」を参照してください。

  5. MANIFEST アイコンをダブルクリックします。 プロジェクトによって参照される項目を含んでいるアセンブリの一覧を含むウィンドウが表示されます。 Microsoft.Office.Interop.Excel および Microsoft.Office.Interop.Word は一覧に含まれていません。 プロジェクトに必要な型がアセンブリにインポートされているため、PIA への参照は必要ありません。 これにより、配置が容易になります。 PIA がユーザーのコンピューター上に存在している必要がなく、アプリケーションに特定のバージョンの PIA を配置する必要がないので、すべてのバージョンに必要な API が存在している場合は、複数のバージョンの Office を使用するようにアプリケーションを設計できます。

    PIA の配置が不要になったため、以前のバージョンを含む複数のバージョンの Office で動作する高度なシナリオで、アプリケーションを作成できます。 ただし、これは、コードで、使用している Office のバージョンでは利用できない APIを使用していない場合にのみ機能します。 特定の API が以前のバージョンで利用可能かどうかは常に明確ではないため、以前のバージョンの Office の使用はお勧めできません。

    注意

    Office 2003 より前の Office では、PIA は発行されません。 そのため、Office 2002 以前のバージョンの相互運用機能アセンブリを生成する唯一の方法は、COM 参照のインポートです。

  6. マニフェスト ウィンドウとアセンブリ ウィンドウを閉じます。

PIA の依存関係を復元するには

  1. ソリューション エクスプローラーで、 [すべてのファイルを表示] ボタンをクリックします。 [参照] フォルダーを展開し、 [Microsoft.Office.Interop.Excel] を選択します。 F4 キーを押して [プロパティ] ウィンドウを表示します。

  2. [プロパティ] ウィンドウで、 [相互運用機能型の埋め込み] プロパティを [True] から [False] に変更します。

  3. Microsoft.Office.Interop.Word について、この手順の手順 1 と 2 を繰り返します。

  4. C# では、Autofit メソッドの最後で DisplayInExcel への 2 つの呼び出しをコメント化します。

  5. プロジェクトが正常に実行することを確認するには、F5 キーを押します。

  6. アセンブリ ウィンドウを開くには、前の手順の手順 1 ~ 3 を繰り返します。 Microsoft.Office.Interop.WordMicrosoft.Office.Interop.Excel は、埋め込まれたアセンブリの一覧には表示されません。

  7. MANIFEST アイコンをダブルクリックし、参照アセンブリのリストをスクロールします。 Microsoft.Office.Interop.WordMicrosoft.Office.Interop.Excel の両方が一覧に表示されています。 アプリケーションが Excel と Word の PIA を参照し、 [相互運用機能型の埋め込み] プロパティを [False] に設定しているため、両方のアセンブリがエンド ユーザーのコンピューター上に存在する必要があります。

  8. Visual Studio で、 [ビルド] メニューの [ソリューションのクリーン] をクリックして、完成したプロジェクトをクリーンアップします。

関連項目