今回はVBAでユーザーフォームを使う方法について解説します。VBAで簡単な自動化ツールの開発をしている会社員を読者として想定しています。初めてユーザーフォームを使う人を対象に解説します。
とりあえず動くモノが作れるところまでいきます。
目次
ユーザーフォームを使う手順
ユーザーフォームを使うには3つのステップを踏みます。下記の3点です。
- どんな機能を持たせるのか考える
- フォームを設計する
- プログラムを書く
プログラムを書くの部分はさらに、
- イベント内容を記述する
- ユーザーフォームを表示させる
の2つに分かれます。順番に解説します。
どんな機能を持たせるのか考える
まずはどのような機能を持ったユーザーフォームを作成するのかを考えます。
VBAによるユーザーフォームは後から簡単にボタンやテキストボックスといった部品を追加することができるので、気軽に取り組みましょう。この部品のことを「コントロール」と言います。
今回はユーザー名を登録するフォームを設計することにします。
フォームを設計する
挿入→ユーザーフォームを選択。
これでユーザーフォームが作成されました。
ユーザーフォームはオブジェクトとフォームモジュールがセットになったものです。イベントプロシジャを勉強したときにシートにはシートモジュールがくっついていることを学びました。それと同じでユーザーフォームはフォームそのもののオブジェクトとそのオブジェクトを操作するフォームモジュールからなっています。
あとで出てくるので頭に入れておきましょう。
コントロールを追加する
ユーザーフォームにコントロールを追加していきます。今回は入力用のテキストボックスと登録ボタンをもつユーザーフォームを作成します。
コントロールの追加はツールボックスから行います。ツールボックスが表示されていない方は、表示→ツールボックスで表示させることができます。
コントロールからテキストボックスを選択し、ユーザーフォーム上でドラッグするとドラッグした範囲にテキストボックスが表示されます。同様にしてコマンドボタンも追加します。
ここまでの作業で下記の様になっています。
オブジェクト名を設定する
プロパティウィンドウを開いていない人はこの時点で開いておきましょう。プロパティウィンドウの「オブジェクト名」の所にデフォルトでオブジェクト名が入っているので、この時点で書き換えておきます。
後でプログラムを書く時にオブジェクト名を使うことになります。プログラムを書いてからコントロールの名前を変更すると、プログラムとプロパティの両方を修正しなければならなくなるため、この時点で分かりやすい名前をつけておきます。
◆ユーザーフォームのオブジェクト名を設定する
◆テキストボックスのオブジェクト名を設定する
同様にテキストボックスのオブジェクト名を設定します。プログラムを書くときにテキストボックスである事が分かりやすい様にText Boxの頭文字を取って「入力tb」と言う名前にしました。
◆コマンドボタンのオブジェクト名を設定する
コマンドボタンも名前をつけておきます。登録ボタンなのでCommand Bottonの頭文字を取って「登録cb」という名前にしました。
各種プロパティを設定する
◆ユーザーフォームのプロパティ設定
細かい設定をしていきます。ユーザーフォームの左上の所にUserForm1と書いてあります。ここはCaptionというプロパティの値が表示されます。プロパティウィンドウのCaptionの所を変更します。
今回はCaptionの部分に「ユーザー登録フォーム」と書き込みました。UserForm1と表示されていたユーザーフォームの部分の文字が変わりました。
◆テキストボックスのプロパティ設定
テキストボックスは今回は細かいプロパティ設定は行いません。工夫するのであれば、予め灰色で「ユーザー名を入力して下さい」などの文字を表示させておいて、ユーザーが入力する際には黒の文字が入力される、と言う事が考えられます。
◆登録ボタンのプロパティ設定
登録ボタンには「登録」の文字列を表示するようにしておきましょう。
見た目にこだわりたい場合は、Fontで文字を大きくしたり字体を変更することができるので、色々と試してみましょう。
プログラムを書く
ようやくユーザーフォームの設計が終わりました。ここから、それぞれのコントロールが操作された時のプログラムを記述していきます。ちなみにプログラムの内容はフォームモジュールに記述します。フォームモジュールはユーザーフォームというオブジェクトにくっついたモジュールです。
今回は登録cbが押された時のイベントを記述します。フォームモジュールのコードを表示させるには、プロジェクトエクスプローラの左上にあるコードの表示ボタンを押します。
Subプロシジャを挿入する
フォームモジュールに書くSubプロシジャはエディタ上部のプルダウンリストから、イベントのトリガーとなるオブジェクト名とトリガーとなる出来事を選択することによって挿入します。
今回は登録cbがクリックされたときにイベントを発生させたいので、「登録cb」と「Click」を選択しました。クリック系のコマンドには他にもMouseUpなどがあります。
MouseUpについて簡単に説明します。例えば、ウェブサイト上のリンクをクリックしたらリンク先に飛びますが、あれは左クリックのボタンを押した瞬間に画面が遷移しているのではありません。マウスの左ボタンを放した瞬間にリンク先に画面遷移します。(ピンと来ない方は、リンクを押して離さず待って、しばらくしてから離してみて下さい)それと同じ動きがMouseUpです。
一方Clikは左クリックの押す、と離すのセットです。今回はどちらを選んでも構いません。
Subプロシジャの中身を作成する
サンプルプログラムは下記の通りです。
Private Sub 登録cb_Click() Sheets(1).Range("A1") = 入力tb.Value Unload Me MsgBox 入力tb.Value & "を登録しました!" End Sub
一行ずつ解説します。
◆ Private Sub 登録cb_Click()
まず、これはイベントプロシジャです。前述の手順で自動的にSubプロシジャ名が挿入されます。ここで「コントロールのオブジェクト名_イベントトリガー」がプロシジャ名となります。よって、オブジェクト名は大事で。このプロシジャを挿入してからオブジェクト名を変更すると、このプロシジャ名も変更する必要があります。冒頭部分でオブジェクト名は大事、と解説した理由はこの点です。気をつけましょう。
◆ Sheets(1).Range("A1") = 入力tb.Value
一番左のシートのA1セルに、ユーザーがテキストボックスに入力した内容を記入しています。テキストボックスに入力された値はテキストボックスのオブジェクトのValueプロパティに設定されます。そのため、右辺が、入力tb.Valueとなっています。
本当は一度変数に代入する方が筋がいいですが、サンプルコードのわかりやすさを優先して、直接入力しました。
◆ Unload Me
このサンプルコードの肝です。Unloadはユーザーフォームのオブジェクトをロード非表示の状態に戻します。厳密には非表示にするのではなく、そもそも表示させる前の何もしていない状態に戻します。Meはユーザーフォームのことを意味しています。
MsgBox 入力tb.Value & "を登録しました!"
入力tbに入力された内容をメッセージボックスに表示しています。Unload Meの前に記述すると、メッセージボックスがユーザーフォームの上に表示されます。UnloadとMsgBoxのどちらを先に記述するのがいいかは実際に動かしてみて決めましょう。
ユーザーフォームを表示させるプロシジャを記述する
前項まででユーザーフォームのオブジェクトとフォームモジュールの両方を作成する事ができました。つまり、ユーザーフォームが完成しました!
あとはユーザーフォームを表示するSubプロシジャを標準モジュールに作成するだけです。
'これは標準モジュールに書くサンプルです Sub 入力フォームを表示させる() 入力フォーム.Show End Sub
.Showメソッドはユーザーフォームを立ち上げて表示させます。これで、ユーザーフォームを使う事ができました。