ユーザーフォームは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 | 〇〇新聞 | 300 | 15 | 4500 | 2024/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の入力が楽になります。