次の方法で共有


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

Visual Studio 2010 には、Microsoft Office のプログラミングを改善する C# および Visual Basic の新機能が導入されています。 各言語に、他の言語では既に存在する機能が追加されています。

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

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

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

必須コンポーネント

このチュートリアルを実行するには、コンピューターに Microsoft Office Excel 2013 (またはバージョン 2007 以降) および Microsoft Office Word 2013 (またはバージョン 2007 以降) がインストールされている必要があります。

Windows Vista よりも前のオペレーティング システムを使用している場合は、.NET Framework 2.0 がインストールされていることを確認します。

注意

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

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

  1. Visual Studio を起動します。

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

  3. [インストールされたテンプレート] ペインで、[Visual Basic] または [Visual C#] を展開し、[Office] を展開して、[2013] (あるいは [2010] または [2007]) をクリックします。

  4. [テンプレート] ペインで [Excel 2013 アドイン] (あるいは [Excel 2010 アドイン] または [Excel 2007 アドイン]) をクリックします。

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

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

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

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

参照を追加するには

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

  2. [アセンブリ] タブの [コンポーネント名] 一覧で、Microsoft.Office.Interop.Excel バージョン 15.0.0.0 (または Excel 2010 の場合はバージョン 14.0.0.0、Excel 2007 の場合はバージョン 12.0.0.0) を選択し、Ctrl キーを押しながら Microsoft.Office.Interop.Word バージョン 15.0.0.0 (または Word 2010 の場合はバージョン 14.0.0.0、Word 2007 の場合はバージョン 12.0.0.0) を選択します。 アセンブリが表示されない場合は、アセンブリがインストールされ表示されることを確認する必要があります (「方法 : Office のプライマリ相互運用機能アセンブリをインストールする」を参照)。

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

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

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

  2. 次の 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;
    

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

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

  2. 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; }
    }
    
  3. 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 にエクスポートするには

  1. 同じファイル内で、次のメソッドを ThisAddIn クラスに追加します。 このメソッドは、Excel ブックを設定し、データを 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 型からこれらのプロパティを使用することができます。 また、インデックス付きプロパティを使用すると、Value2 プロパティを使用せずに、Range オブジェクトの Value プロパティを使用できます。 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# プログラミング ガイド)」を参照してください。

  2. 次のコードを 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 の別の新機能である、dynamic 型がある場合と同様に Office などの COM ホストから返される Object 値の処理を示します。 これは、[相互運用機能型の埋め込み] が既定値の True に設定されている場合、または同様に、アセンブリが /link コンパイラ オプションによって参照されている場合に発生します。 dynamic 型では既に Visual Basic で使用できる遅延バインディングが可能であり、Visual C# 2008 以前のバージョンの言語で必要な明示的なキャストを回避します。

    たとえば、excelApp.Columns[1] は Object を返し、AutoFit は Excel の Range メソッドであるとします。 dynamic がない場合、Range のインスタンスとして、excelApp.Columns[1] によって返されたオブジェクトをキャストしてから、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 より少ない場合、行が赤で表示されます。 複数行のラムダ式は、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;
        }
    });
    
  2. プログラムを実行するには、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);
    

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

    // 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 参照を検索するには

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

  2. [スタート] メニューをクリックし、[すべてのプログラム] をクリックします。 次に、[Microsoft Visual Studio 2013] をクリックして、[Visual Studio ツール] をクリックし、[Visual Studio コマンド プロンプト (2013)] をクリックします。

  3. [Visual Studio コマンド プロンプト (2013)] ウィンドウに ildasm と入力し、Enter キーを押します。 [IL DASM] ウィンドウが表示されます。

  4. [IL DASM] ウィンドウの [ファイル] メニューで [開く] をクリックします。 [Visual Studio 2013] をダブルクリックし、[プロジェクト] をダブルクリックします。 プロジェクトのフォルダーを開き、bin/Debug フォルダーでプロジェクト名.dll を見つけます。 プロジェクト名.dll をダブルクリックします。 新しいウィンドウに、他のモジュールおよびアセンブリへの参照に加えて、プロジェクトの属性が表示されます。 名前空間 Microsoft.Office.Interop.Excel と Microsoft.Office.Interop.Word はアセンブリに含まれています。 Visual Studio 2013 の既定では、コンパイラは、参照 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# では、DisplayInExcel メソッドの最後で Autofit への 2 つの呼び出しをコメント化します。

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

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

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

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

参照

処理手順

方法: COM 相互運用機能を使用したプログラミングでインデックス付きプロパティを使用する (C# プログラミング ガイド)

チュートリアル: Microsoft Office アセンブリからの型情報の埋め込み (C# および Visual Basic)

チュートリアル: マネージ アセンブリからの型の埋め込み (C# および Visual Basic)

チュートリアル : 初めての Excel 用アプリケーション レベルのアドインの作成

関連項目

自動実装するプロパティ (C# プログラミング ガイド)

オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)

dynamic (C# リファレンス)

ラムダ式 (C# プログラミング ガイド)

相互運用性 (C# プログラミング ガイド)

概念

自動実装プロパティ (Visual Basic)

コレクション初期化子 (Visual Basic)

省略可能なパラメーター (Visual Basic)

位置と名前による引数渡し (Visual Basic)

名前付き引数と省略可能な引数 (C# プログラミング ガイド)

事前バインディングと遅延バインディング (Visual Basic)

ラムダ式 (Visual Basic)

その他の技術情報

dynamic 型の使用 (C# プログラミング ガイド)

COM 相互運用 (Visual Basic)