ユーザーフォーム入門 - 住所入力フォームを作成する(7) 〜 住所入力支援|Excel VBA |
「ユーザーフォーム入門 - 住所入力フォームを作成する(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コードを利用するための設定を行います。
次の手順に従って操作してください。
※[開発]タブが表示されていない場合は、[ファイル]タブ→[オプション]→[セキュリティセンター]を選択し、[セキュリティセンターの設定]ボタンをクリックします。[セキュリティセンター]ダイアログボックスで[マクロの設定]を選択し、上記のチェックボックスをオンにします。
※Excel 2003以前の場合は、[ツール]メニュー→[マクロ]→[セキュリティ]から[セキュリティ]ダイアログボックスを開き、[信頼できる発行元]タブの「Visual Basicプロジェクトへのアクセスを信頼する]チェックボックスをオンにします。
アドインファイルを保存するライブラリフォルダは、OSやExcelバージョン、Excelのインストール先フォルダによって異なります。
ライブラリフォルダのパスを調べるには、イミディエイトウィンドウ等で、ApplicationオブジェクトのLibraryPathプロパティの値を参照してください。
前項で、アドインファイルを利用する準備ができました。
再び、ユーザーフォームを含むブックを開き、処理を作成しましょう。
まず、ユーザーフォーム起動時にアドインファイルを自動で参照設定するプロシージャ「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日 更新)