トップ > スキル : アプリケーション > VBA for Excel > 応用編(ユーザーフォームを利用する)

VBA_EXCEL

ユーザーフォームを利用する

入力画面を独自に作成し、目的に合わせて自由にカスタマイズできるフォームをユーザーフォームと言います。VBAでは、このユーザーフォームが使え、効率のよい作業を提供してくれます。
今回は、下図のような会員名簿に入力していくためのユーザーフォームを作成していきます。

ID、氏名は直接入力で、性別はオプション・ボタン、住宅はリストボックス、町名はコンボボックス、そして配偶者と子供の有無はチェックボックスで入力できるようにします。また、リストボックス、コンボボックスに表示させる項目はExcel上にリストとして入力されていて、それぞれ「住宅」「町名」という名前でそのセル範囲に名前が付けられています。(セル範囲J6:J10は住宅、セル範囲K6:K13は町名)

ユーザーフォームの作成

ユーザーフォームを作成するためには、新しいユーザーフォームを追加する必要があります。VBE画面でメニュー[挿入]から[ユーザーフォーム]を選択します。

新しいユーザーフォームが追加されます。

ユーザーフォームウィンドウにコントロールを追加して、外観を整えていきます。追加したコントロールには、さまざまなプロパティを持っています。プロパティはプロパティウィンドウで設定できます。
プロパティウィンドウの構成は以下のとおりです。

ユーザーフォームの設定はプロパティウィンドウで行います。よく使われるプロパティには、Name(オブジェクト名)、Caption(フォームのタイトル名)、そしてユーザーフォーム自体の幅と高さとなるWide、Heightプロパティなどがあります。では、これらを設定してみましょう。

プロパティウィンドウで、変更したいプロパティ名をクリックし、値を入力することで設定値が変更されます。

では、ユーザーフォームにコントロールを追加していきます。コントロールを追加するには、ツールボックスを使います。ツールボックスのウィンドウを表示するには、ユーザーフォームウィンドウをアクティブにします。

まず、コマンドボタンを2つ作成してみます。ツールボックスからコマンドボタンのボタンをクリックし、ユーザーフォームウィンドウの上でクリックします。もう1つは、それをコピーして作成すると同じ大きさのボタンを作ることができます。

各ボタンのName(オブジェクト名)とCaptionに次のような設定を行います。

プロパティ名 CommandButton1 CommandButton2
Name cmdOK cmdClose
Caption 登録 閉じる

次に各項目もラベルを作成します。ラベルは、ユーザが分かりやすいような項目名にします。また、今回のラベルは特にそれを操作するようなことは設定しませんので、オブジェクト名はそのままで、Captionだけを以下の図のような項目名に設定します。

次にテキストボックスを追加して、以下のようにプロパティを設定します。

プロパティ名 TextBox1 TextBox2
Name txtID txtNamae
IMEMode fmIMEModeOff fmIMEModeHiragana

IMEModeプロパティは、日本語入力システムの入力モードを指定するためのものです。テキストボックス内に入力される種類によって、日本語入力をOFFにしたり、ひらがなモード、カタカナモードなどにします。

次に性別を選択させるオプションボタンを作成します。オプションボタンは、通常、複数選択から1つしか選べないコントロールです。性別に重複はありえないので、オプションボタンを利用します。
男女のために2つのオプションボタンを作成し、以下のように設定します。

プロパティ名 OptionButton1 OptionButton2
Name optOtoko optOnna
Caption
Value True False

Valueプロパティは、オプションボタンをオン、オフの設定を行えます。Trueにすると、規定値としてオンが設定されます。

チェックボックスは、オプションボタンを同様な作成です。下の図のように設定します。

プロパティ名 CheckBox1 CheckBox2
Name chk1 chk2
Caption 配偶者 子供

では、ユーザがリスト一覧から選択できるように、リストボックスを作成します。作成の方法は、ツールボックスからリストボックスボタンをクリックし、ユーザーフォーム上で任意のサイズにドラッグするだけです。プロパティも以下のように設定します。

プロパティ名 ListBox1
Name lstHouse
RowSource 住宅

RowSourceプロパティは、ワークシートに入力されているリストをリストボックスやコンボボックスの一覧に表示するためのプロパティです。セルに範囲名が設定されている場合は、このプロパティの設定として範囲名を入力します。この例では、ワークシートの住宅のリスト範囲に、あらかじめ住宅という名前が付けられているので、RowSourceプロパティにそれを設定するとユーザーフォーム内に表示されます。

同様にコンボボックスを以下のように作成します。作成は、リストボックスと同様です。

プロパティ名 ComboBox1
Name cmdCyoumei
RowSource 町名

町名のリストもあらかじめワークシート上でリストとして入力されていて、そのセル範囲に「町名」と名前が付けられていることが前提です。
リストボックスとコンボボックスの違いは、リストボックスは最初からリストの全項目が表示されています。それに対してコンボボックスは、ボックスの右端ボタン▼を押さないとリストの一覧が表示されません。使い方として、リストの内容が少なく、それを表示できるスペースがあればリストボックスを使い、リストの内容が多くて、フォーム上にリストを表示できるスペースがない場合はコンボボックスを使います。どちらも、リストを表示させることはまったく同じですし、プロパティ内容も変わりません。

では、ユーザーフォームの外観を下のように整えておきます。フォームの色を変更する場合は、ユーザーフォームのBackColorプロパティを利用します。任意の色を選んでおきます。

通常、フォームは上から下のほうに向かって入力や選択をしていきます。よって、カーソルが上から下へと順番に移動しないといけません。しかし、ユーザーフォームを作成している段階で、ボタン類やボックス類などを作り変えていると順番が異なってしまいます。そこで、上から下へカーソルが移動するようにタブオーダーの設定をする必要があります。
ユーザーフォーム上で右クリックし、タブオーダーを選択します。そして、下の図のようにユーザーフォームの上から下へと順番になるように移動ボタンで操作します。

プロシージャを作成する

ユーザーフォームやコントロールのプロパティは、ユーザーフォームの実行中にプロシージャから操作できます。またユーザーフォームを終了すると、ユーザーフォーム実行中のプロパティの変更は破棄されます。
それぞれのプロパティを変更するには、以下のように行います。

ユーザーフォーム名.プロパティ = 設定値
コントロール名.プロパティ = 設定値

先ほど作成したユーザーフォームには、オプションボタンやチェックボックスがありました。それらのオン・オフの設定は、Valueプロパティで行います。オンの場合はTrue、オフの場合はFalseと設定します。

オブジェクト名.Value = True(オンの場合)

また、テキストボックス、リストボックス、コンボボックス内の値を設定、取得するにはTextプロパティを使います。

オブジェクト名.Text

テキストボックス、リストボックスがTextプロパティのほかにValueプロパティも持っています。通常はTextプロパティを使いますが、Valueプロパティも同じように使えます。

さて、新規データ入力をプロシージャで作成していきます。新規データを入力していくには、セルを選択するための基準となるセルを指定しなければいけません。
新規データを入力するセルは、Endプロパティでデータが入力されている最後のセルを取得し、Offsetプロパティでそのひとつ下のセルを取得して調べることができます。

まず、入力する列の一番下のセルから、上のほうを参照しデータが入力されているところに移動し、そこからひとつ下のセルに移動したところに、新規データを入力しています。こうすれば、データがいくつか入力されていても、いつも空白セルを見つけて、そこに新規データが入力されるようになります。
それでは、以下のようにプロシージャを記述します。この場合、ユーザーフォームでプロシージャボックスからInitializeを選択してから、入力を行います。

※コードウィンドウを表示するには、ユーザーフォーム上でダブルクリックします。

各コントロールの値をワークシートに反映されるように設定します。ユーザーフォームの「登録」ボタンをクリックすれば、ワークシート内にユーザーフォームの値を転記するようにします。この場合、cmdOKボタンのClickイベントを利用することになります。ただ、ユーザが正しく入力するとは限りません。よって、次のような場合はメッセージを表示させ、ユーザに促すように設定します。

  • セルB25が選択された場合(データを入力する範囲を超えている)
  • テキストボックスに何も入力されていない
  • リストボックス、コンボボックスの項目が選択されていない

さらに、データを転記した後に次のデータを入力するためには、ユーザーフォームの各コントロールの値を初期化する必要があります。
では、以下のように記述しましょう。

最初にエラーメッセージを作成します。アクティブセルはB25にある場合は、登録数を超過していることを促すメッセージです。次にテキストボックスに何も入力されていない場合、リストボックス、コンボボックスのリストが選択されていない場合のメッセージを記述します。
ListIndexプロパティは、リストボックスやコンボボックスで選択されている項目のインデックスを設定・取得します。一番目の項目が選択されたら「0」、2番目が選択されたら「1」を返します。解除するには、「-1」と設定値を指定します。

オブジェクト名.ListIndex = 設定値

先ほどの記述に続けて以下のように記述します。

この記述で、ワークシート内のセルに転記されるようになります。それぞれのセルの値を、テキストボックスの文字列、リストボックスの項目、コンボボックスの項目が選ばれます。オプションボタンやチェックボックスの場合は、IIf関数を使って、一方の項目がTrueであれば、指定した文字列が入力されるように指定してあります。

IIF関数

IIf(Expr、Truepart、Falsepart)

引数 内容
Expr 条件式
Truepart 条件式が真の場合の値を指定
Falsepart 条件式が偽の場合の値の指定

また、".Offset(1).select"を記述することで、1行(1データ)の転記が終わると次の新しいデータが入力できるようにひとつ下のセルを選択されるように指定します。

先ほどの記述に続いて以下のように記述します。

ここでは、すべてのユーザーフォームのコントロールの値を初期化しています。また、最後にユーザーフォームの一番上のIDのテキストボックスにカーソルが移動するようにSetFocusメソッドを使用しています。

SetFocusメソッド … コントロールにフォーカスを移動する

オブジェクト名.SetFocus

これで登録ボタンをクリックしたときの処理コードの作成が完了しました。

次にもうひとつのボタン「閉じる」のプロシージャを作成していきます。
ユーザーフォームを終了するにはUnloadステートメントを使います。このとき、ユーザーフォーム実行中に変更されたプロパティの値はすべて破棄されます。

Unloadステートメント … ユーザーフォームの終了

Unload ユーザーフォーム名

下図のように「閉じる」ボタンをクリックしたときのプロシージャを記述します。

では、このユーザーフォームをワークシート内のボタンから表示させるようにします。ワークシート内のボタンをクリックすると処理されるようにするには、標準モジュール内でプロシージャを作成します。
ワークシートに「入力フォーム表示」ボタンを下図のように作成しておきます。

標準モジュールを挿入して、以下のように記述します。

ユーザーフォームを表示させるには、Showメソッドを使います。Showメソッドを使用することで、ユーザーフォームが実行され画面が表示されます。

Showメソッド … ユーザーフォームを表示する

ユーザーフォーム名.Show

後は、入力フォーム表示ボタンに標準モジュールに作成したプロシージャを登録しておきます。すべてが完成してユーザフォームを実行すると画面は下図のようになります。

作成したものを実行すると、ユーザーフォームに入力した値がワークシートに転記されることが確認できます。また、閉じるボタンをクリックするとユーザーフォームが閉じられます。
このようにユーザーフォームは、Excelに慣れていない方でも、簡単に入力できるような設計となります。