第4回 フォームを使った顧客管理の作成 [名前定義の利用]

今回は、前回までに作成した「顧客情報入力」フォームに「フリガナ」項目を追加したいと思います。しかし、これまでの方法では「顧客情報入力」フォームから「顧客情報」シートにデータを保存する際や、シートからフォームへデータを表示する際に、VBAで列番号を指定して各列のデータをセットしていたため、項目を追加すると、その項目以降の列番号をすべて修正することになってしまいますので、今後も項目が増えることに備えて、列番号ではなく名前定義を利用してデータを保存する方法を紹介します。
koky013080.gif


<機能追加手順>
第3回 フォームを使った顧客管理の作成[移動ボタンの追加] で作成したファイルを開いて、「顧客情報」シートのセル「A1」を選択した状態で「名前の定義」ウィンドウを表示して、名前に「顧客番号列」と付けます。
Excel2003・・・メニューバー「挿入→名前→定義」
Excel2007/2010/2013/2016・・・リボン「数式→名前の管理」
koky013010.gif

同様の手順で、セル「B1」には「顧客名列」、セル「C1」には「郵便番号列」、セル「D1」には「住所列」、セル「E1」には「電話番号列」、「F1」には「備考列」の名前を付けます。
koky013020.gif

C列にフリガナ用の列を挿入します。
koky013030.gif

セル「C1」を選択した状態で「名前の定義」ウィンドウを表示して、名前「フリガナ列」を追加します。(挿入したC列以降の名前定義のセル位置は自動変更されます)
koky013040.gif

●「Visual Basic Editor」を起動し、「frm顧客情報入力」フォームにラベルとテキストボックス(オブジェクト名:txtフリガナ)を追加します。
koky013050.gif

入力順番の変更は、フォーム上を右クリックしてショートカットメニューの「タブオーダー」から設定します。
koky013060.gif

「frm顧客情報入力」フォームの処理を追加・変更します。
koky013070.gif

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


<完成>
フリガナ項目が追加され、顧客名を入力した際にフリガナが自動初期表示されます。
koky013080.gif


完成したファイルを下記ボタンからダウンロード出来ます。
download.gif






次回は、今回作成したフォームに「顧客分類」項目を追加し、顧客分類シートに事前登録した顧客分類をリスト選択入力できるよう機能追加し、「顧客検索」フォームも「顧客分類」で抽出できるよう機能追加する手順を紹介します。
第5回 フォームを使った顧客管理の作成 [顧客分類の追加]