Microsoft Excel セミナーテキスト VBA活用編 [2000

Microsoft Excel
®
セミナー テキスト VBA 活用編
[2000/2002 対応]
講習の手引き
この手引きは、『Microsoft® Excel セミナー テキスト VBA 活用編[2000/2002 対応]
』を
使ってセミナーを実施される講師の方に、ご参考にして頂きたい各情報(セミナー実施時の注
意事項、所要時間、本文内容の補足)をまとめたものです。
より良いセミナーを行うために、この手引きがお役に立てば幸いです。
日経BPソフトプレス
セミナー実施時の注意
以下の点に注意して、セミナーを実施しましょう。
●テキストに記載されている名称で説明すること(講師がテキストに記載されている名称と異
なる名称で説明すると受講者は混乱するため)。
●受講者からの質問に対して自信のないことは即答を避け、調査後の折り返し回答を徹底する
こと。
●英数字の入力は、特に指示がなければ半角で入力するよう説明すること。
セミナー実施前に、次の環境を確認しておきましょう。
● Office アシスタント ……………………………………………………………………………… オフ
●ツールバーとメニュー
[ツール]メニューの[ユーザー設定]の[オプション]で、次の設定を行います。
・ Excel 2000 の場合
[[標準]と[書式設定]ツールバーを横に並べて配置する] ……………………………オフ
[最近使用したコマンドを最初に表示する]…………………………………………………オフ
・ Excel 2002 の場合
[[標準]と[書式設定]ツールバーを 2 行に並べて配置する] …………………………オン
[常にすべてのメニューを表示する]…………………………………………………………オン
●[標準]、[書式設定]ツールバーが表示された状態
●マクロのセキュリティレベルを[中]に設定した状態
●プリンタをセットアップした状態
使用データについての注意
[ExcelVBA 活用]フォルダと、[ExcelVBA 活用]フォルダ内の[完成]フォルダには、いく
つかの同じ名前のファイルが収録されています。これは、プロシージャ実行時に操作対象とな
るファイル名がプロシージャ内に記述されていることから、実習ファイルとは別のファイル名
(例:「2 章完成」)に変更すると、正しくプロシージャを実行できなくなってしまうためです。
セミナーを実施する場合には、実習で使用するデータと完成データを間違えないようにしまし
ょう。
1
セミナーの所要時間
このセミナーテキストの標準セミナー時間は 6 時間です。
なお、各章、各節の時間は、「はじめに」に記載されている対象者で行った場合の目安です。
第1章
VBA の基礎知識
1.1 VBA とは
第2章
5分
1.3 オブジェクトとは
5分
オブジェクトの操作
25 分
2.3 ワークシートを印刷するには
15 分
イベントプロシージャ
3.2 イベントプロシージャを作成するには
変数の宣言
4.1 変数の宣言とは
第5章
40 分
15 分
15 分
10 分
エラー処理
さまざまな制御構文
6.1 高度な条件式を作成するには
第8章
5分
15 分
4.3 変数の宣言を強制するには
5.2 エラー処理構文を作成するには
第7章
20 分
4.2 変数の型を宣言するには
5.1 エラーの回避とは
第6章
80 分
40 分
2.2 セルを操作するには
3.1 イベントプロシージャとは
第4章
5分
1.2 プロシージャを作成するには
2.1 ブックを操作するには
第3章
15 分
20 分
5分
15 分
70 分
20 分
6.2 If 文をネストするには
15 分
6.3 ElseIf で複数の条件式を利用するには
20 分
6.4 処理を繰り返すには
15 分
ユーザー定義関数
40 分
7.1 ユーザー定義関数を作成するには
30 分
7.2 ユーザー定義関数を利用するには
10 分
ユーザーフォーム
8.1 ユーザーフォームとは
8.2 ユーザーフォームを作成するには
75 分
5分
70 分
2
本文の注意点と参考情報
本文の章立てに沿って、主な注意点、参考情報をまとめました。セミナーを実施する際の参考と
してください。
第1章
1.1
VBA の基礎
VBA とは
■プロシージャ、モジュール、プロジェクト
プロシージャ(p.2)
本テキストでは、"Sub プロシージャ" と "Function プロシージャ" について扱います。
Function プロシージャについては、
「7.1.1
Function プロシージャ」で解説します。
モジュール(p.2)
本テキストでは、"標準モジュール"、"オブジェクトモジュール"、および "フォームモジュー
ル" の 3 種類を扱います。
用途や機能が比較できるよう、参考までに 4 種類のモジュールを紹介します。
・標準モジュール
Excel からマクロとして実行できるプロシージャや、ワークシートに入力できるユーザー
定義関数を作成するときに使用します。
・オブジェクトモジュール
ブックを開いたときやワークシートをアクティブにしたときに、自動的に実行されるプロ
シージャを作成する場合に使用します。「3.2
イベントプロシージャを作成するには」で
解説します。
・フォームモジュール
独自のダイアログボックスとして使用できるユーザーフォームを作成するときに使用しま
す。
「8.2.4
イベントプロシージャの作成」で解説します。
・クラスモジュール
新しいオブジェクトを作成するときに使用します。
1.2
プロシージャを作成するには
②コメント(p.4)
コメントに入力するシングルクォーテーション(')の代わりに、「Rem」と入力することも
できます。「Rem」を使用する場合は、「Rem」とコメント文字列の間に、半角スペースを入
力します。
ステートメントの右側にシングルクォーテーション(')を入力すると、ステートメントに続
けて、コメントを行の途中から入力できます。「Rem」を使用して、ステートメントの右側
にコメントを入力する場合は、下記の例のように「Rem」の前にコロン(:)を入力する必要
があります。
Worksheets(1).Name = sName : Rem シート名を変数 sName の値に変更
コメントは説明を記述する目的だけでなく、プロシージャの一部のステートメントをコメン
トにして、一時的に処理の対象外にし、テストを行うときなどにも使用できます。Visual
Basic Editor で[編集]ツールバーを表示し、
[コメントブロック]ボタンを使用する
と、複数のステートメントを効率よくコメントにすることができます。
[非コメントブ
ロック]ボタンを使用すると、コメントを解除して、ステートメントに戻すことができます。
[編集]ツールバーは、Visual Basic Editor で[表示]メニューの[ツールバー]をポイン
トし、[編集]をクリックすると表示できます。
3
1.3
オブジェクトとは
■メソッド(p.5)
メソッドにより、引数の数や内容が異なります。
第2章
2.1
オブジェクトの操作
ブックを操作するには
2.1.1
ブックを参照する(p.8)
VBA でオブジェクトやプロパティを特定することや、特定するための情報を "参照" といいま
す。たとえば、Workbook オブジェクトを参照するステートメントを記述すると、プロシー
ジャでブックを操作できます。
オブジェクトを参照するステートメントを記述しただけでは、ワークシートやセルはアクティ
ブになったり、選択されることはありません。オブジェクトをアクティブにしたり選択するに
は、オブジェクトを参照するステートメントとともに Activate メソッドや Select メソッド
を記述します。
■ Workbook(ワークブック)オブジェクト(p.9)
"アクティブ" とは、ブックやワークシートなどが操作の対象になっていることを意味します。
また、操作の対象にすることを "アクティブにする" といいます。複数のブックを開いている
場合は、印刷やデータ入力の対象とするブックをアクティブにする必要があります。
ブックを開いた順番でオブジェクトを指定(p.9)
Workbook オブジェクトの Name(ネーム)プロパティは、ブック名を保持するプロパティ
です。
ブック名で Workbook オブジェクトを指定(p.9)
ブック名の拡張子 ".xls" は省略できます。
Workbook オブジェクトの Activate(アクティベート)メソッドは、ブックをアクティブに
するメソッドです。
2.1.2
ブックのメソッド
■ Open(オープン)メソッド(p.10)
Open メソッドは、Workbooks コレクションのメソッドです。Workbooks コレクションに、
ブックを開いて追加するという処理を実行します。下記のように、Workbook オブジェクト
に対して Open メソッドを実行しないように注意しましょう。
×(誤った記述)
Workbooks("社員登録.xls").Open
Workbook オブジェクト
○(正しい記述)
Workbooks.Open "社員登録.xls"
Workbooks コレクション
他に Workbooks コレクションのメソッドには、新しいブックを作成する "Add メソッド" が
あります。
・ Add(アド)メソッド
書式
Workbooks コレクション.Add
使用例
Workbooks.Add
新規ブックを作成します。
4
ヒント:カレントフォルダ(p.10)
Excel 起動時のカレントフォルダは、Excel の[オプション]ダイアログボックスの[全般]
の[カレントフォルダ名]で設定できます。[オプション]ダイアログボックスは、[ツール]
メニューの[オプション]をクリックすると表示されます。[ファイルを開く]ダイアログボ
ックスや[名前を付けて保存]ダイアログボックスでフォルダを変更すると、Excel を終了
するまで、選択したフォルダがカレントフォルダとなります。
ヒント:メソッドの引数について(p.11)
メソッドの引数は、クイックヒントやヘルプでは英語で表記されます。このテキストでは、
引数の意味がわかりやすいように日本語で説明しています。
操作: Visual Basic Editor を起動する
Step2(p.11)
この後の操作で、カレントフォルダからブックを開くプロシージャを作成します。Excel の
カレントフォルダを[ExcelVBA 活用]に統一するため、マイコンピュータのウィンドウな
どを使用せずに、必ず Excel の[ファイルを開く]ダイアログボックスを使用してブックを
開きましょう。
Step5(p.12)
Visual Basic Editor は、以前の使用状況によって、表示されるウィンドウやウィンドウサ
イズなどが異なります。表示されているウィンドウやウィンドウサイズ、ツールバーの位置
など、受講者の画面を統一しましょう。
操作:ブックを開く
Step1(p.13)
複数のブックを開いている場合には、プロジェクトエクスプローラに、複数のプロジェクト
が表示されます。複数のプロジェクトが表示されている場合は、他のプロジェクトに誤って
モジュールを挿入しないように、挿入先のプロジェクトをマウスの右ボタンでクリックする
ことを補足しましょう。ボタンやメニューを使ってモジュールを挿入する場合は、プロジェ
クトエクスプローラで、あらかじめ挿入先のプロジェクトを選択してから操作します。
Step2(p.13)
標準モジュールの既定の名前は、"Module +連番" です。"連番" の部分には標準モジュール
を挿入した順に、通し番号が割り当てられます。モジュールの名前は、プロパティウィンド
ウの[(オブジェクト名)]で変更できます。プロパティウィンドウが表示されていない場合
は、[標準]ツールバーの
[プロパティ]ボタンをクリックします。
Step4(p.13)
「sub 新規登録」と先頭文字を小文字で入力すると、Enter キーを押したときに、自動的に
「Sub 新規作成」のように先頭文字が大文字に変換されます。
5
プロシージャの作成には、[プロシージャの追加]ダイアログボックスを利用することもでき
ます。[プロシージャの追加]ダイアログボックスでは、プロシージャの名前、種類、および
適用範囲を指定して、プロシージャを作成できます。種類については、「7.1.1
Function
プロシージャ」の「■ Sub プロシージャと Function プロシージャ」で解説しています。講
習の手引き p.10 の「3.2
イベントプロシージャを作成するには」の「ヒント:"Private"
について」で解説しています。
[プロシージャの追加]ダイアログボックスを表示するには、作成するモジュールにカーソル
を挿入して、[挿入]メニューの[プロシージャ]をクリックします。
Step6(p.14)
ブック名の拡張子 ".xls" は省略できます。
ヒント:インデントの設定(p.14)
ステートメントにインデントを設定すると、プロシージャの開始と終了が区別しやすくなり
ます。インデントを解除する場合には、行頭にカーソルを移動するか、行を範囲選択して、
Shift + Tab キーを押します。
既定では、インデントは半角 4 文字分の間隔が空くように設定されています。Visual Basic
Editor の[ツール]メニューの[オプション]をクリックし、[編集]の[タブ間隔]ボック
スでタブの文字数を変更できます。
操作:図形にプロシージャを登録して実行する
Step2(p.15)
文字列が入力されたオートシェイプを選択する場合は、オートシェイプの外枠をクリックす
ることを補足しましょう。
Step4(p.15)
Esc キーを押して、オートシェイプの選択を解除することもできます。
Step6(p.16)
マクロを登録したオートシェイプをクリックしてもマクロが実行されるようになり、オート
シェイプを選択することができません。オートシェイプを選択するには、Ctrl キーを押しな
がらオートシェイプをクリックするか、
[図形描画]ツールバーの
[オブジェクトの選択]
を使用します。
操作:ブックを閉じる
Step2(p.16)
改行するとインデントの設定が引き継がれることを、説明しましょう。
ブック名の拡張子 ".xls" は省略できます。
操作:ブックに名前を付けて保存する
Step4(p.18)
変数 bName は、Step5 で入力する SaveAs メソッドの引数のブック名に使用します。ブッ
ク名の拡張子は省略できるため、
「bName = newID & newSimei & ".xls"」の「& ".xls"」
6
は省略することができます。
アンパサンド(&)の前後には半角スペースの入力が必要です。入力しない場合は、コンパ
イルエラーが発生します。アンパサンド(&)の前、または後ろがダブルクォーテーション
(")の場合は、間の半角スペースを入力しなくても自動的に挿入されます。
Step5(p.18)
"ActiveWorkbook" は、ブック "社員登録" を参照します。
ヒント: Renge(レンジ)オブジェクト(p.19)
Range プロパティを使用して Range オブジェクトを参照する場合、一般的には
「Range("A3")」と記述しますが、「[A3]」と簡略して記述することもできます。たとえば、
Select メソッドで Range オブジェクトを選択するステートメントは、下記のように記述し
ます。
Range("A1:A10").Select
↓
[A1:A10].Select
■ Range オブジェクトの Value(バリュー)プロパティ(p.19)
オブジェクトにはそれぞれ既定のプロパティがあります。Range オブジェクトの既定のプロ
パティは "Value" です。既定のプロパティは、下記のように記述を省略できます。
newID= Range("B3").Value
↓既定のプロパティ(Value)を省略
newID= Range("B3")
操作:図形にプロシージャを登録して実行する
Step5(p.20)
ブック "社員登録" は、プロシージャ "一覧登録" で、別名を付けて保存します。そのため、こ
の Step でブックを上書き保存せずにプロシージャを実行すると、名前を付けて保存したブ
ックにはプロシージャ "一覧登録" が保存されますが、ブック "社員登録" には保存されません。
この後の「操作:ブック "社員登録" のデータをブック "社員一覧" に追加する」で行う操作に
影響しますので、必ず上書き保存をするように注意しましょう。
注意: Open メソッドでマクロを含むブックを開く場合(p.21)
マクロセキュリティは、マクロを媒体として広がるコンピュータウィルスに、データやコン
ピュータが感染することを防ぐ機能です。マクロセキュリティでは[高]、[中]、[低]の 3
段階のセキュリティレベルを選択できます。セキュリティレベルの初期設定は、Excel
2002 では[高]、Excel 2000 では[中]に設定されています。ただし、Excel 2000 は、
Outlook 電子メールセキュリティアップデートが適用されていると、初期状態で[高]にな
ります。
2.2
セルを操作するには
2.2.1
セルを参照する
■ Offset(オフセット)プロパティ(p.23)
2 つ目の使用例のように、「Offset(0,-2)」と行を指定する引数に「0」を指定すると、基
準となるセルから列方向にのみ移動したセルを参照できます。また、「Offset(,-2)」のよう
に行を指定する引数を省略する記述方法もあります。行方向にのみ移動してセルを参照する
には、同様に、列を指定する引数に「0」を指定して「Offset(1,0)」、または、カンマごと
引数を省略して「Offset(1)」と記述します。
7
2.2.2
リストに新しいデータを追加する
ヒント:プロシージャ "一覧登録" のセル操作の処理内容(p.29)
時間に余裕があれば、ヒントを使用して、ステートメントの詳細を解説しましょう。
ヒント:アクティブセル領域に罫線を引くには(p.29)
時間に余裕があれば、リスト "社員一覧" に罫線を設定した状態で、実際にステートメントを
入力して実行してみましょう。
2.3
ワークシートを印刷するには
操作:ページ数を指定してワークシートを印刷する
Step4(p.31)
入力したステートメントの「Worksheets(1)」は、シート "社員一覧" を参照します。
Step9(p.32)
プリンタをセットアップしていない状態でプロシージャを実行すると、実行時エラーが発生
します。プリンタがセットアップされていることを確認してから、セミナーを実施しましょ
う。
ヒント:名前付き引数(p.33)
本テキストでは、名前付き引数を使わずに、標準の引数の指定方法で記述します。
第 3 章 イベントプロシージャ
3.1
イベントプロシージャとは
■イベント(p.36)
セミナー中に説明する必要はありませんが、参考までに、その他のイベントを紹介します。
ブックのイベント
イベント
発生するタイミング
AddinInstall
ブックがアドインとして組み込まれたとき
AddinUninstall
ブックのアドインとしての組み込みを解除したとき
BeforeClose
ブックを閉じる前
BeforePrint
印刷する前
BeforeSave
ブックを保存する前
Deactivate
ブックが非アクティブになったとき
PivotTableCloseConnection
ピボットテーブルのデータソースへの接続が閉じた後
PivotTableOpenConnection
ピボットテーブルのデータソースへの接続が開かれた後
※ Excel 2000 にはありません。
※ Excel 2000 にはありません。
SheetActivate
シートがアクティブになったとき
SheetBeforeDoubleClick
ワークシートをダブルクリックしたとき
SheetBeforeRightClick
ワークシートを右クリックしたとき
SheetCalculate
ワークシートを再計算したり、グラフでデータをプロットして変更
SheetChange
ワークシートのセルが変更されたとき
した後
SheetDeactivate
ワークシートが非アクティブになったとき
SheetFollowHyperlink
Excel のハイパーリンクをクリックしたとき
SheetPivotTableUpdate
ピボットテーブルのシートが更新された後
※ Excel 2000 にはありません。
SheetSelectionChange
ワークシートで選択範囲を変更したとき
WindowActivate
ブックのウィンドウがアクティブになったとき
WindowDeactivate
ブックのウィンドウが非アクティブになったとき
WindowResize
ウィンドウサイズを変更したとき
8
ワークシートのイベント
イベント
発生するタイミング
BeforeRightClick
セルを右クリックしたとき
Calculate
ワークシートを再計算したとき
Deactivate
ワークシートが非アクティブになったとき
FollowHyperLink
ワークシートのハイパーリンクをクリックしたとき
PivotTableUpdate
ピボットテーブルが更新された後
※ Excel 2000 にはありません。
3.2
イベントプロシージャを作成するには
ヒント: InputBox(インプットボックス)関数(p.39)
InputBox 関数には、「メッセージ」以外に、下記の引数があります。説明する必要はありま
せんが、参考までに引数を紹介します。
書式
InputBox(メッセージ, タイトル, 既定値, 水平位置, 垂直位置, ヘルプ, コン
引数
タイトル:ダイアログボックスのタイトルバーに表示される文字列を指定し
テキスト)
ます。文字列を直接指定する場合は、ダブルクォーテーション
(")で囲みます。省略した場合は、"Microsoft Excel" と表示さ
れます。
既定値:テキストボックスに既定で入力される文字列を設定します。省略し
た場合は、テキストボックスは空欄になります。
水平位置:画面の左端からダイアログボックスの左端までの水平方向の距離
を、twip 単位(56.7twips=1mm)で示す数式で指定します。
省略すると、水平方向に対して画面の中央に表示されます。
垂直位置:画面の上端からダイアログボックスの上端までの垂直方向の距離
を、twip 単位で示す数式で指定します。省略すると、垂直方向
に対して画面の上端から約 1/3 の位置に表示されます。
ヘルプファイル:ダイアログボックスのヘルプを表示するために、使用する
ヘルプファイルの名前を指定します。次の引数のコンテキ
ストと併せて指定します。
コンテキスト:ヘルプトピックに指定したコンテキスト番号を表す数式を指
定します。
使用例
hiduke = InputBox("受付日を入力", "日付の入力", #2003/10/1#)
テキストボックスに既定値を入力した、下の図のようなダイアログボックス
を表示して、テキストボックスの入力値を変数 hiduke に代入します。
InputBox 関数では、通常戻り値を使用するため、引数全体をかっこ()で囲むことを説明し
ましょう。[OK]ボタンをクリックしたときの関数の戻り値はテキストボックスの入力値で
すが、[キャンセル]ボタンをクリックしたときの戻り値は、空の文字列("")になります。
InputBox 関数とは別に、InputBox メソッドがあります。InputBox メソッドは
Application オブジェクトに対して使用します。たとえば、テキストボックスに入力するデ
ータの種類を制限したり、ダイアログボックスの表示中に Excel のワークシートを操作でき
るようにしたい場合に使用します。詳しくは、Visual Basic のヘルプを参照してください。
9
ヒント:"Private" について(p.40)
複数のプロシージャで使用する共通の処理を独立した1つのプロシージャにすると、各プロ
シージャに何度も同じ処理を記述せずに、共通ステートメントを記述したプロシージャ名を
記述するだけで済みます。また、処理に変更があった場合にも、共通処理を記述したプロシ
ージャを修正するだけで、複数のプロシージャを修正する必要はなく、作業を軽減できます。
作成したプロシージャを呼び出せる範囲を "適用範囲(スコープ)" といいます。"Sub プロ
シージャ名" や "Function プロシージャ名" の前に、適用範囲を指定すると、そのプロシー
ジャを呼び出せるプロシージャの範囲を定義できます。
適用範囲で分類すると、プロシージャには下記の 2 種類があります。
・ Private プロシージャ
同じモジュールのプロシージャからのみ呼び出し可能で、他のモジュールのプロシージャ
では利用できないプロシージャです。オブジェクトモジュールに作成したイベントプロシ
ージャは、既定で Private プロシージャになります。
使用例
Private Sub wsprint
プロシージャ "wsprint" は、同じモジュールのプロシージャでのみ呼び出
しできます。
・ Public プロシージャ
すべてのモジュールのプロシージャから呼び出せるプロシージャです。Excel のワークシ
ートで使用することもできます。プロシージャの適用範囲を省略すると Public プロシージ
ャになります。
使用例
Public Sub wsprint
プロシージャ "wsprint" は、すべてのモジュールのプロシージャから呼び
出しできます。
適用範囲が Public の Sub プロシージャを作成すると、Excel の[マクロの登録]ダイアログ
ボックスのマクロの一覧に表示されます。
操作:イベントプロシージャを実行する
Step6(p.42)
ブック "試験管理" は、引き続き第 4 章で使用します。ブックを閉じないように補足しましょ
う。
第4章
4.1
変数の宣言
変数の宣言とは
■変数の宣言とは(p.44)
変数の値を保持する期間を短く、また、参照できる範囲を狭くすると、メモリを節約するこ
とができます。
4.1.2
変数の有効期間と適用範囲(スコープ)
有効期間とは(p.45)
プロシージャの実行が終了するときに変数を消去する使い方では、プロシージャを終了する
たびにメモリの領域が解放されます。プロシージャを終了しても変数を保持する使い方では、
メモリ領域を占有し続けます。
ヒント:変数に格納した値の初期化(p.45)
変数はメモリに領域を確保したときに、初期値を持ちます。そのため、ブックを閉じた
り、
[リセット]ボタンをクリックする以外に、変数の初期値を代入するステートメン
トで、変数を初期化することもできます。変数の初期値はデータ型により異なり、たとえば、
数値型ならば "0"、文字列型ならば空の文字列("")が初期値になります。データ型について
10
は「4.2
変数の型を宣言するには」で解説します。
また、End ステートメントを実行すると、メモリに作成されたすべての変数が初期化されま
す。End ステートメントは、コードの実行を終了させるなどの機能もあるため、変数の初期
化に用いる場合はプロシージャの最後に記述します。
適用範囲とは(p.45)
変数を参照できる適用範囲を狭く制限すると、メモリを節約できます。また、適用範囲内に
同じ名前で変数を作成することはできませんが、範囲外であれば作成できるため、変数名の
競合を避けることができます。そのため、適用範囲を狭くすることをお勧めします。
ヒント:他のプロジェクトの変数(p.47)
他のプロジェクトの変数は、参照を設定することで使用できるようになります。参考までに、
参照を設定する手順を紹介します。
① 参照先のプロジェクトを開く。
② プロジェクトエクスプローラで参照先のプロジェクトを選択後、[ツール]メニューの
[VBAProject プロパティ]をクリックする。
③[VBAProject-プロジェクトプロパティ]ダイアログボックスの[全般]で、[プロジェ
クト名]を初期値から変更し、
[OK]をクリックする。
④ プロジェクトエクスプローラで参照元のプロジェクトを選択後、[ツール]メニューの
[参照設定]をクリックする。
⑤[参照設定-VBAProject]ダイアログボックスで、参照先のプロジェクト名(手順③で
設定)のチェックボックスをオンにし、[OK]をクリックする。
ヒント:入力支援による変数の入力(p.48)
入力候補の一覧から、入力値をキーボードで決定する場合は、Tab キー、または Enter キー
を使用します。Tab キーを押して入力値を決定すると、改行せずに、同じ行に続けて入力で
きます。Enter キーを押すと、入力値の決定と改行が行われ、ステートメントが確定します。
4.2
変数の型を宣言するには
■データ型(p.49)
宣言した変数のデータ型とは異なる種類のデータを格納しようとすると "型が一致しません"
というエラーが発生します。また、宣言した変数のデータ型の値の範囲を超えるデータを格
納しようとすると、"オーバーフローしました" というエラーが発生します。
主なデータ型(p.49)
数値を扱うデータ型にはいくつかの種類がありますが、どのデータ型を使えばよいかは、下
記の項目を確認して判断します。
・格納する数値は整数のみかどうか。または小数も含まれるかどうか。
・格納する数値が範囲に収まるかどうか。
・使うことのできるデータ型のうち、使用メモリが最小のデータ型であるかどうか。
小数を含む数値データは、単精度浮動小数点型、倍精度浮動小数点型、および通貨型の変数
で扱うことができます。
単精度浮動小数点型は 7 桁、倍精度浮動小数点型は 15 桁を超えると、その数値は丸められ
ます。たとえば、12,345,678 という 8 桁の数値は、単精度浮動小数点型の変数に
12,345,680 で格納されます。
単精度浮動小数点型や倍精度浮動小数点型の数値で演算を行うと、数値が丸められるなどの
理由で、結果に誤差が生じる場合があります。通貨型は、固定小数点数という数値の表現方
法によって、単精度浮動小数点型や倍精度浮動小数点型と比較して、誤差が発生する可能性
が低く、高い精度ですばやく演算が行えます。そのため、通貨型は、特に正確さを求められ
る演算で使用します。
11
バリアント型の変数は、「主なデータ型」の表で紹介しているすべてのデータを格納すること
ができます。バリアント型の変数は、内部的に、代入された値の種類を分類する処理を行っ
て格納します。たとえば、代入された値が数値ならば倍精度浮動小数点型、文字列ならば文
字列型で格納します。
Null 値は「ヌル」と読み、有効なデータが入っていないことを示します。Empty 値は「エン
プティ」と読み、バリアント型の変数に一度も値が代入されていないことを示します。
Empty 値は、文字列としては空の文字列("")、数値としては "0" と評価されます。Null 値や
Empty 値が入っているかどうかは、IsNull 関数と IsEmpty 関数でそれぞれ確認できます。
どちらの関数も値が入っている場合は True、入っていない場合は False を返します。
4.3
変数の宣言を強制するには
操作:変数の宣言を強制する
Step7(p.54)
ブック "試験管理" は、引き続き第 5 章で使用します。ブックを閉じないように補足しましょ
う。
第5章
5.2
エラー処理
エラー処理構文を作成するには
■ On Error ステートメント(p.57)
「On Error GoTo 0」と記述すると、エラーが発生してもエラー処理ルーチンには移動せず、
エラー処理を無効にすることができます。エラーを回避せずに、意図的にエラーメッセージ
を表示させ、トラブルの原因を確認するときなどに使用します。
■エラー処理ルーチン(p.58)
本テキストでは解説しませんが、エラー処理ルーチンには "Resume ステートメント" も使わ
れます。Resume ステートメントには下記のような記述方法があり、エラーにより中断した
プログラムをどこから再開するかを指定できます。
・ Resume :エラーが発生したステートメントをもう一度実行して再開を試みます。
・ Resume Next :エラーが発生した次のステートメントから再開します。
・ Resume 行ラベル:行ラベルが設定されているステートメントから再開します。
■終了処理(p.58)
Function プロシージャの場合は、Exit Funtion ステートメントで、プロシージャを強制終
了できます。
操作:プロシージャの実行結果を確認する
Step2(p.60)
ここでは、下記の処理の実行順に、プロシージャの結果を確認しています。
・シートの挿入
・セルのコピー
・シート名の変更
p.59 の「操作:実行時エラーを発生させる」で挿入したシート "Sheet2" は、Visual
Basic Editor のプロジェクトエクスプローラでも確認できます。ここでは、セルがコピーさ
れたことも併せて確認するため、Excel に切り替えています。また、シート "Sheet2" は、
シート "2004 年受験者一覧" がアクティブな状態で挿入したため、シート "2004 年受験者
一覧" の左側に追加されます。プロシージャ実行時にアクティブにしているシートによって、
新しいワークシートの挿入位置は異なります。
12
操作:エラー処理を追加する
Step2(p.61)
行ラベル「Err̲Msg:」のコロン(:)の入力を忘れないように注意しましょう。
Step9(p.62)
ブック "試験管理" は、引き続き第 6 章で使用します。ブックを閉じないように補足しましょ
う。
ヒント: MsgBox(メッセージボックス)関数(p.62)
MsgBox 関数には、「メッセージ」以外に、下記の引数があります。説明する必要はありま
せんが、参考までに引数を紹介します。
書式
MsgBox(メッセージ, ボタン, タイトル, ヘルプファイル, コンテキスト)
引数
ボタン:表示されるボタンの種類と個数、使用するアイコンのスタイルなど
を指定します。詳細は Visual Basic のヘルプを参照してください。
省略した場合は、[OK]ボタンのみ表示されます。
タイトル:ダイアログボックスのタイトルバーに表示される文字列を指定し
ます。文字列を直接指定する場合は、ダブルクォーテーション
(")で囲みます。省略した場合は、"Microsoft Excel" と表示さ
れます。
ヘルプファイル:ダイアログボックスのヘルプを表示するために、使用する
ヘルプファイルの名前を指定します。次の引数のコンテキ
ストと併せて指定します。
コンテキスト:ヘルプトピックに指定したコンテキスト番号を表す数式を指
定します。
使用例
button = Msgbox("ブックを閉じますか?", vbOkCancel, "確認")
[OK]ボタンと[キャンセル]ボタンを含む、下の図のようなダイアログ
ボックスを表示して、クリックしたボタンの情報を変数 button に代入しま
す。この使用例では、クリックしたボタンの情報を MsgBox 関数の戻り値
として変数に代入するため、引数全体をかっこ()で囲んでいます。
MsgBox 関数の戻り値については Visual Basic のヘルプを参照してくだ
さい。
MsgBox 関数に限らず、戻り値がある場合は、引数全体をかっこで囲む必要があります。
第6章
6.1
さまざまな制御構文
高度な条件式を作成するには
■比較演算子(p.64)
VBA では、"真" は "True"、"偽" は "False" と表記します。
操作: 2 つの条件を使用して合否判定をする
Step3(p.65)
プロジェクトエクスプローラに "VBAProject(試験管理.xls)" が表示されていない場合は、
上方向にスクロールすることを補足しましょう。
ヒント:ステートメントの分割(p.65)
アンダースコア(̲)の前に、スペースを入力する必要があることを強調しましょう。
13
ヒント:コンテナの利用(p.68)
コンテナの概念を使用して、
「Workbooks("Book1.xls").Worksheets("Sheet1").Range("A1:A10")」のように、
Workbook オブジェクトや Worksheet オブジェクト、Range オブジェクトを 1 つのステー
トメントで記述する場合、Range オブジェクトの Activate メソッドと Select メソッドは
使用できません。
Workbook オブジェクトや Worksheet オブジェクトを限定して、Range オブジェクトの
Activate メソッド、または、Select メソッドを使用する場合は、1 つ前のステートメント
までに上位オブジェクトをアクティブにしておきます。
×(誤った記述)
Worksheets("Sheet1").Range("A1:A10").Select
○(正しい記述)
Worksheets("Sheet1").Activate
Range("A1:A10").Select
6.2
If 文をネストするには
操作: If ステートメントをネストする
Step2(p.70)
「End Sub」の前の行に「End If」と入力することを強調しましょう。
Empty 値は、文字列としては空の文字列("")と評価されるため、IsEmpty 関数を使用する
代わりに、下記のように記述することもできます。
・ IsEmpty 関数を使用する場合
If IsEmpty(Worksheets("合否判定").Range("F4").Value) _
Or IsEmpty(Worksheets("合否判定").Range("G4").Value) Then
・ IsEmpty 関数を使用しない場合
If Worksheets("合否判定").Range("F4").Value = "" _
Or Worksheets("合否判定").Range("G4").Value = "" Then
ヒント:条件式の True、False の省略(p.72)
p.70 の「操作: If ステートメントをネストする」の Step2 で記述したステートメントも、
「=True」を省略していることを補足しましょう。
6.3
ElseIf で複数の条件式を利用するには
操作: ElseIf ステートメントを使い 5 段階評価をする(p.74)
セルに 5 段階のランクを入力するには、プロシージャ "ランク付け" を使用せずに、セルに
「=IF(E4>=180,"A",IF(E4>=160,"B",IF(E4>=140,"C",IF(E4>=120,"D","E"))))」と数式
を直接入力することもできます。しかし、複雑な数式を多くのセルに入力すると、値を入力
したときよりも、ブックのファイル容量が大きくなり、コンピュータへの負荷も増します。
この操作で行ったように、セルに数式を入力せず、プロシージャで計算した結果をセルに値
として代入すると、ブックのファイル容量を抑えて、負荷を軽減できます。
14
Step3(p.74)
入力する行数が多いため、下記の 3 行のステートメントを入力後、この 3 行をコピーすると、
効率よく残りのステートメントを入力できることを補足しましょう。
If ActiveCell.Value >= 180 Then
ActiveCell.Offset(0, 1).Value = "A"
ActiveCell.Offset(0, 1).Font.ColorIndex = 5
「Else」の代わりに、「ElseIf ActiveCell.Value < 120 Then」というステートメントを記
述しても、同じ実行結果が得られます。
ヒント:色の番号について(p.74)
ColorIndex プロパティで指定できるその他の色の番号は、Visual Basic のヘルプでキーワ
ード "PatternColorIndex" を検索すると確認できます。
Step8(p.75)
ヒント:[元に戻す]ボタン
時間に余裕があれば、下記の方法で[元に戻す]ボタンが有効になることを確認しましょう。
①セル F4 の値を消去します。
→
[元に戻す]ボタンが有効になります。
②セル E4 をアクティブにしてから、プロシージャ "ランク付け" を実行します。
→[元に戻す]ボタンが無効になります。
6.4
処理を繰り返すには
■ Do While...Loop(ドゥホワイルループ)ステートメント(p.77)
ループの実行中に処理を終了する条件は満たしていないが、処理を終了したい場合は、Exit
ステートメントを使い、「Exit Do」と記述します。通常は処理を終了するための条件と併せ
て利用します。
操作:条件を満たしている間処理を繰り返す
Step2(p.78)
プロシージャ "ランク付け" は、シート "2004 年受験者一覧" などの他のワークシートでも
使用できるようにしているので、プロシージャではワークシートを限定しません。そのため、
「Range("E4")」のように、セルだけを指定します。Range オブジェクトを選択する Select
メソッドの代わりに、Activate メソッドを記述することもできます。
「IsNumeric(ActiveCell.Value)」は、「IsNumeric(ActiveCell.Value)= True」の
「=True」を省略して、条件式を記述しています。
コード内のコロン(:)は、ステートメントの省略を表します。
ヒント: IsNumeric(イズニューメリック)関数(p.80)
式の結果は Value プロパティで取得できます。先頭に等号(=)を付けた数式がセルに入力
されている場合、Value プロパティには数式の結果、Formula プロパティには数式が保持さ
れます。たとえば、「=1+1」と数式が入力され、"2" と結果が表示されているセルの Value
プロパティを参照すると "2" 、Formula プロパティを参照すると "=1+1" を取得できます。
15
ヒント:その他の Do...Loop ステートメント(p.80)
条件を満たすまで処理を実行するステートメントを記述すると、条件が偽(False)の場合
に処理を実行し、真(True)になると処理を実行せずに繰り返しを終了します。
偽:処理を実行
↓
偽:処理を実行
↓
偽:処理を実行
↓
真:処理は実行せず、繰り返し終了
条件を満たしている間処理を実行するステートメントを記述すると、条件が真(True)の場
合に処理を実行し、偽(False)になると処理を実行せずに繰り返しを終了します。
真:処理を実行
↓
真:処理を実行
↓
真:処理を実行
↓
偽:処理は実行せず、繰り返し終了
時間に余裕があれば、"最低 1 回は処理が実行されるステートメント"と、"条件を満たさなけ
れば 1 回も処理を実行しないステートメント" を下記のような図で解説しましょう。
繰り返しの条件を満たさなければ、1 回も処理を実行しない(ループの前に条件判断)
条件を確認
Loop
いいえ
(はい)
はい
(いいえ)
処理を実行
終了
繰り返しの条件を満たしていなくても、最低 1 回は処理が実行される(ループの後に条件判
断)
処理を実行
Loop
条件を確認
はい
(いいえ)
いいえ
(はい)
終了
16
第7章
7.1
ユーザー定義関数
ユーザー定義関数を作成するには
7.1.1
Function プロシージャ
■ Function プロシージャでユーザー定義関数を作成する(p.83)
ユーザー定義関数は、Excel のワークシートで使用できるように、プロシージャの適用範囲
を Public にします。標準モジュールに Public プロシージャを作成する場合は、「Public」の
記述を省略できます。そのため、使用例のプロシージャは、Public プロシージャとして使用
できます。適用範囲については、講習の手引き p.10 の「3.2
イベントプロシージャを作成
するには」の「ヒント:"Private" について」で解説しています。
本テキストでは扱いませんが、ユーザー定義関数の戻り値のデータ型と、引数のデータ型を
下記の書式で指定できます。省略した場合は、それぞれバリアント型のデータになります。
書式
Function プロシージャ名(変数 As 変数のデータ型) As 戻り値のデータ型
使用例
Function zeikomi(kakaku As Currency) As Currency
zeikomi 関数の戻り値と引数 kakaku のデータ型を通貨型に指定します。
上記の使用例では、関数の引数 kakaku にセル番地を指定し、そのセルが空欄であることも
考えられます。セルが空欄の場合には Empty 値を保持していますが、通貨型は Empty 値を
扱うことができません。このような場合にはバリアント型を指定します。また、引数のセル
が空欄の時に、関数を入力したセルを空欄にする場合は、戻り値に空の文字列("")を代入し
ます。そのため、戻り値は、通貨型(数値の計算結果)と文字列型(空の文字列)の両方が
扱えるようにバリアント型にします。
使用例の Int は、指定した数値の整数部分を返す関数です。引数に指定した数値より小さい値
の整数を戻り値として返します。
・ Int(インテジャ)関数
書式
Int(数値)
使用例
Int(10000.5)
"10000.5" の整数部分の "10000" を返します。
Int(-1.2)
"-1.2" より小さい値の整数 "-2" を返します。
7.1.2
ユーザー定義関数の作成
ヒント: EOMONTH(エンドオブマンス)関数(p.84)
EOMONTH 関数は開始日から起算して、指定数前のまたは後の月の最終日のシリアル値を返
します。
・ EOMONTH 関数
書式
EOMONTH(開始日,月)
引数
開始日:日付をシリアル値で指定します。日付はダブルクォーテーション
(")で囲みます。
月:開始日から起算した月数を指定します。正の数を指定すると開始日より
後、負の数を指定すると開始日より前の日付を算出します。
使用例
EOMONTH("2004/10/1",1)
2004/10/1 の翌月の月末日(2004/11/30)を返します。
17
EOMONTH 関数を使用するためには、Excel で[ツール]メニューの[アドイン]をクリッ
クして[アドイン]ダイアログボックスを表示し、[有効なツール]の一覧の[分析ツール]
チェックボックスをオンにします。Excel を標準インストールしている場合には、インスト
ール用の CD-ROM が必要です。
アドインはコンピュータごとに追加が必要なため、不特定多数のコンピュータで月末を算出
する関数を使用する場合は、関数を入力するブックにユーザー定義関数を作成することをお
勧めします。
操作:月末を算出するユーザー定義関数を作成する
Step6(p.85)
変数 nen と変数 tuki のデータ型を Integer に指定したのは、DateSerial 関数の引数である
年、月、日を整数型の数値で指定する必要があるためです。
「getumatu = DateSerial(nen, tsuki + 1, 1)-1 」の代わりに、「getumatu =
DateSerial(nen, tsuki+ 1, 0)」というステートメントを記述しても、月末を算出できます。
7.1.3
ユーザー定義関数のテスト
■イミディエイトウィンドウ(p.86)
「?」の代わりに、先頭に「print」と入力しても、関数の戻り値を確認することができます。
「print」の後には半角スペースを入力する必要があります。
ヒント: getumatu 関数の引数 hiduke に Empty 値を指定した場合の結果
■ VBA のシリアル値(p.88)
Excel のシリアル値と VBA のシリアル値は異なります。Excel では、西暦 1900 年 1 月 1
日(シリアル値 1)〜西暦 9999 年 12 月 31 日(シリアル値 2958465)を、日付データ
として扱うことができます。
操作:修正したユーザー定義関数をテストする
Step1(p.90)
カーソルは、イミディエイトウィンドウの 3 行目の行末でなく、行の途中に移動しても、ス
テートメントを実行できます。
Step3(p.90)
イミディエイトウィンドウで、getumatu 関数の引数を空欄(Empty 値)にした結果が空欄
(何も表示されない)のため、ワークシートでセルに関数を入力した場合も、結果は空欄にな
ります。
18
操作:ユーザー定義関数を使った数式をセルに入力する
Step3(p.92)
ヒント:[関数の分類]ボックスの一覧
[関数の分類]ボックスで[ユーザー定義]を選択すると、標準モジュールに作成した戻り値
を返さない Function プロシージャも表示されます。ただし、計算結果を算出する関数とし
ては使用できません。
Step7(p.93)
ブック "交通費精算書" は、引き続き第 8 章で使用します。ブックを閉じないように補足しま
しょう。
第8章
8.2
ユーザーフォーム
ユーザーフォームを作成するには
8.2.2
コントロールの作成
ヒント:ユーザーフォームとコントロールの調整
■位置、サイズ、間隔を揃える(p.104)
"グリッド" とは、フォーム上に表示されている格子状の点のことで、コントロールを配置す
る目安として使用します。[ツール]メニューの[オプション]をクリックして、[オプショ
ン]ダイアログボックスの[全般]タブをクリックすると、グリッドの表示と非表示の切り
替えや、グリッドの間隔を設定することができます。
8.2.3
プロパティの設定
Step5(p.107)
ユーザーフォームを選択するには、フォーム上の他の領域をクリックすることもできます。
ただし、誤ってコントロールを選択してしまう場合があるので、ユーザーフォームを選択す
る場合は、タイトルバーをクリックするとよいことを補足しましょう。
ユーザーフォームのオブジェクト名 "frmStart" は、プロパティウィンドウのタイトルバーや、
コードウィンドウのタイトルバー(最大化している状態では、Visual Basic Editor のタイ
トルバー)にも表示されます。
ヒント:オブジェクト名について(p.107)
オブジェクトの種類を識別するために、オブジェクト名の先頭に付ける文字列を "プリフィッ
クス" といいます。
ユーザーフォームでは、一般的に、下記のプリフィックスを使用することを推奨します。
主なコントロールとプリフィックス
オブジェクト
プリフィックス
使用例
ユーザーフォーム
frm
frmMain
ラベル
lbl
lblName
テキストボックス
txt
txtAddress
リストボックス
lst
lstMember
コンボボックス
cbo
cboMember
チェックボックス
chk
chkPrint
コマンドボタン
cmd
cmdClose
8.2.4
イベントプロシージャの作成
■イベント(p.111)
オブジェクトの種類によって、認識できるイベントの種類や数が異なります。Visual Basic
のヘルプで詳細を確認することができます。
19
フォームモジュールのコードウィンドウを表示する(p.111)
イベントプロシージャを作成するオブジェクトをダブルクリックするか、または右クリック
して表示されたショートカットメニューの[コードの表示]をクリックすると、フォームモ
ジュールが開き、オブジェクトが選択されます。さらに既定のイベントのプロシージャが自
動的に作成されます。
プロジェクトエクスプローラのユーザーフォームをダブルクリックすると、ユーザーフォー
ムのウィンドウが開き、コードウィンドウを表示することはできません。
操作:コマンドボタンのイベントプロシージャを作成する
Step10(p.115)
テキストボックスとコンボボックスの既定のプロパティは "Text" です。オブジェクトの既定
のプロパティは省略できるため、下記のように記述することもできます。
kaisibi = DateSerial(cboNen.Text, cboTuki.Text, 1)
With Worksheets("交通費精算書")
.Range("A4").Value = txtSimei.Text
省略可能
↓既定のプロパティ(Text)を省略
kaisibi = DateSerial(cboNen, cboTuki, 1)
With Worksheets("交通費精算書")
.Range("A4").Value = txtSimei
With ステートメントを使用すると、プロシージャの実行速度が向上します。With ステート
メントを使用する場合は、ピリオド(.)を入力することを忘れないように、注意しましょう。
Step12(p.116)
ここでは、「Unload frmStart」と記述したオブジェクト(ユーザーフォーム "frmStart")
を閉じるため、「Unload Me」と記述することもできます。「Me」と記述すると、そのコー
ドが書かれているユーザーフォームを参照して閉じます。ユーザーフォームのオブジェクト
名を記述するよりも、「Me」と記述するほうが、処理効率が向上します。
使用例
Unload Me
コードが記述されているユーザーフォームを閉じます。
20
ヒント: Cells(セルズ)プロパティ
■すべてのセルを参照する(p.117)
Range プロパティを使い「Range("A1: IV65536").Select」と記述すると、ワークシート
のすべてのセルを選択できますが、Cells プロパティを使用すると「Cells.Select」と、よ
り簡単な書式で記述できます。
■1つのセルを参照する(p.117)
1 つのセルを参照するときには、Cells プロパティで「Cells(1,1)」と記述するよりも、
Range プロパティで「Range("A1")」と記述したほうが、一般的にセルを参照する "列番号
行番号" の形式で表現できるため、どのセルを参照しているのかが明確です。p.113 の「操
作:コマンドボタンのイベントプロシージャを作成する」や、次の「Cells プロパティと
For...Next ステートメントの組み合わせ」のコードのように、行や列を別々に指定したり、
数値で記述すると扱いやすい場合には、Cells プロパティを使用します。
ヒント:イベントプロシージャ "cmdOK̲Click" の処理内容(p.118)
時間に余裕があれば、ヒントを使用して、ステートメントの詳細を解説しましょう。
操作:ユーザーフォームのイベントプロシージャを作成する
Step3
ヒント: Date(デート)関数(p.119)
コンピュータのシステム時計から現在の日付を取得するときに、VBA で Date 関数を使用す
るのに対して、Excel では TODAY 関数を使用します。
Excel で使用する関数を "ワークシート関数" といいます。VBA では、ワークシート関数とは
別の独自に用意された関数を使用します。ワークシート関数と VBA で使用する関数は、関数
名や引数が同じものも数多くあります。しかし、関数名が同じでも機能が異なる場合や、逆
に同じ機能でも関数名が異なる場合があります。また、ワークシート関数にはあっても VBA
には用意されていない関数もあります。そのため、ワークシート関数の使用方法を理解して
いても、同じ機能の関数を VBA で使用する場合は、Visual Basic のヘルプなどで、詳細を
確認するようにしましょう。
VBA では、下記の書式で、ワークシート関数を使用することができます。
書式
Application.WorksheetFunction.関数名(引数)
使用例
Application.WorksheetFunction.Max(Range("A1:A10"))
セル A1 〜 A10 の最大値を求めます。
8.2.5
ユーザーフォームを表示するプロシージャの作成
操作:ユーザーフォームを開くイベントプロシージャを作成する(p.121)
ここでは、イベントプロシージャにフォームを開くステートメントを記述しましたが、標準
モジュールにユーザーフォームを開く Sub プロシージャを作成し、実行することもできます。
この場合は、作成した Sub プロシージャをワークシートの図形やツールバーのボタンに登録
すると、簡単にフォームを開くことができます。
操作:ユーザーフォームを使用する
Step5(p.122)
ユーザーフォームの[年]コンボボックスの一覧を表示して、RowSource プロパティの設
定が反映されていることを確認するとよいでしょう。
Step7(p.123)
ブック "交通費精算書" をテンプレートとして使用する場合は、上書き保存せずに、名前を付
けて保存します。必要があれば、ファイルの種類をテンプレート(拡張子.xlt)に変更するこ
とも補足しましょう。
21
Microsoft® Excel セミナーテキスト VBA 活用編[2000/2002 対応]
講習の手引き
2003 年 9 月 22 日
発行
著作・制作
日経 BP ソフトプレス
発
日経 BP ソフトプレス
行
東京都千代田区平河町 2 − 7 − 1
FAX
〒 102-0093
(03)3221-6138
電子メール
ホームページ
[email protected]
http://www.nikkeibp.co.jp/MSP/
Copyright©2003 Microsoft Corporation, 日経 BP ソフトプレス
22