プログラムの制御構造
制御構造
プログラムの処理の流れは、「上から順番に実行する」「条件が成立すれば実行する」「繰り返して実行する」という基本的な3つのパターンで構成されている。
この3つのパターンのことを制御構造と言い、VBAには実際に制御構造をプログラムとして記述するために用いる制御文(フロー制御ステートメント)が、用途に応じて複数用意されている。
制御文には処理の条件分岐を行うための条件文、処理の繰り返しを行うための繰り返し文などがある。
条件分岐
条件分岐とは、「もし~だったら~をする、それ以外だったら~をする。」というように、指定した条件式が成立するかどうかを評価し、その評価によって処理を分ける場合に使う。
■If文
・If...Thenステートメント
・IF...Then...Elseステートメント
・IF...Then...Elseifステートメント
■Select Case文
・Select Caseステートメント
繰り返し
繰り返しとは、処理を繰り返して実行すること。
単純に同じ処理を繰り返すだけでなく、条件式や条件文と組み合わせ、少しずつ条件を変えながら繰り返すこともできる。
繰り返し処理はループと呼ばれることがある。
VBAの繰り返し文には、繰り返し回数や繰り返し条件の指定方法によって次の3種類が用意されている。
■For文
・For...Nextステートメント
・For Each...Nextステートメント
■Do文
・Do...Loopステートメント
・Do Until...Loopステートメント
・Do While...Loopステートメント
・Do...Loop Whileステートメント
・Do ...Loop Untilステートメント
■While文
・While...Wendステートメント
オブジェクトの参照方法
オブジェクトの参照方法
プログラムからフォームやフォーム上のコントロール、レポートを参照する場合は、
次の書式を利用する。
フォームまたはレポート
FormsコレクションまたはReportaコレクションを利用し、次のように記述する。
[ 書式 ]
Forms!フォーム名
Reports!レポート名
コレクション名とフォーム名の間は、感嘆符(!)でつなぐ。
フォーム名やレポート名に空白やハイフン(-)などの記号が含まれる場合は、
名前を角カッコ( [ ] )で囲む必要がある。
コントロール
フォーム名とコントロール名を感嘆符(!)でつなぎ、次のように記述する。
コントロール名は空白やハイフン(-)などの記号が含まれる場合は、
名前を角カッコ( [ ] )で囲む必要がある。
[ 書式 ]
Forms!フォーム名!コントロール名
プロパティ
オブジェクトとプロパティの間をドット(.)でつなぎ、次のように記述する。
プロパティ名は、英語表記にする。
[ 書式 ]
Forms!フォーム名.プロパティ名
Forms!フォーム名!コントロール名.プロパティ名
Reports!フォーム名.プロパティ名
サブフォームまたはサブレポート
FormsコレクションまたはReportaコレクションを利用し、次のように記述する。
[ 書式 ]
Forms!フォーム名!サブコントロール名.Form
Reports!フォーム名!サブレポートコントロール名.Report
サブフォーム上のコントロール名を参照する場合は、Formプロパティとコントロール名の間を
感嘆符(!)で つなぐ。
[ 注意 ]
これらの式は、すべて指定したフォームまたはレポートが開いているときだけ有効である。
フォームまたはレポートが閉じているとき、またはデザインビューで表示されている場合は、
上記の書式を使って、参照することはできない。
メソッド
■特定のオブジェクトだけで実行できるようにプログラムされたプロシージャを、メソッドと呼ぶ。
■ステートメントや組み込み関数と違い、決められたオブジェクトだけでしか実行できない。
VBAでは、マクロのアクションを実行するためのDoCmdオブジェクトが定義されていて、各アクションはDoCmdオブジェクトのメソッドという形で提供されている。
例えば、マクロの「フォームを開く」アクションは、DoCmdオブジェクトのOrenFormメソッドに対応してる。
組み込み関数
メッセージボックスを表示させたり、現在の時間を取得したりするプログラムが、あらかじめ用意されいる。
それを組み込み関数や標準関数、関数と呼ぶ。
処理を実行した結果を呼び出し元のプロシージャに返す。
変数の宣言
■変数は「宣言」してから利用する。
■変数を宣言する場所や宣言に使うステートメントによって、変数の適用範囲が異なる。
■同一の適用範囲内で同じ名前の変数を宣言することはできない。
■適用範囲が違う場合は、同じ変数名を利用することができる。
モジュールレベル変数
■モジュールの宣言セクションで宣言した変数は、そのモジュール全体で使用でき、モジュール変数と呼ぶ。
■モジュール内でプロシージャが始まる前(上)に記述する。
■モジュールレベル変数は、プログラムの先頭で初期化され、以降制御がどのモジュールのどのプロシージャに移ってもプログラムの終了まで内容が保持されています。
Publicステートメント
Publicステートメントで宣言する変数は、パブリック変数と呼び、プロジェクト内の全ての場所から参照することができる。
[ 書式 ]
Public varname [ As tyre ]
varname:変数名
type:変数のデータ型
Privateステートメント/Dimステートメント
Privateステートメントで宣言する変数は、このモジュール内の各プロシージャからは参照できるが、プロジェクト内の他のモジュールからは参照できない。
PrivateステートメントはDimステートメントと書いても同じ。
[ 書式 ]
Private | Dim varname [ As tyre ]
varname:変数名
type:変数のデータ型
プロシージャレベルの変数
■宣言した変数は、そのプロシージャ内だけ有効。
■ほかのプロシージャから参照することはできない。
■プロシージャ内部では、変数を使用する記述より上で変数を宣言しておく必要があります。
■通常はプロシージャの先頭にまとめて記述する。
■モジュールレベル変数と同じ名前の変数がある場合はプロシージャ内の変数が参照される。
Dimステートメント
Dimステートメントで宣言する変数は、そのモジュール内のみが適用範囲(参照できる範囲)となる。
Dimステートメントで宣言する変数は、そのプロシージャが呼び出される都度初期化されます。
[ 書式 ]
Dim varname [ As tyre ]
varname:変数名
type:変数のデータ型
Staticステートメント
Staticステートメントで宣言する変数も、そのモジュール内のみが適用範囲となるが、Dimステートメントで宣言する変数と異なりプロシージャ内での処理が終了し、制御が他に移ってもその変数は初期化されない。
次回そのプロシージャが呼び出された時に、以前の内容が保持されたままになる。
[ 構文 ]
Static varname [ As tyre ]
varname:変数名
type:変数のデータ型
[ 概要 ]
変数の宣言する場所と宣言の違い
' プロシージャを超えて参照する変数/定数は動作するプロシージャの前(外)で宣言する
Option Explicit
Public X ' ←他モジュールからも参照可(変数)
Private Y ' ←このモジュールからのみ参照可(変数)
' プロシージャ固有の変数/定数はプロシージャ内で使用する手前で宣言する
Sub TEST()
Dim Y ' ←同一名はモジュールレベルよりプロシージャレベルが優先
Static Z ' ←制御がプロシージャを抜けても保持される
End Sub
