印刷用ページ       送信     
クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
Office Programmability in C# and Visual Basic

このチュートリアルでは、 C# と Visual Basic の いくつかの 新機能について説明します。このチュートリアルでは、 新機能を組み 合わせて使用 して Office の開発を大幅に簡素化 する 方法 に重点を置いて説明 しますが、新機能の大半は他のコンテキストでも有用です。

このチュートリアルでは、銀行口座を表すクラスを作成します。次に、そのクラスのオブジェクトのコレクションを作成します。その後、 Office Excel ワークシートを作成し、ワークシートにコレクションのデータを挿入し、 Office Word ドキュメントに埋め込みます。最後に、プログラム用のプライマリ相互運用アセンブリ (PIA) への参照を検索し、その PIA の依存性を 有効または無効にする 方法を学習します。 PIA の依存性が削除された場合、エンドユーザーは Office PIA を各自のコンピュータにインストールすることなくプログラムを実行できます。

このチュートリアルでは、次に示す言語の新しい機能について説明します。

Visual C# の新機能 :

  • オプションパラメータと名前付きパラメータ
  • 省略可能な ref パラメータ修飾子
  • オブジェクトを返す COM 呼び出しでの動的ディスパッチ

Visual Basic の新機能 :

  • 自動実装プロパティ
  • lambda ステートメント
  • コレクションイニシャライザ
  • 暗黙的な行の継続

両言語の新機能 :

  • PIA を使用しない配置

前提条件 : このチュートリアルを完了するには、コンピュータに Excel 2007 と Word 2007 をインストールしておく必要があります。

新しいコンソールアプリケーションを作成するには

1.    [ ファイル ] メニューの [ 新規作成 ] をポイントし、 [ プロジェクト ] をクリックします。 [ 新しいプロジェクト ] ダイアログボックスの [ テンプレートカテゴリ ] ウィンドウで、 [ Visual Basic ] または [ Visual C# ] を展開し、 [ ウィンドウ ] をクリックします。 [ テンプレート ] ウィンドウの上部で、 [ .NET Framework 4.0 ] が選択されていることを確認します。 [ コンソールアプリケーション ] をクリックし、 [ OK ] をクリックします。

2.    ソリューションエクスプローラで、プロジェクトノードを右クリックし、 [ 参照の追加 ] をクリックします。 [ .NET ] タブで、 [ Microsoft.Office.Interop.Excel, version 12.0 ] をクリックします。 Ctrl キーを押しながら、 [ Microsoft.Office.Interop.Word, version 12.0 ] をクリックします。

3.    [ OK ] をクリックして、 [ 参照の追加 ] ダイアログボックスを閉じます。

銀行口座クラスを作成するには

このセクションでは、銀行口座を表す単純なクラスを作成します。

1.    ソリューションエクスプローラで、プロジェクトノードを右クリックし、 [ 追加 ] 、 [ クラス ] の順にクリックして、 [ 新しい項目の追加 ] ダイアログボックスを開きます。ファイルに Account.vb (Visual Basic の場合 ) または Account.cs (C# の場合 ) という名前を付け、 [ 追加 ] をクリックします。

2.    次のコードを新しいクラスに追加します。プロパティを宣言するとき、明示的なバッキングフィールドも同時に作成する必要はなくなりました。フィールドはコンパイラによって自動的に追加されます。これは"自動実装プロパティ"と呼ばれる Visual Basic 10.0 の新機能です。

Public Class Account

    Property ID As Integer = -1

    Property Balance As Double

End Class

: このコード を 貼り付ける前に、すべてのnamespace宣言を削除してください。このチュートリアルの残りの部分を単純化するため に Account クラス は 名前空間の外部に置く必要があります。

public class Account {

    public int ID { get; set; }

    public double Balance { get; set; }

}

Office 名前空間をインポートするには

この手順には特に新しい点はありません。既定 のコード に Imports ステートメントまたは using ディレクティブを追加して、 Excel オブジェクトと Word オブジェクトを参照するたびに オブジェクト 名を完全修飾する必要がないようにするだけです。

  • Module1.vb ファイルまたは Program.cs ファイルの先頭に、次のコードを追加します。

Imports Microsoft.Office.Interop

using Excel = Microsoft.Office.Interop.Excel;

using Word = Microsoft.Office.Interop.Word;

口座クラスにデータを追加するには

この手順では、コレクションイニシャライザについて説明します。コレクションイニシャライザは、オブジェクトを初めて作成するときに、 複数の 要素 で構成される リスト や 配列などのコレクション に値を設定す るための便利な表現方法 で す。この機能は Visual Studio 2008 で C# に導入され、 Visual Studio 2010 で Visual Basic に導入されます。

アプリケーションの Main メソッドに次のコードを追加します。

Dim checkAccounts As New List(Of Account) From {

            New Account With {

                                  .ID = 345,

                                  .Balance = 541.27

                             },

            New Account With {

                                  .ID = 123,

                                  .Balance = -127.44

                             }

            }

var checkAccounts = new List<Account> {

                    new Account {

                                      ID = 345,

                                      Balance = 541.27

                                },

                    new Account {

                                      ID = 123,

                                      Balance = -127.44

                                }

               };

口座データを Excel に表示するには

この手順では、新しい Excel ワークブックを作成し、前の手順で初期化 し た List<Account> または List (Of Account) からデータを挿入する方法について説明します。 Action はデリゲート型です。入力パラメータ数が異なる複数の Action デリゲートが定義されますが、それらはすべて void を返します。後の手順で、 DisplayInExcel を呼び出して Action デリゲートシグネチャと一致するインラインメソッドを指定するときに、 lambda ステートメントを使用します。

1.    次のメソッドを Module1 (Visual Basic の場合 ) または Program クラス (C# の場合 ) に追加します。

Sub DisplayInExcel(accounts As IEnumerable(Of Account),

                   DisplayFunc As Action(Of Account, Excel.Range))

    With New Excel.Application

        . Workbooks.Add()

        . Visible = True

        . Range("A1").Value = "ID"

        . Range("B1").Value = "Balance"

        . Range("A2").Select()

        For Each ac In accounts

            DisplayFunc(ac, .ActiveCell)

            . ActiveCell.Offset(1, 0).Select()

        Next

        . Range("A1:B3").Copy()

    End With

End Sub

public static void DisplayInExcel(IEnumerable<Account> accounts,

                                  Action<Account, Excel.Range> DisplayFunc)

{

    var xl = new Excel.Application();

    xl.Workbooks.Add();

    xl.Visible = true;

    xl.get_Range("A1").Value2 = "ID";

    xl.get_Range("B1").Value2 = "Balance";

    xl.get_Range("A2").Select();

    foreach (var ac in accounts)

    {

        DisplayFunc(ac, xl.ActiveCell);

        xl.ActiveCell.get_Offset(1, 0).Select();

    }

    xl.get_Range("A1:B3").Copy();

}

2.    Main メソッドの末尾で、次のコードを使用して DisplayInExcel メソッドを呼び出します。残高がマイナスの場合に Excel のセルを赤で表示する lambda ステートメントの使い方に注意してください。

DisplayInExcel(checkAccounts, Sub(account, cell)

                            ' この複数行 lambda で

                            ' カスタム処理規則を設定する 。

                             cell.Value2 = account.ID

                            cell.Offset(0, 1).Value2 = 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(checkAccounts, (account, cell) =>

                  {

                      // この複数行 lambda で
                      // カスタム処理規則を設定する。

                      cell.Value2 = account.ID;

                      cell.get_Offset(0, 1).Value2 = account.Balance;

                      if (account.Balance < 0)

                      {

                          cell.Interior.Color = 255;

                          cell.get_Offset(0, 1).Interior.Color = 255;

                      }

                  });

3.    内容に合わせて列の幅を自動的に調整するには、次のコードを DisplayInExcel メソッドの最後に挿入します。

' 次の行を With ステートメントの最後に挿入する 。

. Columns(1).AutoFit()

. Columns(2).AutoFit()

xl.Columns[1].AutoFit();

xl.Columns[2].AutoFit();

Columns の インデックス付き呼び出しの結果に対して AutoFit メソッド を 呼び出 します。呼び出しの結果は Object 型です。 Office などの COM ホストから 返される Object 型の戻り値は、 Embed Interop Types プロパティが既定値 である Trueに設定されている場合、 C# 4.0 では自動的に dynamic 型として処理されます。これにより、動的ディスパッチ(遅延バインディング)が可能になり、 C# 3.0 では必要なキャストが回避されます。詳細については、「PIAの依存性を復元するには」 の セクションを参照してください。

// C# 3.0 のコード。 Embed Interop Types が True に設定されてい る場合、 C# 4.0 で は 不要 。

((Excel.Range)xl.Columns[1]).AutoFit();

((Excel.Range)xl.Columns[2]).AutoFit();

Excel スプレッドシートを Word ドキュメントに埋め込むには

この手順では、Wordのインスタンスを作成し、 Excel ワークシートへのリンクをドキュメントに貼り付けます。 Visual Basic では名前付きパラメータとオプションパラメータがかなり前からサポートされているので、 Visual Basic コードには特に新しい点はありません。 一方、 C# 4.0 で この機能がサポートされ るようになりました 。 PasteSpecial メソッド のパラメータは実際には 7個ありますが、すべてオプションなので、 C# ですべてのパラメータに引数を指定する必要 は なくなりました。

  • 次のコードを Main メソッドの最後に挿入します。

Dim word As New Word.Application

word.Visible = True

word.Documents.Add()

word.Selection.PasteSpecial(Link:=True, DisplayAsIcon:=True)

var word = new Word.Application();

word.Visible = true;

word.Documents.Add();

word.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);

PasteSpecial の定義 において、 すべてのパラメータが ByRef (C# では ref ) であることに注意してください。 C# 4.0 では、各パラメータの前に ref を指定 しないで COM コンポーネントを呼び出すことができます。現在 では 1行のコードで 済みますが 、 かつての C# 3.0 では約 15 行 ( この特定の機能の場合 ) のコードが必要でした。

// C# 3.0 のコード。 C# 4.0 では不要

object iconIndex = System.Reflection.Missing.Value;

object link = true;

object placement = System.Reflection.Missing.Value;

object displayAsIcon = true;

object dataType = System.Reflection.Missing.Value;

object iconFileName = System.Reflection.Missing.Value;

object iconLabel = System.Reflection.Missing.Value;

word.Selection.PasteSpecial(ref iconIndex,

                            ref link,

                             ref placement,

                            ref displayAsIcon,

                            ref dataType,

                            ref iconFileName,

                            ref iconLabel);

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

  • アプリケーションを実行するには、F5キーを押します。最初に Excel が開き、ワークシートが表示されます。次に Word が開き、 Excel ワークシートへのリンクが埋め込まれたドキュメントが表示されます。表示は次のようになります。

PIA 参照を検索するには

1.    [ スタート ] メニューの Visual Studio Tools フォルダから、 Visual Studio 2010 コマンドプロンプトを起動します。「 ildasm 」と入力し、 Enter キーを押します。 [ ファイル ] をクリックし、アセンブリを開きます。既定ではプロジェクトの \bin\Debug\ ディレクトリ (My Documents\Visual Studio 10\Projects\ プロジェクト名 \ プロジェクト名 \ bin\Debug\ プロジェクト名 ) にあります。

2.    Microsoft.Office.Interop.Excel と Microsoft.Office.Interop.Word の名前空間があることに注意してください。これは、 Visual Studio 2010 では、 Embed Interop Types オプションは既定で True に 設定され、 PIA から使用される型のメンバだけがアセンブリに追加されるためです。

3.    [ マニフェスト ] をダブルクリックします。マニフェストには、 Microsoft.Office.Interop.Excel と Microsoft.Office.Interop.Word のエントリはありません。 PIA から使用 している 型は 既に アセンブリに埋め込まれているので、アセンブリ で PIA を参照する必要はありません。 つまり 、アプリケーションと共に PIA をエンドユーザーの コンピュータ に 配置 する必要 はありません 。

      No-PIA (PIA を使用しない ) 機能によって、 PIA への参照を必要としない方法でアプリケーションをコンパイルできます。 PIA から使用している型は、コンパイラによってアセンブリにインポートされます。この結果、 PIA がユーザーのコンピュータに存在 してい る必要 がなく、配置 が容易になります。さらに、このアプリケーションは PIA の特定のバージョンを必要としないので、 Office の複数のバージョンで動作します。

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

PIA の依存性を復元するには

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

6.    [ Embed Interop Types ] プロパティを [ True ] から [ False ] に変更します。

7.    Microsoft.Office.Interop.Word に対して手順5.と6.を繰り返します。

8.    C# では、 DisplayInExcel の次の 2 つのステートメントに対して明示的な型キャストを追加する必要があります。

// Embed Interop Types False に設定され ている 場合、次の行は明示的な キャストが 必要

xl.Columns[1].AutoFit();

xl.Columns[2].AutoFit();

これらの行を次の行に置き換えて必要な型キャストを行います。

((Excel.Range)xl.Columns[1]).AutoFit();

((Excel.Range)xl.Columns[2]).AutoFit();

9.    F5キーを押してプロジェクトをリビルドします。正常に実行されることを確認します。

10.  手順 1 . を繰り返して、 ildasm で アセンブリを開きます。

11. [ マニフェスト ] をダブルクリックします。 一覧 に次の Excel のエントリが表示されます。同様の Word のエントリ も あります。

. assembly extern Microsoft.Office.Interop.Excel

{

  . publickeytoken = (71 E9 BC E1 11 E9 42 9C )                         // q.....B.

  . ver 12:0:0:0

}

これは Excel プライマリ相互運用 機能 アセンブリ (PIA) へのアセンブリ参照です。このアセンブリはアプリケーションによって参照されるので、エンドユーザーの コンピュータ 上に存在する必要があります。

Page view tracker