Excel VBA | 実務向け UI 部品ライブラリ

VBA
スポンサーリンク

以下は、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
VB

4-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
タイトルとURLをコピーしました