今回は、前回までに作成した「顧客情報入力」フォームに「フリガナ」項目を追加したいと思います。しかし、これまでの方法では「顧客情報入力」フォームから「顧客情報」シートにデータを保存する際や、シートからフォームへデータを表示する際に、VBAで列番号を指定して各列のデータをセットしていたため、項目を追加すると、その項目以降の列番号をすべて修正することになってしまいますので、今後も項目が増えることに備えて、列番号ではなく名前定義を利用してデータを保存する方法を紹介します。
<機能追加手順>
●第3回 フォームを使った顧客管理の作成[移動ボタンの追加] で作成したファイルを開いて、「顧客情報」シートのセル「A1」を選択した状態で「名前の定義」ウィンドウを表示して、名前に「顧客番号列」と付けます。
Excel2003・・・メニューバー「挿入→名前→定義」
Excel2007以降・・・リボン「数式→名前の管理」
同様の手順で、セル「B1」には「顧客名列」、セル「C1」には「郵便番号列」、セル「D1」には「住所列」、セル「E1」には「電話番号列」、「F1」には「備考列」の名前を付けます。
C列にフリガナ用の列を挿入します。
セル「C1」を選択した状態で「名前の定義」ウィンドウを表示して、名前「フリガナ列」を追加します。(挿入したC列以降の名前定義のセル位置は自動変更されます)
●「Visual Basic Editor」を起動し、「frm顧客情報入力」フォームにラベルとテキストボックス(オブジェクト名:txtフリガナ)を追加します。
入力順番の変更は、フォーム上を右クリックしてショートカットメニューの「タブオーダー」から設定します。
「frm顧客情報入力」フォームの処理を追加・変更します。
Private Sub UserForm_Initialize()
Me.lbl行番号.Caption = Worksheets("顧客情報").Range("A1").CurrentRegion.Rows.Count + 1
End Sub
Private Sub cmd先頭移動_Click()
Call DspDataSet(2)
End Sub
Private Sub cmd前移動_Click()
If Me.lbl行番号 > 1 Then
Call DspDataSet(Me.lbl行番号 - 1)
Else
Call DspDataSet(1)
End If
End Sub
Private Sub cmd次移動_Click()
Dim wMaxRow As Long
wMaxRow = Worksheets("顧客情報").Range("A1").CurrentRegion.Rows.Count
If Me.lbl行番号 < wMaxRow Then
Call DspDataSet(Me.lbl行番号 + 1)
Else
Call DspDataSet(wMaxRow)
End If
End Sub
Private Sub cmd最終移動_Click()
Dim wMaxRow As Long
wMaxRow = Worksheets("顧客情報").Range("A1").CurrentRegion.Rows.Count
Call DspDataSet(wMaxRow)
End Sub
Private Sub cmd新規_Click()
Call DspDataSet(0)
End Sub
Private Sub cmd検索_Click()
frm顧客検索.Show vbModal
If rtnNo > 1 Then
Call DspDataSet(rtnNo)
End If
End Sub
Private Sub txt顧客名_AfterUpdate() '← 「顧客名」入力時の処理追加
If Me.txt顧客名 <> "" Then
If Me.txtフリガナ = "" Then
'GetPhoneticで顧客名のふりがなを取得し、StrConvで半角カタカナに変換
Me.txtフリガナ = StrConv(Application.GetPhonetic(Me.txt顧客名), vbNarrow)
End If
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, .Range("顧客番号列").Column) = Me.txt顧客番号   '列を名前定義の名前で指定
.Cells(wRow, .Range("顧客名列").Column) = Me.txt顧客名
.Cells(wRow, .Range("フリガナ列").Column) = Me.txtフリガナ
.Cells(wRow, .Range("郵便番号列").Column) = Me.txt郵便番号
.Cells(wRow, .Range("住所列").Column) = Me.txt住所
.Cells(wRow, .Range("電話番号列").Column) = Me.txt電話番号
.Cells(wRow, .Range("備考列").Column) = Me.txt備考
End With
MsgBox "登録しました。", vbInformation + vbOKOnly, "Information"
End Sub
Private Sub DspDataSet(prmNo) '← フォームへデータを表示する処理
With Worksheets("顧客情報")
If prmNo > 1 Then
Me.lbl行番号.Caption = prmNo
Me.txt顧客番号 = .Cells(prmNo, .Range("顧客番号列").Column)   '列を名前定義の名前で指定
Me.txt顧客名 = .Cells(prmNo, .Range("顧客名列").Column)
Me.txtフリガナ = .Cells(prmNo, .Range("フリガナ列").Column)
Me.txt郵便番号 = .Cells(prmNo, .Range("郵便番号列").Column)
Me.txt住所 = .Cells(prmNo, .Range("住所列").Column)
Me.txt電話番号 = .Cells(prmNo, .Range("電話番号列").Column)
Me.txt備考 = .Cells(prmNo, .Range("備考列").Column)
Else
Me.lbl行番号.Caption = .Range("A1").CurrentRegion.Rows.Count + 1
Me.txt顧客番号 = ""
Me.txt顧客名 = ""
Me.txtフリガナ = ""
Me.txt郵便番号 = ""
Me.txt住所 = ""
Me.txt電話番号 = ""
Me.txt備考 = ""
End If
End With
Me.txt顧客番号.SetFocus
End Sub
<完成>
フリガナ項目が追加され、顧客名を入力した際にフリガナが自動初期表示されます。
次回は、今回作成したフォームに「顧客分類」項目を追加し、顧客分類シートに事前登録した顧客分類をリスト選択入力できるよう機能追加し、「顧客検索」フォームも「顧客分類」で抽出できるよう機能追加する手順を紹介します。
第5回 フォームを使った顧客管理の作成 [顧客分類の追加]