Excel VBA:ユーザーフォームの基礎

投稿日:2026-01-07

音声

※ AI音声で読み上げます

目次

  1. ユーザーフォームの作成と表示(Show、Hide)
  2. コントロールの配置(テキストボックス、コマンドボタン、リストボックス、コンボボックス)
  3. イベントプロシージャ(Click、Initialize、Change)
  4. 入力値の検証とエラーメッセージ
  5. フォームからワークシートへのデータ登録
  6. 注意(ここだけ)
  7. 要約

ユーザーフォームの作成と表示(Show、Hide)

今回できるようになることとして、ユーザーフォームを作成して表示や非表示を操作できるようになります。

VBE(Visual Basic Editor)はExcelのAlt+F11で開き、メニューの「挿入」→「UserForm」で新しいフォームが作成できます。

保存形式はマクロ有効ブック(.xlsm)にして、Excel上で「コンテンツの有効化」をしておく必要があります。

フォームの表示は標準モジュールにショートマクロを書いて呼び出すのが手軽です。貼り付け場所は標準モジュール(Module1など)に表示用のサブルーチンを置くのがおすすめです。実行方法はVBEでモジュールを選んでF5実行する方法、またはワークシート上にボタンを配置して割り当てる方法があります。

最小マクロ:

Sub ShowSimpleForm()
    ' ユーザーフォームをモーダル表示(他の操作を止める)
    UserForm1.Show vbModal
End Sub

Sub ShowModelessForm()
    ' モードレス表示(フォームとシートが同時に操作可能)
    UserForm1.Show vbModeless
End Sub

Sub CloseFormFromModule()
    ' モジュール側からフォームを閉じる例
    Unload UserForm1
End Sub

コントロールの配置(テキストボックス、コマンドボタン、リストボックス、コンボボックス)

ツールボックスからドラッグして配置し、プロパティウィンドウでNameやCaption、Text、RowSourceを設定します。

TextBoxは自由入力、CommandButtonは処理開始、ListBoxは複数選択や一覧表示、ComboBoxはドロップダウンから選ぶ場面で使います。

初めて作るときはNameプロパティを分かりやすく(例:txtName、btnOK、lstItems、cmbCity)にしておくと後からのコードが読みやすくなります。

使い分けの基準として、セル指定で値を扱う場合はRange("A1")とCells(行, 列)のどちらを使うか検討します。固定セルならRangeが分かりやすく、行列を動的に扱うならCellsが扱いやすいです。

また、値の取得ではValueとValue2がありますが、日付や通貨で精度や型を意識する場合はValue2よりValueを使うほうが直感的です(簡潔さを優先するならValue2でもよいです)。

イベントプロシージャ(Click、Initialize、Change)

フォームやコントロールはイベントで動きます。

UserForm_Initializeはフォームが読み込まれた直後に実行され、初期値やリストのセットに使います。CommandButtonのClickはボタン押下時、TextBoxやComboBoxのChangeは内容が変わったときに呼ばれます。

イベント内ではMeを使って自身のコントロールにアクセスできます。以下はユーザーフォームのコード例で、Initializeでコンボを埋め、ボタンクリックで簡単な検証とシート書き込みを行います。

' UserFormのコードモジュール内に貼る例
Private Sub UserForm_Initialize()
    Me.ComboBox1.Clear
    Me.ComboBox1.AddItem "Tokyo"
    Me.ComboBox1.AddItem "Osaka"
    Me.ListBox1.Clear
    Me.ListBox1.AddItem "OptionA"
    Me.ListBox1.AddItem "OptionB"
End Sub

Private Sub CommandButton1_Click()
    If Trim(Me.TextBox1.Value) = "" Then
        MsgBox "名前を入力してください。", vbExclamation
        Me.TextBox1.SetFocus
        Exit Sub
    End If
    ' データ登録は後のセクション参照
    Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Me.TextBox1.Value
    Unload Me
End Sub

Private Sub ComboBox1_Change()
    ' 選択が変わったときに他の項目を更新するなど
End Sub

入力値の検証とエラーメッセージ

ユーザー入力は必ず検証します。文字列の空白チェックはTrim、数値はIsNumeric、日付はIsDateで判定します。

長さや桁数のチェックを加えたり、正規表現(RegExpを使う)で形式を厳密にしたりする方法もあります。

エラー表示はMsgBoxでユーザーに分かりやすく通知し、SetFocusで該当コントロールに戻すと親切です。

確認方法:検証後はMsgBoxの表示内容や、ワークシートの該当セルが変化していないかを確認します。

よくあるミス:ファイルをマクロ有効形式で保存していないためにフォームやマクロが動かないことがあります。原因は.xlsxで保存してしまうことで、直し方は一度.xlsmで保存し直してから再度開き、マクロを有効化します。

フォームからワークシートへのデータ登録

フォームで集めたデータをシートに書き込む方法は単純です。

新しい行に追加する場合は、Columns(1)の最終行をEnd(xlUp)で見つけて、Offset(1,0)で次行を指定します。

複数項目を一度に書くときは、配列やVariantにして書き込むと処理が速くなります。

大量データなら、Application.ScreenUpdating=Falseで画面更新を止めると体感が良くなります。

実装時は、書き込み位置やシート名を定数化しておくと後での変更が容易です。

デバッグ時は、ImmediateウィンドウにDebug.Printで値を出すと状況把握が早くなります。

注意(ここだけ)

  • マクロの動作確認前に、ブックをマクロ有効形式(.xlsm)で保存して、Excelのセキュリティ設定でマクロを有効にしてください。

要約

  1. VBEでUserFormを作成し、標準モジュールから

    UserForm1.Show
    で表示できます。

  2. テキストボックスやボタンは、Nameを分かりやすくしておくとコードが書きやすくなります。

  3. InitializeやClick、Changeなどのイベントで初期化やユーザー操作への反応を実装します。

  4. 入力はTrimやIsNumeric、IsDateなどで検証し、MsgBoxやSetFocusでフィードバックします。

  5. シートへの登録はEnd(xlUp).Offset(1,0)などで次の行に追記し、.xlsmで保存して実行します。