以下は、Excel VBAで実務でよく使う「UI部品ライブラリ」としてまとめたものです。すべて そのまま流用できるテンプレート で、使い方もセットで示します。
課題:実務で毎回同じUI部品を作るのは面倒 → 部品化して“積み木”のように使える形にする。
1. 定番メッセージ系 UI 部品
1-1: Yes/No 選択ダイアログ
部品コード
Function UI_YesNo(msg As String, Optional title As String = "確認") As Boolean
UI_YesNo = (MsgBox(msg, vbYesNo + vbQuestion, title) = vbYes)
End Function
VB使い方
If UI_YesNo("処理を実行しますか?") Then
Call 実行処理
End If
VB何に使うか
- 削除の確認
- 書き込み前の確認
- 長時間処理の実行前チェック
1-2: 入力ボックス(バリデーション付き)
部品コード
Function UI_InputNumber(prompt As String, Optional title As String = "入力") As Variant
Dim v, msg
msg = prompt & vbCrLf & "(数字を入力してください)"
v = InputBox(msg, title)
If v = "" Then
UI_InputNumber = CVErr(xlErrNull)
Exit Function
End If
If IsNumeric(v) Then
UI_InputNumber = CDbl(v)
Else
MsgBox "数字を入力してください", vbExclamation
UI_InputNumber = CVErr(xlErrValue)
End If
End Function
VB使い方
Dim n
n = UI_InputNumber("数量を入力してください")
If IsError(n) Then Exit Sub
VB何に使うか
- 数量入力
- 金額入力
- ID の直接入力
2. シート UI(シンプルだが強力)
2-1: ボタンに処理を自動割り当て
部品
Sub UI_AddButton(c As Range, caption As String, macroName As String)
Dim shp As Shape
Set shp = c.Parent.Shapes.AddShape(msoShapeRoundedRectangle, _
c.Left, c.Top, c.Width, c.Height)
shp.TextFrame.Characters.Text = caption
shp.OnAction = macroName
shp.Fill.ForeColor.RGB = RGB(230, 230, 250)
shp.Line.Visible = msoFalse
End Sub
VB使い方
Call UI_AddButton(Range("B2"), "更新", "更新処理")
VB何に使うか
- 実務テンプレ:更新・抽出・登録ボタンを一括生成
- “シートUIメニュー” を自動生成できる
2-2: テーブル検索フィルタ UI
(ユーザーがセルに入力 → 自動で該当行のみ表示)
部品コード
Sub UI_AutoFilterByCell(tbl As ListObject, keyColName As String, criteriaCell As Range)
Dim key As String
key = criteriaCell.Value
If key = "" Then
tbl.Range.AutoFilter field:=tbl.ListColumns(keyColName).Index
Else
tbl.Range.AutoFilter _
field:=tbl.ListColumns(keyColName).Index, _
Criteria1:="*" & key & "*"
End If
End Sub
VB使い方例
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$1" Then
Call UI_AutoFilterByCell([Table1], "商品名", Range("B1"))
End If
End Sub
VB何に使うか
- 入力値で“リアルタイム検索”
- 大量データの見たい行だけをすぐに抽出
3. UserForm UI 部品
3-1: コンボボックスにリストを簡単セット
部品コード
Sub UI_SetComboList(cmb As MSForms.ComboBox, arr)
cmb.Clear
cmb.List = arr
End Sub
VB使い方
Call UI_SetComboList(Me.cmb担当, [{"営業","開発","総務","経理"}])
VB何に使うか
- 選択肢のドロップダウンを簡単構築
- マスタ値の選択
3-2: リストボックスに表データを流し込む
部品コード
Sub UI_SetListBoxFromSheet(lst As MSForms.ListBox, src As Range)
lst.Clear
lst.ColumnCount = src.Columns.Count
lst.List = src.Value
End Sub
VB使い方
Call UI_SetListBoxFromSheet(Me.lst商品一覧, Range("A1:C200"))
VB何に使うか
- 商品一覧選択画面
- マスタ参照画面
- 検索結果の表示
3-3: エラーハイライト(フォーム入力チェック)
部品コード
Sub UI_HighlightIfEmpty(txt As MSForms.TextBox)
If Trim(txt.Text) = "" Then
txt.BackColor = RGB(255, 220, 220)
Else
txt.BackColor = vbWhite
End If
End Sub
VB使い方
Call UI_HighlightIfEmpty(Me.txt氏名)
Call UI_HighlightIfEmpty(Me.txt数量)
VB何に使うか
- 入力漏れを視覚的に強調
- 登録前のチェックに必須
4. フォーム共通処理部品
4-1: フォーム中央配置
Sub UI_FormCenter(frm As Object)
frm.Left = (Application.UsableWidth - frm.Width) / 2
frm.Top = (Application.UsableHeight - frm.Height) / 2
End Sub
VB使い方
Private Sub UserForm_Initialize()
UI_FormCenter Me
End Sub
VB4-2: フォームの一括リセット
Sub UI_ClearForm(frm As Object)
Dim c
For Each c In frm.Controls
Select Case TypeName(c)
Case "TextBox": c.Text = ""
Case "ComboBox": c.ListIndex = -1
Case "ListBox": c.Clear
Case "CheckBox": c.Value = False
End Select
Next
End Sub
VB使い方
Call UI_ClearForm(Me)
VB用途
- 登録後に入力欄を一括クリア
- 初期化処理を短くできる
5. 実務向け:UI部品をまとめた“フォームテンプレ”
完全テンプレ(コピペで使える)
- ① ロード時:初期化
- ② ボタンクリック
- ③ 入力チェック
- ④ 登録実行
を持つ プロの標準フォーム構成
Private Sub UserForm_Initialize()
UI_FormCenter Me
UI_SetComboList Me.cmb区分, [{"A","B","C"}]
End Sub
Private Sub btn登録_Click()
If Not CheckInput Then Exit Sub
Call Exec_Register
MsgBox "登録しました"
UI_ClearForm Me
End Sub
Private Function CheckInput() As Boolean
Call UI_HighlightIfEmpty(Me.txt名前)
Call UI_HighlightIfEmpty(Me.txt数量)
If Trim(Me.txt名前) = "" Then
MsgBox "名前を入力してください"
Exit Function
End If
If Trim(Me.txt数量) = "" Then
MsgBox "数量を入力してください"
Exit Function
End If
CheckInput = True
End Function
Private Sub Exec_Register()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row + 1
Cells(lastRow, "A") = Me.txt名前
Cells(lastRow, "B") = Me.txt数量
Cells(lastRow, "C") = Me.cmb区分.Text
End Sub
VB
