Excel VBA:ユーザーフォームの基礎
音声
目次
ユーザーフォームの作成と表示(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のセキュリティ設定でマクロを有効にしてください。
要約
VBEでUserFormを作成し、標準モジュールから
で表示できます。UserForm1.Showテキストボックスやボタンは、Nameを分かりやすくしておくとコードが書きやすくなります。
InitializeやClick、Changeなどのイベントで初期化やユーザー操作への反応を実装します。
入力はTrimやIsNumeric、IsDateなどで検証し、MsgBoxやSetFocusでフィードバックします。
シートへの登録はEnd(xlUp).Offset(1,0)などで次の行に追記し、.xlsmで保存して実行します。