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

■ はじめに

連載第7回の「ユーザーとの対話」では、ユーザーが作図ウィンドウ上で座標位置や図形を選択したり、コマンドウィンドウに入力した数値や文字などを取得する方法について説明しました。これらはAutoCADが提供する機能を利用したものですが、これとは別にVBA自身にもユーザーフォームと呼ばれる独自のダイアログを作成して、データの入出力などを行う機能が備わっています。今回は、このユーザーフォームを利用する方法について説明します。

■ ユーザーフォームとコントロール

ユーザーフォームとは、コントロールと呼ばれるソフトウエア部品を貼り付けて、AutoCAD VBAプログラムから利用することのできる独自のダイアログのことです。ユーザーフォームやユーザーフォームに貼り付けたコントロールは、VBAのプログラムコードから制御することができ、AutoCAD VBAプログラムにAutoCADの各種ダイアログや通常のWindowsアプリケーションのような外観と操作性を持たせることができます。

ユーザーフォームとコントロールの例
ユーザーフォームとコントロールの例

コントロールとは、ユーザーフォーム上に配置することのできるテキストボックスやコマンドボタンなどのソフトウエア部品で、コンポーネントなどと呼ばれることもあります。AutoCAD VBAに標準で備わっているコントロールには、代表的なものとして以下のようなものがあります。また、標準のコントロール以外にもActiveXコントロールと呼ばれる外部のソフトウエア部品を組み込んで利用することもできます。

コントロール 内容
ラベル(Label) キャプションなどのテキスト表示のみを行う。
テキストボックス(TextBox) テキストの入力と表示を行うボックスを作成する。
コンボボックス(ComboBox) ドロップダウンリストを作成する。テキスト入力も可能。
リストボックス(ListBox) 選択項目をリスト表示して任意の項目を選択するボックスを作成する。
チェックボックス(CheckBox) 二者択一や複数の選択項目から任意の項目を選択するボックスを作成する。
オプションボタン(OptionButton) 複数の選択項目の中から1つの項目だけを選択できるボタンを作成する。
コマンドボタン(CommandButton) コマンドを実行するためのボタンを作成する。

AutoCAD VBAでは、ユーザーフォームやコントロールもそれぞれ1つのオブジェクトとして扱われ、AutoCADの各オブジェクトと同じようにプロパティやメソッド、イベントを持ちます。VBAプログラムからはこれらのコントロールが持つプロパティやメソッド、イベントを利用して、ユーザーが入力したデータを受け取ったり、情報を表示したりすることができます。コントロールには対話式(ユーザーがマウスなどで操作可能)のものと静的(プログラムコードによってのみ操作可能)なものがあります。

■ ユーザーフォームとコントロールの追加

VBAプロジェクトにユーザーフォームを追加するには、標準モジュールと同じようにVBエディタのプロジェクトエクスプローラで標準モジュールを追加するプロジェクトを選択し、[挿入]メニューの[ユーザーフォーム]をクリックします。ユーザーフォームが追加されると空のユーザーフォームとツールボックスが表示され、プロジェクトエクスプローラに追加されたユーザーフォーム「UserForm1」が表示されます。ツールボックスが表示されない場合は[表示]メニューの[ツールボックス]をクリックしてください。

ユーザーフォームを選択し、プロジェクトエクスプローラの[コードの表示]ボタンをクリックするとコードウィンドウが開きます。このコードウィンドウには、後ほど説明するイベントプロシージャなどのユーザーフォームに関連したプログラムコードを記述します。また、[オブジェクトの表示]ボタンをクリックすると選択したユーザーフォームが表示されます。


ユーザーフォームにコントロールを追加するには、ツールボックスから貼り付けたいコントロールを選択してユーザーフォーム上にドラッグ&ドロップします。フォーム上に貼り付けらたれたコントロールをクリックするとコントロールのまわりにドラッグハンドルが表示され、位置やサイズを調整することができます。また、フォーム上に貼り付けたコントロールを削除するには、削除したいコントロールを選択してからキーボードで[DEL]キーを押します。


ユーザーフォームやコントロールを選択すると、[プロパティ]ウィンドウに選択したフォームやコントロールのプロパティとそのプロパティの現在の設定値がリスト表示されます。[プロパティ]ウィンドウの設定値を変更すると、AutoCADの[オブジェクトプロパティ管理]ウィンドウのように、フォームやコントロールの位置やサイズ、外観や属性などを変更することができます。また、複数のコントロールを選択すると選択されたすべてのコントロールに共通するプロパティが[プロパティ]ウィンドウにリスト表示されます。

■ ユーザーフォームのロード、アンロード

VBエディタでユーザーフォームやコントロールを追加しても、すぐに使用できるようになるわけではありません。VBエディタでデザインしたユーザーフォームは、建物でいうと間取り図のようなもので、実際にダイアログなどとして機能させるには、間取り図をもとに実際の建物を建てていくように、標準モジュールなどからLoadステートメントという特別な命令を実行してユーザーフォームオブジェクトを作成し、メモリ上にロード(読み込む)する必要があります。ユーザーフォームオブジェクトが作成されると、その上に貼り付けられたコントロールのオブジェクトも同時に作成されます。

Loadステートメントによってユーザーフォームが作成されると、VBAのプログラムコードからユーザーフォームやコントロールオブジェクトが持つプロパティやメソッドを通して制御できるようになりますが、まだ画面上には表示はされません。ユーザーフォームが画面上に表示されていないときは、マウスなどによる操作を行うことはできません。ユーザーフォームを表示するには、ユーザーフォームオブジェクト自身の持つShowメソッドを実行します。また、ユーザーフォームを一時的に非表示するには、Showメソッドと同様、ユーザーフォームオブジェクト自身が持つHideメソッドを実行します。

VBAプログラムが終了すると、Loadステートメントで作成したユーザーフォームオブジェクトは自動的にメモリ上からアンロード(破棄)されますが、Unloadステートメントを実行して明示的にアンロードすることもできます。明示的にアンロードしたユーザーフォームは、Loadステートメントを実行して再びロードすることができます。ただしその場合、ユーザーフォームやコントロールオブジェクトの状態やプロパティの値などはクリアされ、初期状態に戻ります。

ステートメント、メソッド 内容
Loadステートメント ユーザーフォームをメモリにロードしますが、表示はしません。
Unloadステートメント ユーザーフォームをメモリからアンロードします。
Showメソッド ユーザーフォームを表示します。ロードされていない場合は自動的にロードされます。
Hideメソッド ユーザーフォームを非表示にしますが、メモリからアンロードされません。

■ イベントプロシージャ

連載第3回でも触れたように、オブジェクトにはイベントと呼ばれる機能が備わっています。イベントとは、オブジェクトに対してあらかじめ決められた特定の動作や操作が行われたとき、自動的にその動作に対応するプロシージャ(イベントプロシージャやイベントハンドラなどと呼ばれる)が呼び出され、必要な処理を実行することができる仕組みのことです。

ユーザーフォームやコントロールも一つ一つが独立したオブジェクトなので、ユーザーの操作などによってイベントが発生します。例えばCommanButton1という名前のコマンドボタンをクリックするとClickイベントが発生し、CommandButton1_Clickイベントプロシージャが呼び出され、そのとき実行する処理を記述することができます。


ユーザーフォームやコントロールオブジェクトのイベントを利用するには、まず、ユーザーフォームのコードウィンドウ上部左側にある[オブジェクト]ボックスでユーザーフォームやコントロールを選択します。すると、右側の[プロシージャ]ボックスにそのオブジェクトで利用可能なイベントがすべて表示されるので、目的のイベントを選択するとイベントプロシージャの雛形がコードウィンドウに挿入されます。イベントが発生したときに何らかの処理を実行するには、挿入されたイベントプロシージャの「Private Sub」から「End Sub」の間に必要なプログラムコードを記述します。


イベントごとに呼び出されるイベントプロシージャの名前や書式は決まっていて、クリックしたマウスボタンの種類やマウスポインタの座標位置などの付加的な情報が、イベントプロシージャの引数として渡されることもあります。また、イベントにはユーザーの操作によるものだけでなく、ユーザーフォームがロード、アンロードされた直後に発生するInitializeやTerminateイベントのように、オブジェクトの状態が変化したときに発生するものなどもあります。

■ サンプルプログラム

それではユーザーフォームとAutoCADが連携して動作する簡単なプログラムを作成してみます。ユーザーフォーム上で色と半径を指定し、AutoCAD上で指定した任意の座標位置に円を作図することができるプログラムです。まず、VBAプロジェクトにユーザーフォームを追加し、下図のようにコントロールを配置します。すべてのコントロールが配置できたら、[プロパティ]ウィンドウでユーザーフォームや各コントロールのオブジェクト名とプロパティを下表のように設定します。VBAプログラムからはここで設定したオブジェクト名でオブジェクトを識別することができます。


コントロール オブジェクト名 プロパティ
名前 設定値
ユーザーフォーム SampleForm Caption 「SampleForm」
StartUpPosition 「0 - 手動」
ラベル(1) LabelColor Caption 「色:」
ラベル(2) LabelRadius Caption 「半径」
コンボボックス ComboColor Style 「2 - fmStyleDropDownList」
テキストボックス TextRadius    
コマンドボタン(1) CommandDraw Caption 「作図」
コマンドボタン(2) CommandExit Caption 「終了」

ユーザーフォームやコントロールのオブジェクト名とプロパティが設定できたら、いよいよプログラムコードの記述を行います。今回は、現在の図面(ThisDrawing)のコードウィンドウにユーザーフォームを呼び出すコードを、ユーザーフォームのコードウィンドウにコンボボックスやテキストボックスから色と半径の値を取得し、AutoCAD上に円を作図するコードを分けて記述します。

ThisDrawingのコードウィンドウに記述するコード
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

3〜9行目
Sample01プロシージャはこのサンプルプログラムのエントリーポイントで、ユーザーフォーム(SampleForm)をロードし、モーダルフォームとして表示します。

ユーザーフォームのコードウィンドウに記述するコード
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

3〜17行目
Initializeイベントはオブジェクトがロードされ、表示される前に発生するイベントです。
Sample01プロシージャからユーザーフォーム(SampleForm)がロードされるとInitializeイベントが発生し、このUserForm_Initializeイベントプロシージャが呼び出されます。

5〜13行目
コンボボックス(ComboColor)のドロップダウンリストに色名を追加し、初期値を「ByLayer」に設定します。このようにInitializeイベントはユーザーフォームの初期化などによく利用されます。

"AddItem"はコンボボックスにリスト項目を追加するメソッドです。項目には通し番号が付けられ、ListIndexプロパティで任意の項目を選択したり、現在選択されている項目を取得することができます。

19〜50行目
CommandDraw_Clickはコマンドボタン(CommandDraw)がクリックされた時に呼び出されるイベントプロシージャです。ユーザーフォーム(SampleForm)を一時的に非表示にし、コンボボックやテキストボックスからユーザーが指定した色と半径の値を取得してAutoCAD上で指定した任意の座標位置に円を作図しています。

"Me"はこのプログラムコードが記述されたオブジェクト自身(この場合はSampleForm)を表わすVBAのキーワードです。 また、"CDbl"は引数として渡された数値や文字列を倍精度浮動小数点型の値に変換するVBAの関数です。

52〜56行目
CommandExit_Clickはコマンドボタン(CommandExit)がクリックされた時に呼び出されるイベントプロシージャです。
コマンドボタン(CommandExit)がクリックされるとユーザーフォーム(SampleForm)をアンロードし、処理が呼び出し元のSample01プロシージャに戻ります。

モーダルフォームとモードレスフォーム

ユーザーフォームの表示状態にはモーダル(Modal)とモードレス(Modeless)の2種類があります。ユーザーフォームがモーダルの場合(モーダルフォーム)、ユーザーフォームが表示されている間は、ユーザーフォームが非表示になるかアンロードされるまでイベントプロシージャ以外のプログラムコードの実行は中断され、画面上でマウスなどを使用してAutoCADを操作することもできません。

ユーザーフォームを表示しながらAutoCADの図面の中の点や図形を選択するには、ユーザーフォームをモードレス(モードレスフォーム)で表示します。この場合、プログラムコードも中断されず実行が継続されます。ただし、AutoCAD VBAのモードレスフォームにはユーザーフォームがアクティブになることができないという問題点があり、特別な方法を使用しない限り、事実上モードレスフォームを使用することができません。

ユーザーフォームをモーダルにするには、サンプルプログラムのように、ユーザーフォームを表示するときのShowメソッドの引数に定数vbModal(= 1)を指定し、モードレスにするには定数vbModelless(= 0)を指定します。

■ 最後に

ユーザーフォームが使えるというのはVBAの大きな魅力の1つです。ユーザーフォームのおかげでVBAプログラムの利用者に簡単な操作でオプションの設定をしてもらったり、分かりやすい情報を提供することができるようになります。少ない誌面でユーザーフォームのすべてを解説することはできませんが、VBAが搭載されているExcelやWordでも利用方法は同じですので、それらの解説書やインターネット上の情報なども参考にしてみてください。
SeaGate
コレクション



inserted by FC2 system