【VBA入門】第4回:ユーザーフォームで入力画面を作ろう|脱・セル入力でミスを撲滅する

はじめに:なぜ「専用の画面」を作るのか?

これまでの第1回〜第3回では、ワークシート上のセルを直接操作するマクロを書いてきました。しかし、自分以外の人が使うツールを作る場合、セルに直接入力してもらう方法にはリスクがあります。

  • 誤操作のリスク:誤って計算式が入っているセルを消してしまう。
  • 入力ミスのリスク:日付を入れるべき場所に名前を入れてしまう。
  • 見た目の問題:Excelの表計算画面そのままでは、システムっぽさがなく使いにくい。

そこで登場するのが**「ユーザーフォーム」です。 これは、Excelの上に浮かび上がる「専用のウィンドウ」**のことです。皆さんが普段使っているWebサイトの入力フォームや、アプリの設定画面のようなものを、VBAで作ることができるのです。

第4回では、このユーザーフォームを使って、**「誰でも簡単に、安全にデータを登録できる入力ツール」**を作成します。コードの量は少し増えますが、完成した時の達成感は格別です!


1. ユーザーフォームの基礎知識:「画用紙」と「部品」

ユーザーフォーム作りは、図工の時間に似ています。プロセスは大きく分けて2段階です。

  1. 外観を作る(デザイン):画用紙(フォーム)を用意し、そこに部品(ボタンやテキストボックス)を貼り付ける。
  2. 動きを作る(コーディング):貼り付けたボタンが押されたときに何をするか、命令を書く。

まずは、VBE(Visual Basic Editor)を開いて、デザインから始めましょう。

ステップ1:フォームの挿入

  1. VBEを開きます(Alt + F11)。
  2. メニューバーの「挿入」をクリックし、**「ユーザーフォーム」**を選択します。
  3. 画面にグレーの四角いウィンドウ(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キーを押すと次の項目にカーソルが移動しますよね。 この移動順序がおかしい(日付 → 金額 → 項目 のように飛んでしまう)と、非常に使いにくいツールになります。

  1. フォームのデザイン画面で、何もないところを右クリック。
  2. **「タブオーダー」**を選択。
  3. リストが表示されるので、上から順に 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スキルは「業務効率化の切り札」となるでしょう。お楽しみに!


関連記事

\ 最新情報をチェック /

コメントを残す

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