SeaGate HomePage 別館
本館 別館 ブログ
 
トップページ
第01回
第02回
第03回
第04回
第05回
第06回
第07回
第08回
第09回
第10回
第11回
第12回
第13回
第14回
おまけ
VBAではじめるAutoCADカスタマイズ VBAではじめるAutoCADカスタマイズ
第5回 プログラムの制御構造

■ はじめに

前回までに紹介したサンプルコードは、プログラムの上から下に向かって順番にAutoCADを操作していくものでした。しかし、このようにいつも決まりきった処理をするだけではAutoCAD LTにも搭載されているスクリプト機能と変わらず、状況や条件によって処理の内容を切り替えたり、同じ処理を繰り返したりするような本格的なプログラムを作成することはできません。今回は、こうしたプログラムの流れをコントロールする制御構造について説明します。

■ 制御構造

プログラムの処理の流れは、「順番に従って実行する」「条件が成立すれば実行する」「繰り返して実行する」という基本的な3つのパターンで構成されます。この3つのパターンのことを制御構造と言い、VBAには実際に制御構造をプログラムとして記述するために用いる制御文(フロー制御ステートメント)が用途に応じて複数用意されています。制御文には処理の条件分岐を行うための条件文、処理の繰り返しを行うための繰り返し文などがあります。

■ 条件分岐

条件分岐とは、「もし〜だったら〜をする、それ以外だったら〜をする。」というように、指定した条件式が成立するかどうかを評価し、その評価によって処理を分ける場合に使います。VBAでは、条件分岐を記述する方法として次の2種類が用意されています。

If...Then...Else 指定した条件式が成立した時と成立しない時で別々の処理を実行する。ElseIfキーワードを使用して、複数の条件式を指定することができる。
Select Case 指定する条件式が1つで、条件式の値に応じて複数の処理のいずれかを実行する。

If...Then...Else文の条件式には、比較演算子などを使用して真(True)または偽(False)を評価する数式や文字列式を記述します。ブール型(Boolean)の変数の場合はそれ自身がTrueまたはFalseを表わすので、"If b Then"のように単独で用います。条件式を評価した結果がTrueの場合には、IfまたはElseIfに続く処理が実行され、すべての条件式がFalseの場合には、Elseに続く処理が実行されます。なお、ElseおよびElseIfは省略することが可能です。

変数は、使用する前に名前とその中に保存するデータの型を宣言する必要があり、次のように記述します。変数を宣言すると保存するデータの型に応じた「値の入れ物」が用意され、宣言した変数の名前を用いて数値や文字列などのデータの書き込みや読み取り、演算などの操作を行うことができるようになります。

If...Then...Else文の書式
書式:  If [条件式1] Then
  [条件式1が成立する時に実行する処理]
[ElseIf [条件式n]
  [条件式nが成立する時に実行する処理]]
[Else
  [いずれの条件式も成立しない時に実行する処理]]
End If

If...Then...Else文の使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

Select Case文の条件式には、変数やオブジェクトのプロパティ、値を返すメソッドなどを記述します。条件式の値が各Caseの値と一致する場合には、該当するCaseに続く処理が実行され、一致する値がない場合には、Case Elseに続く処理が実行されます。Caseにはカンマで区切って複数の値を指定したり、Toを使用して"Case 1 To 10"のように値の範囲を指定することができます。なお、If...Then...Else文と同様、Case Elseは省略することが可能です。

Select Case文の書式
書式:  Select Case [条件式]
  Case [値1]
    [条件式が値1と一致する時に実行する処理]
  [Case [値n]
    [条件式が値nと一致する時に実行する処理]]
  [Case Else
    [いずれの値とも一致しない時に実行する処理]]
End Select

Select Case文の使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

比較演算子と論理演算子

比較演算子とは、2つの式の比較を行うための演算子(計算記号)で、よく使用される比較演算子として下表に示すようなものがあります。式の結果は、条件が成立する場合には真(True)となり、成立しない場合には偽(False)となります。例えば変数iの値が10の時、式「i > 9」はTrueとなり、式「i > 11」はFalseとなります。

= > < >= <= <>
右辺と左辺が等しい 右辺より左辺が大きい 右辺より左辺が小さい 右辺より左辺が大きいか等しい 右辺より左辺が小さいか等しい 右辺と左辺は等しくない

論理演算子とは、2つの式の論理演算を行うための演算子で、よく使用される論理演算子として下表に示すようなものがあります。論理演算を行うと、式の結果はTrueまたはFalseになります。例えば変数xの値が10、変数yの値が20の時、式「x > 9 And y > 19」(xは9より大きいかつyは19より大きい)はTrueとなり、式「x > 11 Or y > 21」(xは11より大きいまたはyは21より大きい)はFalseとなります。

And Or Not
論理積(〜かつ〜) 論理和(〜または〜) 論理否定(〜でない)

これらの演算子は、If...Then...Else文などの条件式が成立する(True)か、成立しない(False)かを評価するためによく利用されます。

■ 繰り返し

繰り返しとは、文字通り同じ処理を繰り返して実行することです。単純に同じ処理を繰り返すだけでなく、条件式や条件文と組み合わせ、少しずつ条件を変えながら繰り返すこともできます。VBAの繰り返し文には、繰り返し回数や繰り返し条件の指定方法によって次の3種類が用意されています。繰り返し処理はループと呼ばれることがあります。

For...Next 指定した回数だけ繰り返し処理を実行する。
For Each...Next コレクションの各オブジェクトまたは配列の各要素に対して繰り返し処理を実行する。
Do...Loop 指定した条件が成立している間、または成立するまで繰り返し処理を実行する。WhileまたはUntilキーワードを使用して、繰り返す条件を指定する。

For...Next文は、変数の値が初期値から終了値になるまで繰り返し処理を実行します。変数の値には1回処理が実行されるごとに加算値が加算され、終了値を越えると繰り返し処理を中止して、プログラムの実行をFor...Next文の次の処理へ移します。なお、Stepは省略することが可能で、その場合の加算値は1となります。

For...Next文の書式
書式:  For [変数] = [初期値] To [終了値] [Step [加算値]]
  [繰り返し実行する処理]
Next [変数]

For...Next文の使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

For Each...Next文は、コレクションオブジェクトや配列からそれらに含まれるオブジェクトや要素を1つずつ変数に取り出し、すべてのオブジェクトや要素を取り出し終わるまで繰り返し処理を実行します。変数は、コレクションの場合にはコレクションに含まれるオブジェクトの型として、配列の場合にはバリアント型(Variant)として宣言します。For Each...Next文は、AutoCADのDocumentsやModelSpace、Layersコレクションなどに含まれるすべてのDocument(図面)や図形、Layer(画層)オブジェクトなどに対して何らかの操作を行う時によく利用されます。

For Each...Next文の書式
書式:  For Each [変数] In [コレクションオブジェクトまたは配列]
  [繰り返し実行する処理]
Next

For Each...Next文の使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

Do...Loop文は、Whileとともに使用すると、条件式を評価した結果がTrueである間は繰り返し処理を実行し、Untilとともに使用すると、条件式を評価した結果がTrueになるまで繰り返し処理を実行します。WhileまたはUntilをDoに続けて記述すると、繰り返し処理を実行する前に条件式が評価され、Loopに続けて記述すると、少なくとも1回は繰り返し処理が実行された後に条件式が評価されます。

Do...Loop文の書式
書式:  Do [WhileまたはUntil [条件式]]
  [繰り返し実行する処理]
Loop

Do
  [繰り返し実行する処理]
Loop [WhileまたはUntil [条件式]]

Do...Loop文の使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

繰り返し文では、WhileやUntilなどの繰り返し処理を終了するための条件式が適切でなかったり省略された時、永久に処理を繰り返すループ(無限ループ)となり、AutoCADを強制終了する以外にプログラムを停止させる方法がなくなってしまいます。For...Next文やDo...Loop文の繰り返し処理を終了する別の方法として、Exit For文やExit Do文があります。この命令をIf...Then...Else文などと組み合わせ、WhileやUntilなどの代わりに繰り返し処理の中で使用すると、指定した条件で繰り返し処理を強制的に終了させることができます。

ステップ実行

VBエディタのステップ実行機能を利用すると、作成したプログラムが意図した通りに動作しているかを確認することができます。ステップ実行を開始するには、カーソルを"Public Sub..."の行と"End Sub"の行の間の任意の場所に置き、[デバッグ]メニューの[ステップイン]を選択するかキーボードの[F8]キーを押します。

ステップインを実行すると、プログラムコードの先頭行が黄色の反転表示となります。その後、[F8]キーを押すごとに1行(1文)ずつ実行されるので、プログラムコードが実行される順番を確認することができます。また、変数名の上にマウスポインタを置くと、その変数の値がツールチップとして表示され、変数が意図した通りの値になっているかを確認することもできます。


■ 最後に

CADを使って作図していると、少なからずお決まりの作図や編集作業を何度も繰り返さなければならないことがあり、嫌気がさしてしまうことがあります。本来このような作業こそコンピュータの最も得意とする分野です。プログラムの制御構造を理解すると、このような作業はコンピュータに任せてラクをすることができるようになるはずです。
SeaGate
コレクション



inserted by FC2 system