HOME > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > ユーザーフォーム入門 - 住所入力フォームを作成する(7) 〜 住所入力支援

ユーザーフォーム入門 - 住所入力フォームを作成する(7) 〜 住所入力支援|Excel VBA

ユーザーフォーム関連のテクニック

ユーザーフォーム入門 - 住所入力フォームを作成する(7) 〜 住所入力支援

(Excel 2002/2003/2007/2010)

ユーザーフォーム入門 - 住所入力フォームを作成する(6) 〜ふりがなの取得」に引き続き、住所や郵便番号の入力を補助する処理を作成します。
入力支援機能を使わず、郵便番号や住所を入力する場合は、本記事の処理は不要です。

本記事は、Excel用のアドイン「郵便番号変換ウィザードアドイン」をインストールして利用することを前提としています。
ここでは、このアドインを使用して以下の2つの処理を実現します。

1)郵便番号から住所1を自動入力
2)郵便番号が不明な場合は、住所1から郵便番号変換を行い、自動入力

ただし、住所から郵便番号への変換には、[住所1]テキストボックスに県名から少なくとも町名までを入力する必要があります

※ CodePlex(Microsoftが運営するオープンソースのコミュニティサイト)に公開されている「郵便番号変換ウィザードアドイン」を使用します。市区町村の統廃合や住所表示の変更などにより、郵便番号や住所のデータが最新の状態でないことがあり、すべてを変換できる保証はありません。

■アドインをダウンロードする

Microsoft社が運営するサイト「CodePlex」より、「郵便番号変換ウィザードアドイン」をダウンロードして、デスクトップなど適当なフォルダに保存します。
Excelのバージョンにより、対応するアドインファイルが異なるので、リンク先ページのダウンロードリンクを確認してください。

CodePlex:Excelアドイン 郵便番号変換ウィザード ≫ダウンロード
(2010年7月8日 更新)

<Excel 2010の場合>
「Excel 2010用アドイン 郵便番号変換ウィザード」をダウンロード

<Excel 2007以前の場合>
「Excel 2007用アドイン 郵便番号変換ウィザード」をダウンロードし、
ファイル名を「2007zipcode7.xla」→「zipcode7.xla」に変更する

■アドインファイルを利用するための設定

アドインファイルをダウンロードした時点では、アドインファイルに含まれる各プロシージャは、他のモジュールから参照できない設定になっているため、その設定を解除します。
さらに、マクロからアドインファイルのVBAコードを利用するための設定を行います。
次の手順に従って操作してください。

  1. 「zipcode7.xla」を開き、VBEで標準モジュール「Yubin7_Core」の先頭の1行をコメントアウトする

  2. 「zipcode7.xla」を上書き保存する。ここで、次のメッセージが表示されたら、[変更を保存して署名を破棄する]をクリックする

  3. Excelに戻り、[開発]タブ→[マクロのセキュリティ]ボタンから[セキュリティセンター]ダイアログボックスを表示する。そして、[VBAプロジェクト オブジェクト モデルへのアクセスを信頼する]チェックボックスをオンにし、[OK]ボタンをクリックする

    ※[開発]タブが表示されていない場合は、[ファイル]タブ→[オプション]→[セキュリティセンター]を選択し、[セキュリティセンターの設定]ボタンをクリックします。[セキュリティセンター]ダイアログボックスで[マクロの設定]を選択し、上記のチェックボックスをオンにします。

    ※Excel 2003以前の場合は、[ツール]メニュー→[マクロ]→[セキュリティ]から[セキュリティ]ダイアログボックスを開き、[信頼できる発行元]タブの「Visual Basicプロジェクトへのアクセスを信頼する]チェックボックスをオンにします。

  4. いったんExcelを終了する
  5. Step2で保存した「zipcode7.xla」をライブラリフォルダに移動する
    ▼保存先フォルダ(Windows7(64bit) / Excel 2010(32bit)の場合)
    C:\Program Files (x86)\Microsoft Office\Office14\Library

●補足●

アドインファイルを保存するライブラリフォルダは、OSやExcelバージョン、Excelのインストール先フォルダによって異なります。
ライブラリフォルダのパスを調べるには、イミディエイトウィンドウ等で、ApplicationオブジェクトのLibraryPathプロパティの値を参照してください。

■郵便番号や住所を取得するFunctionプロシージャ

前項で、アドインファイルを利用する準備ができました。
再び、ユーザーフォームを含むブックを開き、処理を作成しましょう。
まず、ユーザーフォーム起動時にアドインファイルを自動で参照設定するプロシージャ「ChkRef」を作成します。
続いて、郵便番号から住所を取得するプロシージャ「ConvertToAddr」と、住所から郵便番号を取得するプロシージャ「ConvertToZip」を作成します。

Private Sub ChkRef()
    Dim i As Long
    
    'ZipCode7.xlaの参照設定
    With ThisWorkbook.VBProject.References
        For i = 1 To .Count
            If .Item(i).Name = "ZipCode7" Then Exit Sub
        Next i
        .AddFromFile Application.LibraryPath & "\ZipCode7.xla"
    End With
End Sub

Private Function ConvertToAddr(郵便番号 As String) As String
    Dim 県 As String * 255, 都市 As String * 255, 都市2 As String * 255
    Dim 町名 As String * 255, 町名2 As String * 255
    Dim Ret As String
    
    Call ZipCode7.YUBIN7_Core.fnStartYubin7
    Call ZipCode7.YUBIN7_Core.GetZipDecision(郵便番号, 県, _
                                             都市, 都市2, 町名, 町名2)
    
    Ret = Replace(県 & 都市 & 都市2 & 町名 & 町名2, Chr(0), vbNullString)
    Ret = Replace(Ret, Chr(32), vbNullString)
    
    ConvertToAddr = Ret
End Function

Private Function ConvertToZip(住所 As String) As String
    Dim 郵便番号 As String * 255
    Dim ダミー As String * 255

    Call ZipCode7.YUBIN7_Core.fnStartYubin7
    Call ZipCode7.YUBIN7_Core.Yubin7(住所, 郵便番号, ダミー)
    ConvertToZip = Trim(Replace(郵便番号, Chr(0), vbNullString))
End Function

また、フォーム初期化時に参照設定をするよう、Initializeイベントプロシージャの先頭(変数宣言のすぐ後)に次の行を追加します。

Call ChkRef

■郵便番号から住所への変換

[郵便番号]テキストボックス(txtYubin)に入力された番号から住所を取得する処理を作成します。[郵便番号]テキストボックスのExitイベントを利用します。
txtYubin_Exitプロシージャのひな形を作成し、次のコードを記述します。

'[郵便番号]テキストボックスから他へフォーカスが移ったときの処理
Private Sub txtYubin_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With txtYubin
        '[郵便番号]テキストボックスが未入力の場合はプロシージャを抜ける
        If .Value = "" Then Exit Sub
        
        '[郵便番号]をもとに住所を取得し、[住所1]テキストボックスに入力
        txtJusho1 = ConvertToAddr(.Value)
        
        '[郵便番号]テキストボックスの入力値が7ケタの数値の場合は、
        '「000-0000」の書式に変更
        If IsNumeric(.Value) And Len(.Value) = 7 Then
            .Value = Format(.Value, "000-0000")
        End If
    End With
End Sub

■住所から郵便番号への変換

[郵便番号]テキストボックス(txtYubin)が未入力のとき、[住所1]テキストボックス(txtJusho1)に入力された住所から、郵便番号を取得する処理を作成します。
[住所1]テキストボックスのExitイベントを利用します。
txtJusho1_Exitイベントプロシージャのひな形を作成して、次のコードを記述します。

'[住所1]テキストボックスから他へフォーカスが移ったときの処理
Private Sub txtJusho1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim strRetVal As String
    
    If txtYubin.Value = "" And txtJusho1.Value <> "" Then
        '[郵便番号]が未入力で、[住所1]が入力されていたら、
        '[住所1]をもとに郵便番号を取得
        strRetVal = ConvertToZip(txtJusho1.Value)
        
        '戻り値に "ERROR" の文字列が含まれていたら、変換失敗
        If strRetVal Like "ERROR*" Then Exit Sub
        
        '[郵便番号]テキストボックスに入力
        txtYubin.Value = Format(strRetVal, "000-0000")
    End If
End Sub

ここまでできたら、ユーザーフォームを起動して、郵便番号や住所を入力して動作を確認してみましょう。

●補足●

住所入力支援機能を利用するには、Office郵便番号辞書が必要です。
通常はOfficeと一緒にインストールされますが、「郵便番号変換エンジンが見つかりません」というメッセージが表示される場合や、郵便番号辞書を最新の状態に更新する場合は、マイクロソフト公式ダウンロードセンターよりダウンロードして、インストールしてください。

MS公式ダウンロードセンター:Office 郵便番号辞書 ≫ダウンロード
(2013年5月28日 更新)