VBAのユーザーフォームでシートにデータを追加する方法|TextBox・入力チェック・SetFocusの実装

VBAのユーザーフォームを使えば、入力欄を整えてボタン1つでデータをシートに追加する仕組みを作れます。Excelに詳しくないメンバーでも操作できる入力画面になるため、誤入力を減らし、データの品質を保つことができます。

この記事では、次の内容を順番に解説します。

  • ユーザーフォームの作成手順(コントロールの配置)
  • 入力内容をシートの末尾に追加するコード
  • 入力チェック(バリデーション)の追加方法
  • フォームをシートのボタンから呼び出す方法

ユーザーフォームを作成するには?

VBEでユーザーフォームを追加し、テキストボックスとボタンを配置します。

  1. Alt+F11 でVBEを開く
  2. メニューの「挿入」→「ユーザーフォーム」を選ぶ
  3. ツールボックスからテキストボックス(TextBox)を3つ、コマンドボタン(CommandButton)を1つフォームに配置する
  4. プロパティウィンドウで各コントロールの名前(Name)を設定する
コントロールName(名前)Caption(表示テキスト)役割
TextBoxtxtName(なし)名前の入力欄
TextBoxtxtDept(なし)部署の入力欄
TextBoxtxtDate(なし)日付の入力欄
CommandButtonbtnAdd追加データを追加するボタン
CommandButtonbtnClose閉じるフォームを閉じるボタン

フォームの 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

シートにボタンを配置する手順は次のとおりです。

  1. 「開発」タブ→「挿入」→「ボタン(フォームコントロール)」を選ぶ
  2. シート上でドラッグしてボタンを配置する
  3. 「マクロの登録」ダイアログが開くので ShowInputForm を選択してOKを押す
  4. ボタンの文字を「データ入力」などに変更する

まとめ

  • ユーザーフォームにテキストボックスとボタンを配置し、btnAdd_Click イベントに転記処理を書くのが基本
  • End(xlUp).Row + 1 で常にシートの末尾行に追加できる
  • TrimIsDateIsNumeric を使った入力チェックを入れると誤入力を防げる
  • 追加後は txtName.Value = ""SetFocus で入力欄をリセットして次の入力を促す
  • 標準モジュールに UserForm1.Show を書いてシートボタンに割り当てると、誰でも使いやすい入力ツールになる

よくある質問

フォームのデザインを整えるにはどうすればいいですか?

各コントロールのプロパティウィンドウで Font(フォントサイズ)・BackColor(背景色)・ForeColor(文字色)・WidthHeight などを変更できます。ラベル(Label)コントロールを追加して入力欄の名前を表示すると、利用者にとってわかりやすくなります。

フォームを開いたときに日付欄に今日の日付を自動入力したいです

フォームの UserForm_Initialize イベントに次を記述します。txtDate.Value = Format(Date, "yyyy/mm/dd") と書くと、フォームが開いたときに今日の日付が自動で入力された状態になります。

ドロップダウン(コンボボックス)も追加できますか?

できます。ツールボックスから ComboBox を配置し、UserForm_Initialize の中で cmbDept.AddItem "営業部" のように選択肢を追加します。選択式にすることで入力ミスをさらに減らせます。

入力されたデータを後から修正する機能も作れますか?

作れます。一覧から行番号を選択してフォームに値を読み込み、修正後に同じ行を上書きする仕組みが一般的です。実装は少し複雑になりますが、「選択した行をフォームに表示」→「修正」→「更新ボタンで上書き」という流れで作れます。

「開発」タブが表示されていません

Excelの「ファイル」→「オプション」→「リボンのユーザー設定」→右側の一覧から「開発」にチェックを入れてOKを押すと表示されます。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール