前回の「第1回 フォームを使った顧客管理の作成[初級編]」で作成した「顧客情報入力」フォームに「検索」ボタンを追加して、「顧客検索」画面表示→顧客選択→データ表示→修正登録が出来るよう機能追加する手順を紹介します。
<機能追加手順>
●フォームを使った顧客管理の作成[初級編] で作成したファイルを開いて「Visual Basic Editor」を起動し、メニューバー「挿入→標準モジュール」で標準モジュールを追加します。
追加した標準モジュールへ「顧客情報入力」フォームと「顧客検索」フォーム間でデータを受け渡しを行うための変数の宣言を記述します。
Public rtnNo As Long '← 長整数型の変数の宣言
●メニューバー「挿入→ユーザーフォーム」で新規フォームを追加します。
顧客名のラベルとテキストボックスを追加し、テキストボックスの「オブジェクト名」プロパティに名前(txt顧客名)を設定します。
リストボックスを追加し、リストボックスの「オブジェクト名」プロパティに名前(lst顧客リスト)を設定します。
リストボックスの「ColumnCount」プロパティ(列数)に「2」を設定し、「ColumnWidths」プロパティ(列幅)に「20 ; 200」を設定します。
フォームの処理を記述します。
Private Sub UserForm_Initialize() '← フォームを表示した時の処理追加
rtnNo = 0 '← フォーム間のデータ受け渡し用変更の初期化
Call SetListBox '← リストボックスに表示する処理を実行(下部に処理記述)
End Sub
Private Sub txt顧客名_Change() '← 検索する顧客名を入力した時の処理追加
Call SetListBox '← リストボックスに表示する処理を実行(下部に処理記述)
End Sub
Private Sub lst顧客リスト_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
'リストボックスから顧客名をダブルクリック選択した時の処理追加
rtnNo = Me.lst顧客リスト.Text '← ダブルクリックされた顧客名の行番号を渡す
Unload Me '← フォームを閉じる
End Sub
Private Sub SetListBox() '← リストボックスに表示する処理追加
Dim wRow As Long
Dim wLstRow As Long
Me.lst顧客リスト.Clear '← リストボックスを初期化
wLstRow = 0
For wRow = 2 To Worksheets("顧客情報").Range("A1").CurrentRegion.Rows.Count
If Me.txt顧客名 = "" Then
'検索する顧客名が入力されていない場合は、
'「顧客情報」シートの2行目~最終行の行番号と顧客名をリストボックスにセット
Me.lst顧客リスト.AddItem ""
Me.lst顧客リスト.List(wLstRow, 0) = wRow
Me.lst顧客リスト.List(wLstRow, 1) = Worksheets("顧客情報").Cells(wRow, 2)
wLstRow = wLstRow + 1
Else
If InStr(1, Worksheets("顧客情報").Cells(wRow, 2), Me.txt顧客名, vbTextCompare) > 0 Then
'検索する顧客名が一部一致した場合、行番号と顧客名をリストボックスにセット
Me.lst顧客リスト.AddItem ""
Me.lst顧客リスト.List(wLstRow, 0) = wRow
Me.lst顧客リスト.List(wLstRow, 1) = Worksheets("顧客情報").Cells(wRow, 2)
wLstRow = wLstRow + 1
End If
End If
Next
End Sub
●作成したフォームの「オブジェクト名」プロパティに名前(frm顧客検索)を付けて、フォームのタイトルバーに表示する名称(顧客検索)を「Caption」プロパティに設定します。
●初級編で作成した「frm顧客情報入力」フォームを開き、行番号用のラベルを追加し、ラベルの「オブジェクト名」プロパティに名前(lbl行番号)を設定します。
検索用のコマンドボタンを追加し、「オブジェクト名」プロパティに名前(cmd検索)を付けて、ボタンに表示する名称(検索)を「Caption」プロパティに設定します。
「frm顧客情報入力」フォームの処理を追加・変更します。
Private Sub UserForm_Initialize() '← フォームを表示した時の処理追加
'行番号ラベルに最終行+1をセット
Me.lbl行番号.Caption = Worksheets("顧客情報").Range("A1").CurrentRegion.Rows.Count + 1
End Sub
Private Sub cmd検索_Click() '← 検索ボタン押下時の処理追加
frm顧客検索.Show vbModal '← 顧客検索フォームを表示する
If rtnNo > 1 Then
'顧客検索フォームから渡された行番号のデータをセットする
With Worksheets("顧客情報")
Me.lbl行番号.Caption = rtnNo
Me.txt顧客番号 = .Cells(rtnNo, 1)
Me.txt顧客名 = .Cells(rtnNo, 2)
Me.txt郵便番号 = .Cells(rtnNo, 3)
Me.txt住所 = .Cells(rtnNo, 4)
Me.txt電話番号 = .Cells(rtnNo, 5)
Me.txt備考 = .Cells(rtnNo, 6)
End With
End If
End Sub
Private Sub cmd登録_Click() '← 登録ボタン押下時の処理
Dim wRow As Long
If Me.txt顧客番号 = "" Then
MsgBox "顧客番号を入力してください。", vbExclamation + vbOKOnly, "入力エラー"
Exit Sub
End If
If Me.txt顧客名 = "" Then
MsgBox "顧客名を入力してください。", vbExclamation + vbOKOnly, "入力エラー"
Exit Sub
End If
'フォーム上の各データをシートへ送る
With Worksheets("顧客情報")
wRow = Me.lbl行番号.Caption
.Cells(wRow, 1) = Me.txt顧客番号
.Cells(wRow, 2) = Me.txt顧客名
.Cells(wRow, 3) = Me.txt郵便番号
.Cells(wRow, 4) = Me.txt住所
.Cells(wRow, 5) = Me.txt電話番号
.Cells(wRow, 6) = Me.txt備考
End With
Unload Me
End Sub
<完成>
次回は、今回作成したフォームに [ |< ] [ < ] [ > ] [ >| ] [新規]ボタンを追加して、「顧客情報入力」画面内で顧客データの「先頭へ移動」「前へ移動」「次へ移動」「最終へ移動」「新規へ移動」が出来るよう機能追加する手順を紹介します。
第3回 フォームを使った顧客管理の作成 [移動ボタンの追加]