Visual Studio 2005 Tools for Office Word 2003 用実践ラボ
Microsoft Corporation
June 2005
日本語版最終更新日 2005 年 10 月 5 日
適用対象:
Microsoft Visual Studio 2005
Microsoft Visual Studio 2005 Tools for the Microsoft Office System
Microsoft Visual Basic 2005
Microsoft Office Word 2003
概要:本実践ラボの演習を通じ、Microsoft Visual Studio 2005 Tools for the Microsoft Office System Beta 2 および Microsoft Office Word 2003 を使用した顧客調査アプリケーションの構築を実習します。
注意 この記事はリリース前のドキュメントであり、今後のリリースで変更される可能性があります。Microsoft Visual Studio 2005 Tools for the Microsoft Office System のベータ版は、Microsoft Visual Studio 2005 のベータ版に含まれています。
VSTO2005WordLabs.msi をダウンロードしてください。
目次
実践ラボの準備
演習 1 - Word にアクション ペインを作成する
演習 2 -Word ドキュメントでコントロールを使用する
演習 3 - Word ドキュメントでデータ処理を行う
演習 4 - Word ドキュメントにデータをキャッシュする
まとめ
関連情報
実践ラボの準備
実践ラボの演習を行うには、以下の製品をインストールする必要があります:
- Microsoft Windows 2000 以降
- Microsoft Visual Studio 2005 Beta 2
- Microsoft Visual Studio 2005 Tools for the Microsoft Office System ベータ 2 (Visual Studio 2005 Beta 2 に含まれています)
- Microsoft Office Professional Edition 2003
- Microsoft SQL Server 2000 (またはそれ以降) または MSDE と Northwind データベース
メモ 本ラボの説明では、ファイルをできる限りフル パスで表記します。なお、ダウンロード ファイルは「\My Documents\Visual Studio 2005\Projects」に解凍されているものとします。演習に必要なファイル類は 「VSTO2005 Word Labs\Starter Files」というサブフォルダに入っています。本ラボで使用するファイル一式は、「VSTO2005 Word Labs\Completed Labs」サブフォルダにあります。
Word ドキュメントでコントロールを操作する際、コントロールの値を変更できない場合は、デザイン モードで作業を行っていることが考えられます。デザイン モードを終了するには、[Control Toolbox] ツール バーで [Exit Design Mode] をクリックしてください。
また、"Windows Forms controls have been disabled because the document has been scaled. When zoom is returned to 100%, controls will reactivate," というメッセージが表示されたときは、[Control Toolbox] ツール バーで [Design Mode] をクリックしてデザイン モードに移行し、エラーが発生したコントロールのサイズを調整してください。サイズを調整したらデザイン モードを終了します。
演習 1 - Word にアクション ペインを作成する
この演習は、Visual Studio Tools for Office を使用した Word プロジェクトの作成方法および Word でアクション ペインを操作する方法の学習を目的とします。演習 1 では、Word ソリューションにアクション ペインを作成し、作成したアクション ペインに含まれるコントロールのレイアウトを管理します。
所要時間:
- 実習 1: アクション ペインの作成 - 10 分
実習 1: アクション ペインの作成
Word ドキュメント プロジェクトを作成するには
- [File] メニューで [New] をクリックし、続いて [Project] をクリックします。
- [Project Types] の一覧で [Visual Basic] を展開し、[Office] をクリックします。
- [Templates] の一覧で [Word Document] を選択します。
- [Name] ボックスに「CustomerSurvey」と入力し、[Location] ボックスにファイルの場所 (例:「C:\VSTO2005\Labs」) を指定します。このときの [New Project] ダイアログ ボックスは、図 1 のようになります。

図 1. Word ドキュメント プロジェクトの作成 (画像をクリックすると拡大表示できます。)
- [OK] をクリックします。Visual Studio Tools for Office Project Wizard が起動します。
- ウィザードで、[Copy an existing document] を選択します。
- [Browse] をクリックします。
- 以下のディレクトリに移動し、[Open] をクリックします。
「\My Documents\Visual Studio 2005\Projects\VSTO2005 Word Labs\Starter Files\Customer Satisfaction Survey.doc」
- ウィザードで、[OK] をクリックします。このとき、図 2 のような警告メッセージが表示されることがあります。

図 2. Visual Basic for Applications プロジェクト システムへのアクセスはデフォルトでは無効になっています。(クリックすると拡大表示できます。)
上記のメッセージが表示された場合は、[OK] をクリックして Visual Basic for Applications プロジェクト システムへのアクセスを許可してください。この設定は一度行えば以後必要ありません。
- [File] メニューで [Save All] をクリックします。
Word のアクション ペインにコントロールを追加するには
- [Solution Explorer] で、CustomerSurvey プロジェクトを右クリックします。ショートカット メニューで [Add] をポイントしたら、[Existing Item] をクリックします。[Add Existing Item] ダイアログ ボックスが表示されます。
- 以下のディレクトリに移動し、[Add] をクリックします:
「\My Documents\Visual Studio 2005\Projects\VSTO2005 Word Labs\Starter Files\SubmitPane.vb」
- [Solution Explorer] で、[SubmitPane.vb] を右クリックします。ショートカット メニューで [View Designer] をクリックします。
図 3 で示すユーザー コントロール SubmitPane が表示されます。SubmitPane は、GroupBox、Label、Button それぞれを 1 つずつ持つシンプルなユーザー コントロールです。

図 3. アクション ペインに追加する準備ができた SubmitPane
- [Solution Explorer] で、[SubmitPane.vb] を右クリックします。ショートカット メニューで [View Code] をクリックします。
- SubmitPane クラスに、Button がクリックされたときに OnSubmit という名前のイベントを発生させるコードと、Label と Button コントロールのテキストを設定する WriteOnly 型のパブリック プロパティをエクスポーズするコードを追加します。はじめに、Event ステートメントを SubmitPane クラスに追加します。
Public Class SubmitPane
Public Event OnSubmit()
End Class
- Message と ButtonText プロパティを定義するコードを追加します。
Public WriteOnly Property Message() As String
Set(ByVal value As String)
Me.lblStatus.Text = value
End Set
End Property
Public WriteOnly Property ButtonText() As String
Set(ByVal value As String)
Me.btnSubmit.Text = value
End Set
End Property
- [Code] ウインドウ上部にある [Class Name] の一覧で、[btnSubmit] を選択します。
- [Code] ウインドウ上部にある [Method Name] の一覧で、[Click] を選択します。Visual Studio により、ボタンの Click イベントにプロシージャ スタブが生成されます。
- OnSubmit イベントを発生させるコードを追加します。
Private Sub btnSubmit_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnSubmit.Click
RaiseEvent OnSubmit()
End Sub
- [Solution Explorer] で、[ThisDocument.vb] を右クリックします。ショートカット メニューで [View Code] をクリックします。ドキュメントのコード モジュールが表示されます。ドキュメントのコードビハインド部分が、「ThisDocument」という名前のクラスにカプセル化されていることに注目してください。
- SubmitPane ユーザー コントロールのインスタンスを生成するために、ThisDocument クラスにプライベート メンバ変数を追加します。
Private WithEvents ucSubmitPane As SubmitPane
- SubmitPane コントロールを Word アクション ペインに追加する CreateActionsPane という名前の新しいプライベート メソッドを ThisDocument クラスに追加します。
Private Sub CreateActionsPane()
Me.SmartDocument.SolutionID = ""
'Add a user control to the actions pane.
ucSubmitPane = New SubmitPane
Me.ActionsPane.Controls.Add(ucSubmitPane)
End Sub
- ThisDocument クラスの Startup イベントに CreateActionsPane への呼び出しを追加します。
Private Sub ThisDocument_Startup(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Startup
Me.CreateActionsPane()
End Sub
- ボタンがクリックされたときに SubmitPane コントロールで発生する OnSubmit イベントを処理するコードを追加します。プロシージャ スタブを自動的に追加するため、[Class Name] の一覧から [ucSubmitPane] を選択し、[Method Name] の一覧から [OnSubmit] を選択します。
- プロシージャ スタブに以下のコードを追加します。
Private Sub ucSubmitPane_OnSubmit() Handles ucSubmitPane.OnSubmit
MessageBox.Show("TO DO. Submit")
End Sub
チェックポイント
- [File] メニューで [Save All] をクリックします。
- [Debug] メニューで [Start] をクリックし、プロジェクトをビルドして、実行します。Customer Satisfaction Survey.doc ドキュメントが Word で開かれます。
- 図 4 で示すように、アクション ペインに SubmitPane ユーザー コントロールが表示されます。

図 4. SubmitPane ユーザー コントロールを表示したアクション ペイン (クリックすると拡大表示できます。)
- [Submit] をクリックします。TO DO: Submit というメッセージが表示されます。
- 変更を保存せずにドキュメントを閉じて、Word を終了します。
演習 2 - Word ドキュメントでコントロールを使用する
この演習は、Word ドキュメントで使用可能なコントロールの種類の紹介と、ドキュメント イベントとコントロール イベントの処理方法についての学習を目的とします。
所要時間:
- 実習 1: Bookmark コントロールの使用とイベント処理 - 15 分
- 実習 2: Windows Forms コントロールの使用 - 15 分
この演習では、演習 1 で作成した CustomerSurvey プロジェクトを使用します。
実習 1: Bookmark コントロールの使用とイベント処理
ドキュメント中のブックマーク コントロールのイベントを処理するには
- [Solution Explorer] で、[ThisDocument.vb] を右クリックします。ショートカット メニューで [View Designer] をクリックします。
- [Properties] ウインドウが表示されないときは、[View] メニューで [Properties Window] をクリックします。
- [Properties] ウインドウ上部にあるリスト ([Control] の一覧) 横にある矢印をクリックし、ドキュメントに埋め込まれているコントロールを一覧表示します。このとき、ブックマーク コントロールがすでにいくつか存在していることに注目してください。これらは、プロジェクトを作成したときにオリジナルの Customer Satisfaction Survey.doc に存在していたブックマークのブックマーク コントロールで、デザイナが自動的に生成したものです。
- [Properties] ウインドウの [Control] の一覧で、[bkMenu] を選択して bkMenu ブックマークを選択します。これにより、ドキュメントの右上角にある Menu ブックマークが選択されます。
- bkMenu ブックマーク内でダブルクリックします。ThisDocument.vb の [Code] ウインドウがオープンします。このとき、自動的に bkMenu_SelectionChange イベントが生成されます。
- ブックマークが選択されたときに Word のステータス バーのテキストを変更する次のコードを bkMenu_SelectionChange に追加します。
Private Sub bkMenu_SelectionChange(ByVal sender As System.Object, _
ByVal e As Microsoft.Office.Tools.Word.SelectionEventArgs) _
Handles bkMenu.SelectionChange
Me.Application.StatusBar = "Right-click for more options"
End Sub
ドキュメントの初期化中にコマンド バーを生成するには
- CommandBar および CommandBarButton を参照するためのプライベート メンバ変数を ThisDocument クラスに追加します。
'CommandBar popup and CommandBar controls
Private cbPopup As Office.CommandBar
Private cbctlPrevious As Office.CommandBarButton
Private cbctlNext As Office.CommandBarButton
Private cbctlShowByCustID As Office.CommandBarButton
Private cbctlShowAll As Office.CommandBarButton
Private cbctlShowCompleted As Office.CommandBarButton
- カスタム ポップアップ上のコマンド バー ボタンのいずれか 1 つがクリックされたときに呼び出される、cbctlClick という名前のプライベート メソッドを ThisDocument クラスに追加します。
Private Sub cbctlClick(ByVal Ctrl As Office.CommandBarButton, _
ByRef CancelDefault As Boolean)
MessageBox.Show("To do: " & Ctrl.Tag)
End Sub
- コマンド バー ボタンの生成とボタンのイベント デリゲートを設定する目的で呼び出される、AddPopupButton という名前のプライベート メソッドを ThisDocument クラスに追加します。
Private Sub AddPopupButton(ByVal Caption As String, _
ByVal Tag As String, ByRef Btn As Office.CommandBarButton)
'Caption および Tag プロパティに設定された値をもとにボタンを追加します。
Btn = cbPopup.Controls.Add(Office.MsoControlType.msoControlButton)
Btn.Caption = Caption
Btn.Tag = Tag
'ボタンがクリックされたときのイベント ハンドラをボタンに設定します。
AddHandler Btn.Click, AddressOf Me.cbctlClick
End Sub
- Survey Filter Popup という名前のポップアップ コマンド バーを生成する、AddPopupMenu という名前のプライベート メソッドを ThisDocument クラスに追加します。
Private Sub AddPopupMenu()
Try
'コマンド バーの変更が Normal.dot (規定テンプレート) に保存されるの
'ではなくこのドキュメントに反映されるよう、カスタマイゼーション
'コンテキストをドキュメントに設定します。
Me.Application.CustomizationContext = _
Me.Application.ActiveDocument
'ドキュメントにコマンド バーを追加します。
cbPopup = Me.CommandBars.Add("Survey Filter Popup", _
Office.MsoBarPosition.msoBarPopup, , True)
'コマンド ボタンをポップアップに追加します。
Me.AddPopupButton("Previous Order", "MOVE_PREVIOUS", _
cbctlPrevious)
Me.AddPopupButton("Next Order", "MOVE_NEXT", cbctlNext)
Me.AddPopupButton("", "SHOW_BY_CUSTID", cbctlShowByCustID)
cbctlShowByCustID.BeginGroup = True
Me.AddPopupButton("Show Only Completed Surveys Ready to Submit", _
"SHOW_COMPLETED", cbctlShowCompleted)
Me.AddPopupButton("Show All Orders", "SHOW_ALL", cbctlShowAll)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error adding Survey Filter Popup")
End Try
End Sub
- ThisDocument_Startup に、AddPopupMenu メソッドを呼び出す次の 1 行を追加します。
Me.AddPopupMenu()
ブックマークの右クリック時にコマンド バー ポップアップを表示するには
- [Code] ウインドウの [Class Name] の一覧で、[bkMenu] を選択します。[Method Name] の一覧で [BeforeRightClick] をクリックします。[Code] ウインドウに、対応するイベント ハンドラ、bkMenu_BeforeRightClick が表示されることに注目してください。
- bkMenu ブックマークを右クリックしたときに [Survey Filter Popup] コマンド バーを表示するコードを、bkMenu_BeforeRightClick に追加します。
Private Sub bkMenu_BeforeRightClick(ByVal sender As Object, _
ByVal e As Microsoft.Office.Tools.Word.ClickEventArgs) _
Handles bkMenu.BeforeRightClick
'現在の Customer ID のテキストを元にコマンド ボタン プロパティの情報を更新します。
cbctlShowByCustID.Caption = "Show Only Orders for [TO DO]"
'ポップアップを表示し、デフォルトのアクションを取り消します。
cbPopup.ShowPopup()
e.Cancel = True
End Sub
チェックポイント
- [File] メニューで [Save All] をクリックします。
- [Debug] メニューで [Start] をクリックし、プロジェクトをビルドして、実行します。Customer Satisfaction Survey.doc ドキュメントが Word で開かれます。
- ドキュメントをクリックしてブックマーク bkMenu 内に挿入マークを配置します。このとき、図 5 で示すように、ステータス バーのテキストが "Right-click for more options,;" に変わることに注目してください。

図 5. ブックマークをクリックすると "right-click to see the pop-up menu" というステータス メッセージが表示されます。(画像をクリックすると拡大表示できます。)
- ブックマーク bkMenu を右クリックして [Survey Filter Popup] コマンド バーを表示します。
- ポップアップ メニュー上のコントロールのいずれか 1 つをクリックしてメッセージを表示させます。
- 変更を保存せずにドキュメントを閉じて、Word を終了します。
実習 2: Windows Forms コントロールの使用
Windows Forms コントロールをドキュメントに追加するには
コントロールをドキュメントに配置する具体例については、本実習を通じて図 6 を参照してください。

図 6. コントロールがすべて配置されるとドキュメントは上記のようになります。(クリックすると拡大表示できます。)
- [Solution Explorer] で、[ThisDocument.vb] を右クリックします。ショートカット メニューで [View Designer] をクリックします。
- [Toolbox] ウインドウが表示されないときは、[View] メニューで [Toolbox] をクリックします。
- [NumericUpDown] コントロールを選択し、顧客調査表の 1 段目最後のセルにドロップします。
- [CheckBox] コントロールを選択し、顧客調査表の 2 段目最後のセルにドロップします。
- [CheckBox] コントロールを選択し、顧客調査表の 3 段目最後のセルにドロップします。
- [NumericUpDown] コントロールを選択し、顧客調査表の 4 段目最後のセルにドロップします。
- [CheckBox] コントロールを選択し、顧客調査票の 5 段目最後のセルにドロップします。
- 表 1 に従って、ドキュメント上の Windows Forms コントロールのプロパティ値を設定します。
表 1. Customer Satisfaction Survey.doc 内コントロールのプロパティ値
| コントロール |
プロパティ |
値 |
| NumericUpDown1 |
(Name) |
nupdnSalesRep |
| |
Maximum |
5 |
| |
Minimum |
1 |
| |
Value |
5 |
| |
Width |
140 |
| CheckBox1 |
(Name) |
chkCourteous |
| |
Text |
No |
| |
Width |
140 |
| CheckBox2 |
(Name) |
chkEfficiency |
| |
Text |
No |
| |
Width |
140 |
| NumericUpDown2 |
(Name) |
nupdnOverall |
| |
Maximum |
5 |
| |
Minimum |
1 |
| |
Value |
5 |
| |
Width |
140 |
| CheckBox3 |
(Name) |
chkSurveyed |
| |
Text |
Completed |
| |
Width |
140 |
ドキュメント上の Windows Forms コントロールを初期化するには
- [Solution Explorer] で、[ThisDocument.vb] を右クリックします。ショートカット メニューで [View Code] をクリックします。
- ドキュメントの標準フォントに近い Font を返す、NormalFont という読み取り専用のプライベート プロパティを ThisDocument クラスに追加します。NormalFont を使用して Windows Forms コントロールの Font プロパティを設定すると、ドキュメントの標準スタイル フォントに近いフォントが使われるようになります。
Private ReadOnly Property NormalFont() As System.Drawing.Font
Get
Dim ftNormal As Word.Font = Me.Styles("Normal").Font
Dim ft As System.Drawing.Font
ft = New Font(ftNormal.Name, ftNormal.Size, FontStyle.Regular)
Return ft
End Get
End Property
- コントロールのフォントを初期化する次のコードを ThisDocument_Startup に追加します。
'コントロールのフォントを標準スタイルと一致するようフォーマットします。
Dim ft As System.Drawing.Font = Me.NormalFont
Me.nupdnSalesRep.Font = ft
Me.chkCourteous.Font = ft
Me.chkEfficiency.Font = ft
Me.nupdnOverall.Font = ft
Me.chkSurveyed.Font = ft
- [Code] ウインドウの [Class Name] の一覧で [chkCourteous] を選択し、[Method Name] の一覧で [CheckedChanged] を選択します。
- コントロールのテキストを現在の値に応じて "Yes" または "No" に変更するコードを、 chkCourteous_CheckedChanged イベント ハンドラに追加します。
Private Sub chkCourteous_CheckedChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles chkCourteous.CheckedChanged
If chkCourteous.Checked Then
chkCourteous.Text = "Yes"
Else
chkCourteous.Text = "No"
End If
End Sub
- 同様のテクニックで、[chkEfficiency] チェック ボックス コントロールの CheckChanged イベントにも同様のイベント ハンドラを作成します。
Private Sub chkEfficiency_CheckedChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles chkEfficiency.CheckedChanged
If chkEfficiency.Checked Then
chkEfficiency.Text = "Yes"
Else
chkEfficiency.Text = "No"
End If
End Sub
チェックポイント
- [File] メニューで [Save All] をクリックします。
- [Debug] メニューで [Start] をクリックし、プロジェクトをビルドして、実行します。Customer Satisfaction Survey.doc ドキュメントが Word で開かれます。
- ドキュメント上の Windows Forms コントロールは、図 7 で示すようになります。

Figure?7. Windows Forms コントロールが埋め込まれた Word ドキュメント (クリックすると拡大表示できます。)
- チェックボックスのどれか 1 つをオンにし、チェック ボックスの状態に合わせてテキストの表示が変化することを確認してください。
- NumericUpDown コントロールのどれか 1 つで値を変更します。
- 変更を保存せずにドキュメントを閉じて、Word を終了します。
演習 3 - Word ドキュメントでデータ処理を行う
この演習は、Word ドキュメントでデータ処理を行う方法の学習を目的とします。演習では、SQL Server データ ソースへの接続、ブックマークおよび Windows Forms コントロールのデータベース オブジェクトへの連結、データソース内のレコードへのナビゲートを行います。
所要時間:
- 実習 1: 接続の設定とデータ ソースの追加 - 10 分
- 実習 2: データへの接続、連結、ナビゲート - 30 分
- 実習 3: データのフィルタ処理 - 10 分
- 実習 4: データの挿入と更新 - 10 分
この演習では、演習 2 で作成した CustomerSurvey プロジェクトを使用します。
実習 1: 接続の設定とデータ ソースの追加
この演習では、SQL Server 2000 に付属のサンプル データソース Northwind のデータを使用します。
SQL バッチ プロシージャの実行により、Northwind サンプル データベースに Surveys というテーブルを新規に作成し、この Surveys テーブルに、Orders テーブルの最初のレコード 100 件に対応する OrderID 値と CustomerID 値を持つレコード 100 件を新規に作成します。Surveys テーブルの仕様は以下の通りです。
表 2. Surveys テーブル仕様
| フィールド |
SQL データ型 |
説明 |
| OrderID |
Int |
Orders テーブル内の OrderID に対応している OrderID です。 |
| CustomerID |
Nchar(5) |
Orders テーブル内のオーダー案件に対応している CustomerID です。 |
| RateSalesRep |
smallint |
販売員に対する満足度 (0 から 5)。 |
| RateCourteous |
Bit |
礼儀正しさに対する評価 (0 (no) または 1 (yes))。 |
| RateEfficiency |
Bit |
効率に対する評価 0 ((no) または 1 (yes))。 |
| RateOverall |
smallint |
サービス全体に対する満足度 (0 から 5)。 |
| RateFrequency |
smallint |
サービス頻度に関する評価 (0 から 5)。 |
| Survey |
Bit |
調査が終了している場合は 1: それ以外は 0。 |
SQL バッチ プロシージャを実行するには
- タスク バーで、[Start] をクリックし、続いて [Run] をクリックします。「cmd」と入力して [OK] をクリックします。コマンド ウインドウが開きます。
- 演習ファイルが入っている以下のフォルダに移動します。
「\My Documents\Visual Studio 2005\Projects\VSTO2005 Word Labs\Starter Files」
- バッチ プロシージャを実行します。
osql.exe ?n -E -i survey.sql
"100 row(s) affected" というメッセージが表示されます。
- コマンド ウインドウをクローズします。
データ ソースをプロジェクトに追加するには
- Visual Studio の [Data] メニューで、[Show Data Sources] をクリックします。[Data Sources] ウインドウが表示されます。
- [Data Sources] ウインドウで、[Add New Data Source] をクリックします。Data Source Configuration Wizard が起動します。
- データ ソース タイプに [Database] を選択して、[Next] をクリックします。
- [New Connection] をクリックします。このとき、すでに作成されたデータ接続があると、図 9 のような [Add Connection] ダイアログが表示されるので、次の手順は飛ばしてください。データ接続の作成が初めての場合は、[Choose Data Source] が表示されます。
- [Server name] の一覧に「(local)」と入力するか、一覧から任意のサーバー名を選択します。この設定を行うと、[Connect to a database] セクションが使用できる状態になります。
- [Log on to the server] セクションで、[Use Windows Authentication] オプションを選択します。
- [Select or enter a database name] の一覧から、[Northwind] を選択します。
- [Test Connection] をクリックします。図 10 のような確認メッセージが表示されないときは、[Add Connection] ダイアログ ボックスに戻って、設定が適切かどうかを確認してください。

図 10. 設定が適切であると、接続テストは成功します。
- [OK] をクリックしてメッセージ ボックスをクローズし、さらに [OK] をクリックして [Add Connection] ダイアログ ボックスもクローズします。Data Source Configuration Wizard に、図 11 に示すように、先ほど作成した接続が取り込まれます。

図 11. サーバー名がデータベース名の前に表示されている (クリックすると拡大表示できます。)
- [Next] をクリックします。図 12 に示すような、ウィザードの次のステップに進みます。

図 12. 接続を保存します (クリックすると拡大表示できます。)
- [Yes, save the connection as] チェック ボックスをオンにした状態で、[Next] をクリックします。図 13 に示すような [Choose your database objects] ウィザード ページが表示されます。

図 13. このページで、アプリケーションに必要なオブジェクトを選択します (クリックすると拡大表示できます。)
- データベース オブジェクトの一覧で [Tables] を展開します。
- [Customers] と [Surveys] テーブルを選択します。
- [Finish] をクリックします。
データ ソースを設定するには
- [Data Sources] ウインドウで [NorthwindDataSet] を選択し、[Data Sources] ウインドウ上部にある [Edit DataSet with Designer] ボタンをクリックします。
- デザイナ ウインドウで [Surveys] テーブルを右クリックし、ショートカット メニューで [Configure] をクリックします。TableAdapter Configuration Wizard が起動します。
- 新たに入力された DataSets には [Surveyed] フィールドが 0 のレコードのみが含まれるようにする、WHERE 節を SQL 構文に追加します。
SELECT OrderID, CustomerID, RateSalesRep, RateCourteous, RateEfficiency, RateOverall, Surveyed
FROM dbo.Surveys
WHERE Surveyed=0
設定が終了すると、ダイアログ ボックスは 図 14 のようになります。

図 14. SQL 構文に WHERE 節を追加します (クリックすると拡大表示できます。)
- [Finish] をクリックします。
リレーションをデータ ソースに追加するには
- [Data] メニューで [Add] をポイントし、続いて [Relation] をクリックします。[Relation] ダイアログ ボックスが表示されます。
- 新規リレーションを次のように設定します。
- [Name]: FK_Survey_Customers
- [Parent Table]: Surveys
- [Child Table]: Customers
- [Key Column]: CustomerID
- [Foreign Key Column]: CustomerID
設定が完了すると、[Relation] ダイアログ ボックスは図 15 のようになります。
![[Relation] ダイアログ ボックス (クリックすると拡大表示できます。)](officeVSTOBeta2WordLabs_Fig_15_thumb.gif)
図 15. [Relation] ダイアログ ボックス (クリックすると拡大表示できます。)
- [OK] をクリックして新規リレーションを追加します。
- 図 16 に示すような [NorthwindDataSet] デザイナ ウインドウが表示されます。

図 16. 新規リレーションのデザイン ビュー
- [File] メニューで [Save All] をクリックし、変更を保存します。
実習 2: データへの接続、連結、ナビゲート
ブックマークを Surveys テーブル (親テーブル) 内のフィールドに連結するには
- [Solution Explorer] で、[ThisDocument.vb] を右クリックします。ショートカット メニューで [View Designer] をクリックします。
- [Data Sources] ウインドウで [Surveys] を展開します。
[Surveys] 配下にある [OrderID] を選択し、ドキュメント内の bkOrderID ブックマークの上にドラッグします。
メモ これで、bkOrderID ブックマークは SurveysBindingSource オブジェクトに連結されました。[OrderID] フィールドをブックマックの上にドロップしたときに、SurveysBindingSource オブジェクトがデザイナにより自動的にコンポーネント トレイに追加されます。
ドキュメント上の Windows Forms コントロールを SurveysBindingSource 内のフィールドに連結するには
- ドキュメントの [nupdnSalesRep] コントロールを選択します。
- [Properties] ウインドウで [DataBindings] プロパティを展開し、[(Advanced)] プロパティを選択します。
- [(Advanced)] プロパティの隣にある (...) をクリックします。[Formatting and Advanced Binding] ダイアログ ボックスが表示されます (図 17 参照)。
![[Formatting and Advanced Binding] ダイアログ ボックス (クリックすると拡大表示できます。)](officeVSTOBeta2WordLabs_Fig_17_thumb.gif)
図 17. [Formatting and Advanced Binding] ダイアログ ボックス (クリックすると拡大表示できます。)
- [Property] の一覧で [Value] を選択します。
- [Binding] ボックスの一覧をドロップ ダウンします。
- [SurveysBindingSource] を展開して [RateSalesRep] を選択します。
- [OK] をクリックします。
- ドキュメント内の各コントロールに対し、手順 1 から 7 を実行します。各コントロールの連結先フィールドについては、表 3 を参照してください。
表 3. コントロール別連結先
| コントロール |
連結するプロパティ |
連結先フィールド |
| nupdnSalesRep |
Value |
SurveysBindingSource - RateSalesRep |
| chkCourteous |
Checked |
SurveysBindingSource - RateCourteous |
| chkEfficiency |
Checked |
SurveysBindingSource - RateEfficiency |
| nupdnOverall |
Value |
SurveysBindingSource - RateOverall |
| chkSurveyed |
Checked |
SurveysBindingSource - Surveyed |
外部キーを使用してコントロールを Customers テーブル (子テーブル) 内のフィールドに連結するには
- [Data Sources] ウインドウで [Customers] を展開します。
- [Customers] 配下にある [CustomerID] を選択し、ドキュメント内の bkCustomerID ブックマークの上にドラッグします。
メモ これで、bkCustomerID ブックマークは CustomersBindingSource オブジェクトに連結されました。[CustomerID] フィールドを [Data Sources] ウインドウからドロップしたときに、CustomersBindingSource オブジェクトがデザイナにより自動的にコンポーネント トレイに追加されます。
- [Customers] 配下にある [CompanyName] を選択し、ドキュメント内の [bkCompanyName] ブックマークの上にドラッグします。
- [Customers] 配下にある [ContactName] を選択し、ドキュメント内の [bkContactName] ブックマークの上にドラッグします。
- [Customers] 配下にある [Phone] を選択し、ドキュメント内の [bkPhone] ブックマークの上にドラッグします。
- コンポーネント トレイで [CustomersBindingSource] を選択します。
- [Properties] ウインドウで、DataSource プロパティに SurveysBindingSource を設定します。
- DataMember プロパティに FK_Survey_Customers を設定します。
- [Solution Explorer] で、[ThisDocument.vb] を右クリックします。ショートカット メニューで [View Code] をクリックします。
- GetSurveys という新規プライベート メソッドを ThisDocument クラスに追加します。
Private Sub GetSurveys()
Me.CustomersTableAdapter.Fill(Me.NorthwindDataSet.Customers)
Me.SurveysTableAdapter.Fill(Me.NorthwindDataSet.Surveys)
End Sub
- デザイナが ThisDocument_Startup に追加した、テーブル アダプタを自動的に入力するコードを削除します。
'TODO: 以下の行を削除して 'NorthwindDataSet.Customers'のデフォルト AutoFill を削除します。
If Me.NeedsFill("NorthwindDataSet") Then
Me.CustomersTableAdapter.Fill(Me.NorthwindDataSet.Customers)
End If
'TODO: 以下の行を削除して 'NorthwindDataSet.Surveys' のデフォルト AutoFill を削除します。
If Me.NeedsFill("NorthwindDataSet") Then
Me.SurveysTableAdapter.Fill(Me.NorthwindDataSet.Surveys)
End If
- ThisDocument_Startup に GetSurveys への呼び出しを追加します。
Private Sub ThisDocument_Startup(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Startup
Me.CreateActionsPane()
Me.AddPopupMenu()
'コントロールのフォントを標準スタイルと一致するようフォーマットします。
Dim ft As System.Drawing.Font = Me.NormalFont
Me.nupdnSalesRep.Font = ft
Me.chkCourteous.Font = ft
Me.chkEfficiency.Font = ft
Me.nupdnOverall.Font = ft
Me.chkSurveyed.Font = ft
Me.GetSurveys()
End Sub
チェックポイント
- [File] メニューで [Save All] をクリックします。
- [Debug] メニューで [Start] をクリックし、プロジェクトをビルドして、実行します。Customer Satisfaction Survey.doc ドキュメントが Word で開かれます。
- データ ソースの 1 件目のレコード (Order 10248 for VINET) の値 が、図 18 に示すように、ブックマーク コントロールと Windows Forms コントロール上に表示されることに注目してください。

図 18. データ連結コントロールが埋め込まれたドキュメント (クリックすると拡大表示できます。)
- 変更を保存せずにドキュメントを閉じて、Word を終了します。
ビューのレコードをナビゲートするには
- cbctlClick 内のコードを、イベントを発生させたコマンド ボタン バーに応じて MovePrevious または MoveNext のいずれかを DataConnector 上で実行する次のコードで置き換えます。
Private Sub cbctlClick(ByVal Ctrl As Office.CommandBarButton, _
ByRef CancelDefault As Boolean)
Me.Application.ScreenUpdating = False
Try
'クリックされたボタンのタグに応じたアクションを実行します。
Select Case Ctrl.Tag
Case "MOVE_PREVIOUS"
Me.SurveysBindingSource.MovePrevious()
Case "MOVE_NEXT"
Me.SurveysBindingSource.MoveNext()
End Select
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
Me.Application.ScreenUpdating = True
End Try
End Sub
- ビュー内の現在の位置に応じて、ナビゲーション コマンド バー ボタンを有効または無効にするよう、bkMenu_BeforeRightClick を修正します。
Private Sub bkMenu_BeforeRightClick(ByVal sender As Object, _
ByVal e As Microsoft.Office.Tools.Word.ClickEventArgs) _
Handles bkMenu.BeforeRightClick
'現在の Customer ID のテキスト、およびデータ ソース内の現在の位置を元に、コマンドバー ボタン プロパティを更新します。
cbctlShowByCustID.Caption = _
"Show Only Orders for " & Me.bkCustomerID.Text
If Me.bkCustomerID.Text = "" Then
cbctlShowByCustID.Enabled = False
Else
cbctlShowByCustID.Enabled = True
End If
Dim nPos As Integer = Me.SurveysBindingSource.Position
cbctlPrevious.Enabled = (nPos > 0)
cbctlNext.Enabled = ( _
nPos + 1 < Me.SurveysBindingSource.Count)
'ポップアップを表示し、デフォルトのアクションを取り消します。
cbPopup.ShowPopup()
e.Cancel = True
End Sub
ビュー内の現在の位置とレコード数を表示するには
- アクション ペイン内の SubmitPane コントロールのラベルを更新し、ドキュメント内の現在の位置とレコード数を表示する、UpdatePane という名前のプライベート メソッドを ThisDocument クラスに追加します。
Private Sub UpdatePane()
'SubmitPane コントロールを更新し、データ ソース内の現在の位置とデータ ソース内のレコード数を表示します。
If Not (Me.ucSubmitPane Is Nothing) Then
Dim sCaption As String
Dim nCurrentRecord As Integer = Me.SurveysBindingSource.Position + 1
Dim nRecords As Integer = Me.SurveysBindingSource.Count
sCaption = nCurrentRecord & " of " & nRecords
Me.ucSubmitPane.Message = sCaption
End If
End Sub
- [Class Name] の一覧で [SurveysBindingSource] を選択し、[Method Name] の一覧で [ListChanged] を選択します。
- リストに変更があったときにウインドウ キャプションを更新するコードを SurveysBindingSource_ListChanged に追加します。
Private Sub SurveysBindingSource_ListChanged(ByVal sender As Object, _
ByVal e As System.ComponentModel.ListChangedEventArgs) _
Handles SurveysBindingSource.ListChanged
Me.UpdatePane()
End Sub
- [Method Name] の一覧で [PositionChanged] を選択します。
- 既存のリスト内の位置に変更があったときにウインドウ キャプションを更新するコードを SurveysBindingSource_PositionChanged に追加します。
Private Sub SurveysBindingSource_PositionChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles SurveysBindingSource.PositionChanged
Me.UpdatePane()
End Sub
チェックポイント
- [File] メニューで [Save All] をクリックします。
- [Debug] メニューで [Start] をクリックし、プロジェクトをビルドして、実行します。Customer Satisfaction Survey.doc ドキュメントが Word で開かれます。アクション ペインにデータ ソース内の現在の位置 (100 個中 1 個目) が表示されている点、ビュー内の 1 件目の注文が [Order 10248] となっている点に注目してください。
- 調査票でコントロールにデータを入力します。
メモ 次の手順を実行中、再描画がうまく行われない場合があります (Visual Studio 2005 Beta 2 をお使いの場合のみ)。テーブル中のコントロールが重ねて表示されたり、二重に表示される場合は、ページを上下に移動するなどしてウインドウを強制的に再描画させることで再描画の問題は解決します。
- ブックマーク [bkMenu] を右クリックし、ポップアップ メニューで [Next Order] をクリックしてデータ ソース内の次のレコードに移動します。データ ソース内の現在の位置 (100 個中 2 個目) を反映して、アクション ペインの内容が変更され、ビューには [Order 10249] が表示されていることに注目してください。
- ブックマーク [bkMenu] を右クリックし、ポップアップ メニューで [Previous Order] をクリックしてデータ ソース内の 1 件目のレコードに戻ります。
- 入力内容 (実際のデータ ソースではなく、インメモリ データセットに格納されている内容) が、Order 10248 のビューに復元されます。
- 変更を保存せずにドキュメントを閉じてし、Word を終了します。
実習 3: データのフィルタ処理
データ ソース内のデータに対してフィルタ処理を行うには
- [Solution Explorer] で、[ThisDocument.vb] を右クリックします。ショートカット メニューで [View Code] をクリックします。
- すべてのデータを表示する、指定のカスタマのデータのみを表示する、調査が終了したデータのみを表示するという、3 つのフィルタリング条件を、cbctlClick のSelect Case 構文に追加します。
Private Sub cbctlClick(ByVal Ctrl As Office.CommandBarButton, _
ByRef CancelDefault As Boolean)
Me.Application.ScreenUpdating = False
Try
'クリックされたボタンのタグに応じたアクションを実行します。
Select Case Ctrl.Tag
Case "MOVE_PREVIOUS"
Me.SurveysBindingSource.MovePrevious()
Case "MOVE_NEXT"
Me.SurveysBindingSource.MoveNext()
Case "SHOW_ALL"
Me.SurveysBindingSource.EndEdit()
Me.SurveysBindingSource.RemoveFilter()
Case "SHOW_BY_CUSTID"
Me.SurveysBindingSource.EndEdit()
Me.SurveysBindingSource.Filter = _
String.Format(" CustomerID = '{0}' ", _
Me.bkCustomerID.Text)
Case "SHOW_COMPLETED"
Me.SurveysBindingSource.EndEdit()
Me.SurveysBindingSource.Filter = "Surveyed=1"
End Select
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
Me.Application.ScreenUpdating = True
End Try
End Sub
チェックポイント
- [File] メニューで [Save All] をクリックします。
- [Debug] メニューで [Start] をクリックし、プロジェクトをビルドして、実行します。Customer Satisfaction Survey.doc ドキュメントが Word で開かれます。
- アクション ペインの変化を観察します: 現在、ビューには、テーブル内のレコードが 100 件が存在し、レコード 1 が表示されています。
- [bkMenu] ブックマークを右クリックします。ショートカット メニューで [Show Only Orders for VINET] をクリックします。
- アクション ペインのメッセージを確認します。現在ビューは、Customer ID VINET に関連付けされた Surveys テーブル内のレコード 3 件のみを表していることが示されています。
- [bkMenu] ブックマークを右クリックし、[Previous Order] または [Next Order] をクリックして、VINET のレコードにナビゲートします。
- [bkMenu] ブックマークを右クリックし、[Show All Orders] をクリックしてすべてのレコードを表示させます。
- 1 つまたは複数のレコードで、入力を完了させます。調査が終了したレコードについては、[Completed] にチェックを付けます。
- [bkMenu] ブックマークを右クリックし、[Show Only Completed Surveys Ready to Submit] をクリックして調査の終了チェックを付けた調査データのみを表示させます。
- 変更を保存せずにドキュメントを閉じて、Word を終了します。
実習 4: データの挿入と更新
データを更新するには
- [Solution Explorer] で、[ThisDocument.vb] を右クリックします。ショートカット メニューで [View Code] をクリックします。
- データベース内の調査データを更新できるよう、ボタンがクリックされたときに SubmitPane コントロールにより発生する OnSubmit イベント内のコードを差し替えます。
Private Sub ucSubmitPane_OnSubmit() Handles ucSubmitPane.OnSubmit
'現在の編集を終了します。
Me.SurveysBindingSource.EndEdit()
'Surveyed フィールドに 1 が設定されている行を選択します。
Dim rows() As CustomerSurvey.NorthwindDataSet.SurveysRow
rows = Me.northwindDataSet.Surveys.Select("Surveyed=1")
'選択された行が 1 つでもあれば、データベースの更新に
'進みます。それ以外は、メッセージを表示します。
If rows.Length > 0 Then
Try
Dim nCount As Integer
'更新処理を実行し、更新対象の行に関する
'メッセージを表示します。
nCount = Me.surveysTableAdapter.Update(rows)
MessageBox.Show("Number of surveys submitted: " & nCount)
GetSurveys()
Catch ex As Exception
MessageBox.Show(ex.Message, "Error updating records")
End Try
Else
MessageBox.Show("None of the records have been marked as " & _
"complete. No updates to the database have been made.")
End If
End Sub
チェックポイント
- [File] メニューで [Save All] をクリックします。
- [Debug] メニューで [Start] をクリックし、プロジェクトをビルドして、実行します。Customer Satisfaction Survey.doc ドキュメントが Word で開かれます。
- コントロールに値を入力し、[Completed] チェック ボックスをオンにして Order 10248 (VINET) の調査を完了させます。
- アクション ペインで [Submit] をクリックします。1 つの調査データがサブミットされたことを示すメッセージが表示されます。次のレコードが表示されます。
- コントロールに値を入力し、[Completed] チェック ボックスをオンにして Order 10249 (TOMSP) の調査を完了させます。ただし、アクション ペインでは、調査データをサブミットする [Submit] はまだクリックしないでください。
- bkMenu ブックマークで右クリックします。ショートカット メニューで [Next Order] をクリックし、次のレコードを表示します。
- コントロールに値を入力し、[Completed] チェック ボックスをオンにして、Order 10250 (HANAR) の調査を完了させます。
- [Submit] をクリックします。2 つの調査データがサブミットされたことを示すメッセージが表示されます。
- 変更を保存せずにドキュメントを閉じて、Word を終了します。
演習 4 - Word ドキュメントにデータをキャッシュする
この演習では、オフライン使用のために Word ドキュメントにデータをキャッシュする方法について説明します。ドキュメントにデータがキャッシュされると、読み取りおよび書き込みは、ドキュメントのデータ キャッシュに対して行います。
所要時間:
- 実習 1: Word ドキュメントにデータをキャッシュする - 20 分
この演習では、演習 3 で作成した CustomerSurvey プロジェクトを使用します。
実習 1: Word ドキュメントにデータをキャッシュする
キャッシュされたデータセットをドキュメントに追加するには
- [Solution Explorer] で [ThisDocument.vb] を右クリックします。ショートカット メニューで [View Code] をクリックします。
- ドキュメント キャッシュに DataSet を格納するパブリック変数を ThisDocument クラスに追加します。
<Cached()> Public dsCached As CustomerSurvey.NorthwindDataSet
- キャッシュされたデータセットを使用しているか否かを示す、プライベート メンバ変数を ThisDocument クラスに追加します。
Private bCached As Boolean
- ドキュメントの保存時にデータをキャッシュするコードを ThisDocument_BeforeSave に追加します。
Private Sub ThisDocument_BeforeSave(ByVal sender As Object, _
ByVal e As Microsoft.Office.Tools.Word.SaveEventArgs) _
Handles Me.BeforeSave
Me.SurveysBindingSource.EndEdit()
dsCached = Me.NorthwindDataSet
End Sub
- キャッシュ データがドキュメント内にあるときはキャッシュからデータを使用するよう、GetSurveys メソッド内のコードを差し替えます。
Private Sub GetSurveys()
bCached = Not (dsCached Is Nothing)
Try
Me.Application.ScreenUpdating = False
If Not bCached Then
'このドキュメントにキャッシュされたデータが存在しない場合は、
'ライブ データ ソースからデータセットを取得します。
Me.CustomersTableAdapter.Fill(Me.NorthwindDataSet.Customers)
Me.SurveysTableAdapter.Fill(Me.NorthwindDataSet.Surveys)
Else
'キャッシュからデータセットをロードします。
Me.NorthwindDataSet = dsCached
End If
'データ コネクタの設定を行います。
Set up the data connectors.
Me.SurveysBindingSource.DataMember = "Surveys"
Me.SurveysBindingSource.DataSource = Me.NorthwindDataSet
Me.CustomersBindingSource.DataMember = "FK_Survey_Customers"
Me.CustomersBindingSource.DataSource = Me.SurveysBindingSource
Me.Application.ScreenUpdating = True
Catch ex As Exception
Me.Application.ScreenUpdating = True
MessageBox.Show(ex.Message, "Error retrieving data")
End Try
End Sub
- ビューの表示がキャッシュ データである場合、[SubmitPane] 内に、"[Cached]"というテキストを表示させ、ボタンのテキストを "Connect and Submit"と表示させるよう、UpdatePane メソッドを修正します。
Private Sub UpdatePane()
'SubmitPane コントロールを更新し、データソース内の現在の位置とデータ ソース内のレコード数を表示します。
If Not (Me.ucSubmitPane Is Nothing) Then
Dim sCaption As String
Dim nCurrentRecord As Integer = Me.SurveysBindingSource.Position + 1
Dim nRecords As Integer = Me.SurveysBindingSource.Count
sCaption = nCurrentRecord & " of " & nRecords
If bCached Then sCaption &= vbCrLf & "[Cached]"
Me.ucSubmitPane.Message = sCaption
If bCached Then
Me.ucSubmitPane.ButtonText = "Connect and Submit"
Else
Me.ucSubmitPane.ButtonText = "Submit"
End If
End If
End Sub
- キャッシュ データセットを元にした更新を処理できるよう、SubmitPane コントロールの OnSubmit イベントを修正します。
Private Sub ucSubmitPane_OnSubmit() Handles ucSubmitPane.OnSubmit
'現在の編集を終了します。
Me.SurveysBindingSource.EndEdit()
'Surveyed フィールドに 1 が設定されている行を選択します。
Dim rows() As CustomerSurvey.NorthwindDataSet.SurveysRow
rows = Me.northwindDataSet.Surveys.Select("Surveyed=1")
'選択された行が 1 つでもあれば、データベースの更新に
'進みます。それ以外は、メッセージを表示します。
If rows.Length > 0 Then
Try
Dim nCount As Integer
'更新処理を実行し、更新対象の行に関する
'メッセージを表示します。
nCount = Me.surveysTableAdapter.Update(rows)
MessageBox.Show("Number of surveys submitted: " & nCount)
If bCached Then
dsCached.Clear()
dsCached = Nothing
End If
GetSurveys()
Catch ex As Exception
MessageBox.Show(ex.Message, "Error updating records")
End Try
Else
MessageBox.Show("None of the records have been marked as " & _
"complete. No updates to the database have been made.")
End If
End Sub
チェックポイント
- [File] メニューで [Save All] をクリックします。
- [Debug] メニューで [Start] をクリックし、プロジェクトをビルドして、実行します。Customer Satisfaction Survey.doc ドキュメントが Word で開かれます。
- 現在データ ソースには 97 件の調査レコードが存在しており、現在のレコードは Order 10251 for VICTE となっています。
- Orders 10251 と 10252 の調査を完了させます。ただし、サブミットは行いません。
- [File] メニューで [Save As] をクリックします。[Save As] ダイアログ ボックスが表示されます。
- ファイル名に Cached.doc と指定してファイルを保存します。
- Cached.doc を閉じます。
- Cached.doc を開きます。
- アクション ペインには、図 19 に示すように、現在参照しているデータがキャッシュ データであることが示されます。また、10251 と 10252 での入力内容が格納されていることにも注目してください。

図 19. 作業中のデータがキャッシュ データであることを示すアクション ペイン (クリックすると拡大表示できます。)
- Order 10253 に移動し、調査を完了させます。
- アクション ペインで [Connect and Submit] をクリックします。3 つの調査データがサブミットされたことを示すメッセージが表示されます。調査データがサブミットされると、アクション ペインにはキャッシュ データを作業中ではなくなったことが示されます。このとき、ビューには 94 個の未記入の調査データが存在しています。
- ドキュメントを閉じて、Word を終了します。
まとめ
全演習を終了し、Microsoft Visual Studio 2005 Tools for the Microsoft Office System Beta 2 および Microsoft Office Word 2003 を使用して、顧客調査アプリケーションを作成する方法を学習しました。また、Windows Forms コントロールの使い方、ホスト コントロール、アクション ペイン、データ連結についても学習しました。
追加資料
追加情報として、以下の資料を参照してください。
|