VBAのユーザーフォームを使えば、入力欄を整えてボタン1つでデータをシートに追加する仕組みを作れます。Excelに詳しくないメンバーでも操作できる入力画面になるため、誤入力を減らし、データの品質を保つことができます。
この記事では、次の内容を順番に解説します。
- ユーザーフォームの作成手順(コントロールの配置)
- 入力内容をシートの末尾に追加するコード
- 入力チェック(バリデーション)の追加方法
- フォームをシートのボタンから呼び出す方法
ユーザーフォームを作成するには?
VBEでユーザーフォームを追加し、テキストボックスとボタンを配置します。
- Alt+F11 でVBEを開く
- メニューの「挿入」→「ユーザーフォーム」を選ぶ
- ツールボックスからテキストボックス(TextBox)を3つ、コマンドボタン(CommandButton)を1つフォームに配置する
- プロパティウィンドウで各コントロールの名前(Name)を設定する
| コントロール | Name(名前) | Caption(表示テキスト) | 役割 |
|---|---|---|---|
| TextBox | txtName | (なし) | 名前の入力欄 |
| TextBox | txtDept | (なし) | 部署の入力欄 |
| TextBox | txtDate | (なし) | 日付の入力欄 |
| CommandButton | btnAdd | 追加 | データを追加するボタン |
| CommandButton | btnClose | 閉じる | フォームを閉じるボタン |
フォームの Caption(タイトルバーの文字)も「データ入力フォーム」などに変更しておくと親切です。
入力内容をシートの末尾に追加するには?
追加ボタンのクリックイベントに、入力値をシートに書き込む処理を記述します。A列の最終行を取得し、その次の行に書き込みます。
Private Sub btnAdd_Click()
Dim ws As Worksheet
Dim r As Long
Set ws = ThisWorkbook.Sheets("データ")
'次の空行を取得
r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
'入力値をシートに転記
ws.Cells(r, 1).Value = txtName.Value
ws.Cells(r, 2).Value = txtDept.Value
ws.Cells(r, 3).Value = txtDate.Value
'入力欄をクリアして次の入力に備える
txtName.Value = ""
txtDept.Value = ""
txtDate.Value = ""
'名前欄にフォーカスを戻す
txtName.SetFocus
MsgBox "データを追加しました。"
End Sub
Private Sub btnClose_Click()
Unload Me
End Sub
入力チェックを追加するには?
必須項目が空欄のまま追加されると、後で困ることがあります。追加ボタンを押したときに入力内容を確認し、問題があればメッセージを出して処理を止めるチェックを入れましょう。
Private Sub btnAdd_Click()
Dim ws As Worksheet
Dim r As Long
'入力チェック:名前が空欄
If Trim(txtName.Value) = "" Then
MsgBox "名前を入力してください。", vbExclamation
txtName.SetFocus
Exit Sub
End If
'入力チェック:日付の形式
If Trim(txtDate.Value) <> "" Then
If Not IsDate(txtDate.Value) Then
MsgBox "日付の形式が正しくありません。(例:2026/04/16)", vbExclamation
txtDate.SetFocus
Exit Sub
End If
End If
Set ws = ThisWorkbook.Sheets("データ")
r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(r, 1).Value = Trim(txtName.Value)
ws.Cells(r, 2).Value = Trim(txtDept.Value)
'日付は入力があればDate型で格納
If txtDate.Value <> "" Then
ws.Cells(r, 3).Value = CDate(txtDate.Value)
ws.Cells(r, 3).NumberFormat = "yyyy/mm/dd"
End If
txtName.Value = ""
txtDept.Value = ""
txtDate.Value = ""
txtName.SetFocus
MsgBox "データを追加しました。"
End Sub
入力チェックのポイントをまとめます。
| チェック内容 | 方法 |
|---|---|
| 必須項目が空欄 | Trim(txtName.Value) = "" で判定 |
| 日付形式の確認 | IsDate(txtDate.Value) で判定 |
| 数値チェック | IsNumeric(txtValue.Value) で判定 |
| 前後の空白除去 | Trim() で空白を取り除く |
シートのボタンからフォームを呼び出すには?
標準モジュールにフォームを表示するマクロを書き、シートのボタンに割り当てると、クリックひとつで入力画面が開くようになります。
'標準モジュールに記述する
Sub ShowInputForm()
UserForm1.Show
End Sub
シートにボタンを配置する手順は次のとおりです。
- 「開発」タブ→「挿入」→「ボタン(フォームコントロール)」を選ぶ
- シート上でドラッグしてボタンを配置する
- 「マクロの登録」ダイアログが開くので
ShowInputFormを選択してOKを押す - ボタンの文字を「データ入力」などに変更する
まとめ
- ユーザーフォームにテキストボックスとボタンを配置し、btnAdd_Click イベントに転記処理を書くのが基本
End(xlUp).Row + 1で常にシートの末尾行に追加できるTrim・IsDate・IsNumericを使った入力チェックを入れると誤入力を防げる- 追加後は
txtName.Value = ""とSetFocusで入力欄をリセットして次の入力を促す - 標準モジュールに
UserForm1.Showを書いてシートボタンに割り当てると、誰でも使いやすい入力ツールになる
よくある質問
フォームのデザインを整えるにはどうすればいいですか?
各コントロールのプロパティウィンドウで Font(フォントサイズ)・BackColor(背景色)・ForeColor(文字色)・Width・Height などを変更できます。ラベル(Label)コントロールを追加して入力欄の名前を表示すると、利用者にとってわかりやすくなります。
フォームを開いたときに日付欄に今日の日付を自動入力したいです
フォームの UserForm_Initialize イベントに次を記述します。txtDate.Value = Format(Date, "yyyy/mm/dd") と書くと、フォームが開いたときに今日の日付が自動で入力された状態になります。
ドロップダウン(コンボボックス)も追加できますか?
できます。ツールボックスから ComboBox を配置し、UserForm_Initialize の中で cmbDept.AddItem "営業部" のように選択肢を追加します。選択式にすることで入力ミスをさらに減らせます。
入力されたデータを後から修正する機能も作れますか?
作れます。一覧から行番号を選択してフォームに値を読み込み、修正後に同じ行を上書きする仕組みが一般的です。実装は少し複雑になりますが、「選択した行をフォームに表示」→「修正」→「更新ボタンで上書き」という流れで作れます。
「開発」タブが表示されていません
Excelの「ファイル」→「オプション」→「リボンのユーザー設定」→右側の一覧から「開発」にチェックを入れてOKを押すと表示されます。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



