【VBA入門】第4回:ユーザーフォームで入力画面を作ろう|脱・セル入力でミスを撲滅する
はじめに:なぜ「専用の画面」を作るのか?
これまでの第1回〜第3回では、ワークシート上のセルを直接操作するマクロを書いてきました。しかし、自分以外の人が使うツールを作る場合、セルに直接入力してもらう方法にはリスクがあります。
- 誤操作のリスク:誤って計算式が入っているセルを消してしまう。
- 入力ミスのリスク:日付を入れるべき場所に名前を入れてしまう。
- 見た目の問題:Excelの表計算画面そのままでは、システムっぽさがなく使いにくい。
そこで登場するのが**「ユーザーフォーム」です。 これは、Excelの上に浮かび上がる「専用のウィンドウ」**のことです。皆さんが普段使っているWebサイトの入力フォームや、アプリの設定画面のようなものを、VBAで作ることができるのです。
第4回では、このユーザーフォームを使って、**「誰でも簡単に、安全にデータを登録できる入力ツール」**を作成します。コードの量は少し増えますが、完成した時の達成感は格別です!
1. ユーザーフォームの基礎知識:「画用紙」と「部品」
ユーザーフォーム作りは、図工の時間に似ています。プロセスは大きく分けて2段階です。
- 外観を作る(デザイン):画用紙(フォーム)を用意し、そこに部品(ボタンやテキストボックス)を貼り付ける。
- 動きを作る(コーディング):貼り付けたボタンが押されたときに何をするか、命令を書く。
まずは、VBE(Visual Basic Editor)を開いて、デザインから始めましょう。
ステップ1:フォームの挿入
- VBEを開きます(
Alt + F11)。 - メニューバーの「挿入」をクリックし、**「ユーザーフォーム」**を選択します。
- 画面にグレーの四角いウィンドウ(
UserForm1)が表示されます。これが「画用紙」です。
ステップ2:ツールボックスから部品を配置
フォームが表示されると、**「ツールボックス」**というパレットも一緒に表示されます(表示されない場合は、メニューの「表示」→「ツールボックス」をクリック)。
ここから部品を選んで、フォームの上にドラッグ&ドロップで配置していきます。今回使うのは以下の3つの主要パーツです。
| アイコン | 名前 | 役割 | 例え |
| A | ラベル (Label) | 画面に文字を表示するだけ。ユーザーは編集できません。 | 「名前を入力:」という案内シール |
| abl | テキストボックス(TextBox) | ユーザーが文字や数値を入力する場所。 | 記入欄(空欄の箱) |
| □ | コマンドボタン(CommandButton) | クリックすると処理を実行するボタン。 | 実行スイッチ |
Google スプレッドシートにエクスポート
ステップ3:プロパティの設定(超重要!)
部品を配置したら、それぞれの**「プロパティ(属性)」**を設定します。 画面左下の「プロパティウィンドウ」を見てください。ここで色や大きさ、名前を変更します。
特に初心者が混乱しやすいのが、**「(オブジェクト)名」と「Caption」**の違いです。
- Caption(キャプション):
- 画面に表示される文字です。
- 例:ボタンに「登録」と表示したいなら、Captionを「登録」に変えます。
- (オブジェクト)名:
- VBAのコードの中で使う名前です。
- 例:
CommandButton1だと何をするボタンか分からないので、btnEntry(登録ボタン)のように分かりやすい名前に変えるのが定石です。
2. 実践演習:「経費精算入力ツール」を作ろう
では、実際に手を動かしてツールを作ってみましょう。 今回は、「日付」「項目名」「金額」を入力して、「登録」ボタンを押すとシートに転記されるアプリを作ります。
① 外観のデザイン(GUI作成)
フォーム上に以下の構成で部品を並べてください。プロパティも表の通りに変更しましょう。
フォーム全体 (UserForm1)
- (オブジェクト)名:
frmExpense - Caption: 経費入力ツール
1. 日付入力用
- ラベル: Captionを「日付」にする
- テキストボックス: (オブジェクト)名を
txtDateに変更
2. 項目入力用
- ラベル: Captionを「項目名」にする
- テキストボックス: (オブジェクト)名を
txtItemに変更
3. 金額入力用
- ラベル: Captionを「金額」にする
- テキストボックス: (オブジェクト)名を
txtAmountに変更
4. 実行ボタン
- コマンドボタン: (オブジェクト)名を
btnEntryに変更、Captionを「登録」にする
5. 閉じるボタン
- コマンドボタン: (オブジェクト)名を
btnCloseに変更、Captionを「閉じる」にする
アドバイス: 部品をきれいに並べるには、複数の部品を選択(Ctrlキーを押しながらクリック)して、右クリックメニューの「配置」を使うと便利です。
② 魂を吹き込む(コーディング)
デザインができたら、いよいよコードを書きます。 作成したフォーム上の「登録ボタン」をダブルクリックしてください。
すると、自動的に以下のようなコードブロックが作成されます。
VBA
Private Sub btnEntry_Click()
End Sub
これは**「btnEntryというボタンが、クリック(Click)されたときに実行する処理」という意味です。これをイベントプロシージャ**と呼びます。
この中に、以下のコードを記述します。解説を読みながら入力してください。
VBA
Private Sub btnEntry_Click()
' --- 変数の宣言 ---
Dim ws As Worksheet
Dim lastRow As Long
' 入力先シートを指定(なければ "経費一覧" というシートを作ってください)
Set ws = Worksheets("経費一覧")
' --- 1. 入力チェック(バリデーション) ---
' これをやらないと、変なデータが登録されてしまいます
' 日付が未入力の場合
If Me.txtDate.Value = "" Then
MsgBox "日付を入力してください。", vbExclamation
Me.txtDate.SetFocus ' カーソルを日付欄に戻す
Exit Sub ' 処理をここで強制終了
End If
' 金額が数値じゃない場合
If IsNumeric(Me.txtAmount.Value) = False Then
MsgBox "金額は半角数字で入力してください。", vbExclamation
Me.txtAmount.SetFocus
Exit Sub
End If
' --- 2. データの転記処理 ---
' データの最終行を探す(第2回・第3回の復習!)
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
' 最終行の「1つ下の行」に書き込む
' Me.〇〇 は「このフォームにある〇〇」という意味です
ws.Cells(lastRow + 1, 1).Value = Me.txtDate.Value
ws.Cells(lastRow + 1, 2).Value = Me.txtItem.Value
ws.Cells(lastRow + 1, 3).Value = Me.txtAmount.Value
' --- 3. 登録後の後始末 ---
MsgBox "登録しました!"
' 次の入力のためにボックスを空にする
Me.txtItem.Value = ""
Me.txtAmount.Value = ""
' 日付はそのまま残すか、今日の日付にするのが親切
Me.txtDate.SetFocus
End Sub
続いて、「閉じるボタン」の処理も書きましょう。デザイン画面に戻り、「閉じるボタン」をダブルクリックします。
VBA
Private Sub btnClose_Click()
' 自分自身(Me)をメモリから降ろす(画面を閉じる)
Unload Me
End Sub
3. フォームを呼び出すマクロを作る
ここまででフォームは完成しましたが、このフォームを表示するための「入り口」が必要です。 標準モジュール(Module1など)に、以下の短いコードを追加しましょう。
VBA
Sub ShowExpenseForm()
' 作成したフォームの名前.Show で表示できます
frmExpense.Show
End Sub
あとは、Excelシート上に「入力画面を開く」という図形ボタンなどを配置し、この ShowExpenseForm マクロを登録すれば完成です!
4. 初心者がレベルアップするための3つのポイント
フォーム作りをもっと便利にするための、プロっぽいテクニックを紹介します。
① フォームを開いた瞬間に初期値をセットする
いちいち日付を手入力するのは面倒ですよね。フォームが開かれた瞬間に、自動的に今日の日付が入るようにしましょう。
これには**「Initialize(イニシャライズ)」**という特別なイベントを使います。 フォームのコード画面の何もないところをダブルクリックし、右上のプルダウンから「Initialize」を探すか、以下のように手書きします。
VBA
' フォームが読み込まれたとき(表示される直前)に動く処理
Private Sub UserForm_Initialize()
' 日付ボックスに今日の日付を入れる
Me.txtDate.Value = Format(Date, "yyyy/mm/dd")
' 金額ボックスの初期値を0にしておく
Me.txtAmount.Value = ""
End Sub
② タブオーダーを整える
入力するとき、Tabキーを押すと次の項目にカーソルが移動しますよね。 この移動順序がおかしい(日付 → 金額 → 項目 のように飛んでしまう)と、非常に使いにくいツールになります。
- フォームのデザイン画面で、何もないところを右クリック。
- **「タブオーダー」**を選択。
- リストが表示されるので、上から順に
txtDate→txtItem→txtAmount→btnEntryとなるように並べ替えましょう。
これで、キーボードだけでスムーズに入力できるプロ仕様のフォームになります。
③ データの型に注意する
テキストボックスに入力されたデータは、見た目は数字でも、VBA内部では「文字列」として扱われることがあります。 そのまま計算に使いたい場合は、明示的に数値に変換しておくと安全です。
VBA
' Val関数を使うと、文字列を数値に変換できます
ws.Cells(lastRow + 1, 3).Value = Val(Me.txtAmount.Value)
5. よくあるエラーと対処法
フォーム作成中によく出会うトラブルです。
- エラー:「オブジェクトが必要です」
- 原因:テキストボックスの名前をコード内で間違えていることが多いです。
- 対策:プロパティウィンドウで名前を確認してください。
TextBox1のままなのに、コードでtxtDateと書いていませんか?
- エラー:「変数が定義されていません」
- 原因:
Meを使い忘れているか、スペルミスです。 - 対策:フォーム上の部品を指すときは、必ず
Me.をつける癖をつけると、入力候補リスト(インテリセンス)が出るのでミスが減ります。
- 原因:
まとめと次回予告
第4回では、ユーザーインターフェース(GUI)の作成についてじっくり解説しました。
- ユーザーフォーム:入力専用のウィンドウを作る機能。
- コントロール:ラベル、テキストボックス、コマンドボタンなどの部品。
- イベント処理:「クリックした時」「開いた時」に動くコード。
- データの受け渡し:
Me.txtDate.Valueのようにして値を取り出し、セルに書き込む。
この機能を使えば、請求書作成ツール、在庫管理ツール、顧客リスト登録など、業務アプリのようなものがExcelだけで作れるようになります。ぜひ、色々なツール作成にチャレンジしてみてください。
次回(第5回)の予告
いよいよ入門シリーズも佳境に入ります。次回は**「外部データとの連携」**です。
実務では、他のシステムから出力された「CSVファイル」や「テキストファイル」をExcelに取り込んで加工する作業が頻繁に発生します。これを手動でやると、コピペミスや文字化けの元になります。
- ワンクリックでCSVファイルを読み込む方法
- 大量のテキストデータを一瞬で配列に入れて処理する「高速化の秘儀」
- FileSystemObject(ファイル操作のプロ)の使い方
これらをマスターすれば、あなたのVBAスキルは「業務効率化の切り札」となるでしょう。お楽しみに!
関連記事
