ユーザーフォームの便利な使い方

投稿日: 2024年6月29日

ユーザーフォームはExcel VBAを使用してカスタムユーザーインターフェースを作成するのに非常に便利です。以下に、ユーザーフォームの便利な使い方とそれを効果的に利用するための例を紹介します。

データ入力の効率化

Excelで名簿を入力するファイルがあった場合名前、年齢、性別などを入力する必要があった場合フォームを使うと入力が限定されて便利な場合があります。以下の図を想定して入力フォームを作成します。

VBエディタでフォームを作成し以下のように設定します。

オブジェクト名は下記のようにします。オブジェクトをクリックすると編集ができます。ボタンのみcaptionで「追加」「閉じる」を入力します。

ユーザーフォームの初期化

ユーザーフォームのコードを入力していきます。コード表示にして、ユーザーフォームの初期化イベントに以下のコードを追加し、コンボボックスに選択肢を設定します。
コードを表示して左上のドロップボックスから「UserForm」を選択し「Initialize」を選択します。

この「UserForm_Initialize」のプロシージャーにコンボボックスのアイテムを追加します。

Private Sub UserForm_Initialize()
    ' コンボボックスにアイテムを追加
    ComboBoxGender.AddItem "男性"
    ComboBoxGender.AddItem "女性"
    ComboBoxGender.AddItem "その他"
End Sub
データをシートに追加

CommandButtonAddのクリックイベントに以下のコードを追加します。

Private Sub CommandButtonAdd_Click()
    Dim ws As Worksheet
    Dim nextRow As Long
    
    ' シートを設定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' 次の空行を取得
    nextRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
    
    ' テキストボックスとコンボボックスの内容をシートに書き込む
    ws.Cells(nextRow, 1).Value = TextBoxName.Value
    ws.Cells(nextRow, 2).Value = TextBoxAge.Value
    ws.Cells(nextRow, 3).Value = ComboBoxGender.Value
    
    ' 入力フィールドをクリア
    TextBoxName.Value = ""
    TextBoxAge.Value = ""
    ComboBoxGender.Value = ""
    
    ' メッセージ表示
    MsgBox "データが正常に追加されました!"
End Sub
フォームを閉じる

CommandButtonCloseのクリックイベントに以下のコードを追加します。

Private Sub CommandButtonClose_Click()
    Unload Me
End Sub
フォームの表示

モジュールに以下のコードを追加し、フォームを表示するためのプロシージャーを作成します。

Sub ShowDataEntryForm()
    UserForm1.Show
End Sub
完成したコード

以下は、上記の手順に従って作成された完全なコードです。

ユーザーフォームコード(UserForm1)

Private Sub UserForm_Initialize()
    ComboBoxGender.AddItem "男性"
    ComboBoxGender.AddItem "女性"
    ComboBoxGender.AddItem "その他"
End Sub

Private Sub CommandButtonAdd_Click()
    Dim ws: Worksheet
    Dim nextRow: Long
    
    Set ws = ThisWorkbook.Sheets("Sheet1")
    nextRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
    
    ws.Cells(nextRow, 1).Value = TextBoxName.Value
    ws.Cells(nextRow, 2).Value = TextBoxAge.Value
    ws.Cells(nextRow, 3).Value = ComboBoxGender.Value
    
    TextBoxName.Value = ""
    TextBoxAge.Value = ""
    ComboBoxGender.Value = ""
    
    MsgBox "データが正常に追加されました!"
End Sub

Private Sub CommandButtonClose_Click()
    Unload Me
End Sub
標準モジュール
Sub ShowDataEntryForm()
    UserForm1.Show
End Sub

これにより、ユーザーフォームを使用して効率的にデータを入力し、Excelシートに反映させることができます。

購買入力の補助フォームを作成

下記のように商品の購入の台帳を作成するときに入力の補助をフォームでする場合も便利に使えます。
例えば商品名と単価と数量だけを入力すれば自動で番号を追加して合計値と入力日が自動で挿入されれば入力が楽になります。
以下はそういった入力を補助するフォームを作成していきます。

sheet1に以下のフィールドを作成してください。

id商品名単価数量合計タイムスタンプ
1〇〇新聞3001545002024/6/29 10:21:18

VBエディタのフォームは以下の図のように設定してください。

フォームの初期化

ユーザーフォームの初期化イベントに以下のコードを追加します。

Private Sub UserForm_Initialize()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' ListBoxにヘッダーを追加
    With listData
        .ColumnCount = 6
        .ColumnWidths = "20;100;30;30;50;100"
        .AddItem "ID"
        .List(.ListCount - 1, 1) = "商品名"
        .List(.ListCount - 1, 2) = "単価"
        .List(.ListCount - 1, 3) = "数量"
        .List(.ListCount - 1, 4) = "合計"
        .List(.ListCount - 1, 5) = "タイムスタンプ"
    End With

    ' ListBoxにデータをロード
    With listData
        For i = 2 To lastRow
            .AddItem ws.Cells(i, 1).Value
            .List(.ListCount - 1, 1) = ws.Cells(i, 2).Value
            .List(.ListCount - 1, 2) = ws.Cells(i, 3).Value
            .List(.ListCount - 1, 3) = ws.Cells(i, 4).Value
            .List(.ListCount - 1, 4) = ws.Cells(i, 5).Value
            .List(.ListCount - 1, 5) = ws.Cells(i, 6).Value
        Next i
    End With
End Sub
データの追加

btnAddのクリックイベントに以下のコードを追加します。

Private Sub btnAdd_Click()
    Dim ws As Worksheet
    Dim newRow As Long
    Dim newID As Long
    Dim productName As String
    Dim unitPrice As Double
    Dim quantity As Double
    Dim total As Double
    Dim timestamp As String

    Set ws = ThisWorkbook.Sheets("Sheet1")
    newRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1

    ' 新しいIDを計算
    If newRow = 2 Then
        newID = 1
    Else
        newID = ws.Cells(newRow - 1, 1).Value + 1
    End If

    productName = txtProductName.Value
    unitPrice = Val(txtUnitPrice.Value)
    quantity = Val(txtQuantity.Value)
    total = unitPrice * quantity
    timestamp = Now

    ' シートに新しい行を追加
    ws.Cells(newRow, 1).Value = newID
    ws.Cells(newRow, 2).Value = productName
    ws.Cells(newRow, 3).Value = unitPrice
    ws.Cells(newRow, 4).Value = quantity
    ws.Cells(newRow, 5).Value = total
    ws.Cells(newRow, 6).Value = timestamp

    ' ListBoxに新しい行を追加
    With listData
        .AddItem newID
        .List(.ListCount - 1, 1) = productName
        .List(.ListCount - 1, 2) = unitPrice
        .List(.ListCount - 1, 3) = quantity
        .List(.ListCount - 1, 4) = total
        .List(.ListCount - 1, 5) = timestamp
    End With

    ' テキストボックスをクリア
    txtProductName.Value = ""
    txtUnitPrice.Value = ""
    txtQuantity.Value = ""
End Sub
フォームを閉じる

btnCloseのクリックイベントに以下のコードを追加します。

Private Sub btnClose_Click()
    Unload Me
End Sub
標準モジュール

モジュールに以下のコードを追加し、フォームを表示するためのプロシージャーを作成します。

Sub ShowDataEntryForm()
    UserForm1.Show
End Sub
完成したコード

以下は、上記の手順に従って作成された完全なコードです。
ユーザーフォームコード(UserForm1)

Private Sub UserForm_Initialize()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' ListBoxにヘッダーを追加
    With listData
        .ColumnCount = 6
        .ColumnWidths = "20;100;30;30;50;100"
        .AddItem "ID"
        .List(.ListCount - 1, 1) = "商品名"
        .List(.ListCount - 1, 2) = "単価"
        .List(.ListCount - 1, 3) = "数量"
        .List(.ListCount - 1, 4) = "合計"
        .List(.ListCount - 1, 5) = "タイムスタンプ"
    End With

    ' ListBoxにデータをロード
    With listData
        For i = 2 To lastRow
            .AddItem ws.Cells(i, 1).Value
            .List(.ListCount - 1, 1) = ws.Cells(i, 2).Value
            .List(.ListCount - 1, 2) = ws.Cells(i, 3).Value
            .List(.ListCount - 1, 3) = ws.Cells(i, 4).Value
            .List(.ListCount - 1, 4) = ws.Cells(i, 5).Value
            .List(.ListCount - 1, 5) = ws.Cells(i, 6).Value
        Next i
    End With
End Sub

Private Sub btnAdd_Click()
    Dim ws As Worksheet
    Dim newRow As Long
    Dim newID As Long
    Dim productName As String
    Dim unitPrice As Double
    Dim quantity As Double
    Dim total As Double
    Dim timestamp As String

    Set ws = ThisWorkbook.Sheets("Sheet1")
    newRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1

    ' 新しいIDを計算
    If newRow = 2 Then
        newID = 1
    Else
        newID = ws.Cells(newRow - 1, 1).Value + 1
    End If

    productName = txtProductName.Value
    unitPrice = Val(txtUnitPrice.Value)
    quantity = Val(txtQuantity.Value)
    total = unitPrice * quantity
    timestamp = Now

    ' シートに新しい行を追加
    ws.Cells(newRow, 1).Value = newID
    ws.Cells(newRow, 2).Value = productName
    ws.Cells(newRow, 3).Value = unitPrice
    ws.Cells(newRow, 4).Value = quantity
    ws.Cells(newRow, 5).Value = total
    ws.Cells(newRow, 6).Value = timestamp

    ' ListBoxに新しい行を追加
    With listData
        .AddItem newID
        .List(.ListCount - 1, 1) = productName
        .List(.ListCount - 1, 2) = unitPrice
        .List(.ListCount - 1, 3) = quantity
        .List(.ListCount - 1, 4) = total
        .List(.ListCount - 1, 5) = timestamp
    End With

    ' テキストボックスをクリア
    txtProductName.Value = ""
    txtUnitPrice.Value = ""
    txtQuantity.Value = ""
End Sub
Private Sub btnClose_Click()
    Unload Me
End Sub
標準モジュールコード
Sub ShowDataEntryForm()
    UserForm1.Show
End Sub

このコードをVBAエディタにコピーして実行することで、ユーザーフォームを通じてデータを追加できるようになります。

このようにすればユーザーフォームでExcelの入力が楽になります。

記事