このチュートリアルでは、
C#
と
Visual
Basic
の
いくつかの
新機能について説明します。このチュートリアルでは、
新機能を組み
合わせて使用
して
Office
の開発を大幅に簡素化
する
方法
に重点を置いて説明
しますが、新機能の大半は他のコンテキストでも有用です。
このチュートリアルでは、銀行口座を表すクラスを作成します。次に、そのクラスのオブジェクトのコレクションを作成します。その後、
Office
Excel
ワークシートを作成し、ワークシートにコレクションのデータを挿入し、
Office
Word
ドキュメントに埋め込みます。最後に、プログラム用のプライマリ相互運用アセンブリ
(PIA)
への参照を検索し、その
PIA
の依存性を
有効または無効にする
方法を学習します。
PIA
の依存性が削除された場合、エンドユーザーは
Office
PIA
を各自のコンピュータにインストールすることなくプログラムを実行できます。
このチュートリアルでは、次に示す言語の新しい機能について説明します。
Visual C#
の新機能
:
- オプションパラメータと名前付きパラメータ
- 省略可能な
ref
パラメータ修飾子
- オブジェクトを返す
COM
呼び出しでの動的ディスパッチ
Visual Basic
の新機能
:
- 自動実装プロパティ
-
lambda
ステートメント
- コレクションイニシャライザ
- 暗黙的な行の継続
両言語の新機能
:
前提条件
:
このチュートリアルを完了するには、コンピュータに
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
ワークシートへのリンクが埋め込まれたドキュメントが表示されます。表示は次のようになります。
.jpg)
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
キーを押して
[
プロパティ
]
ウィンドウを表示します。
.jpg)
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)
へのアセンブリ参照です。このアセンブリはアプリケーションによって参照されるので、エンドユーザーの
コンピュータ
上に存在する必要があります。