郵便番号から住所を自動入力

年賀状ソフトによくある機能です。郵便番号の項目を入力すると、それに対応した住所が自動的に表示されます。
Excelには、マイクロソフトのサイトからダウンロードできる「郵便番号変換ウィザード」がありますが、これは「後から一括して変換する」ためのツールであり、その場で変換してほしい場合には向きません。 (現在、「郵便番号変換ウィザード」はオープンソース扱いになっているようです)
郵便番号から住所を自動入力
(画像をクリックすると、このサンプルがダウンロードできます)
年賀状ソフトは、そのソフトの中に郵便番号辞書を持っていて変換を行ないますが、Excelでは上記の「郵便番号変換ウィザード」にしかその機能はありません。そこで、IME(Windowsの日本語変換)の郵便番号辞書の機能を使ってこの機能を満たしてしまおうとするものです。
但し、同じMS-IMEでもバージョンによってこれらの動作が違うので半角郵便番号の入力だけで住所が表示されない場合もあるようです。 現在の画像はWindows7+MS-IME2010+Excel2010ですが、これだと全角の郵便番号が住所セルに選択された状態で止まってしまうので、手動で「変換」キーを押すとこのように候補のプルダウンが表示された状態になります。 (Windows10ではうまく機能できていません)

※本機能はワークシートのセルが「読み仮名」情報を持っていることを利用しています。
テキストボックスやユーザーフォーム上ではこの方法は使えません。そこで、郵便番号データを独自にデータベース化して、これを元に郵便番号の入力時に住所を自動表示させるサンプルを「ユーザーフォームで郵便番号住所変換」に用意しましたので、こちらも参考にして下さい。

これには「SendKeysステートメント」を使ってキーボード入力をマクロから擬装して行ないます。

'***************************************************************************************************
'   MS-IME操作による郵便番号⇒住所変換のサンプル                    Sheet1(Class)
'
'   作成者:井上治  URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'03/09/16(1.00)新規作成
'12/01/28(1.01)修正等
'20/03/02(1.10)*.xlsm化、他
'***************************************************************************************************
Option Explicit

'***************************************************************************************************
'   ■■■ ワークシートイベント ■■■
'***************************************************************************************************
'* 処理名 :Worksheet_Change
'* 機能  :セル値変更イベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :Arg1 = Target(Range)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年09月16日
'* 作成者 :井上 治
'* 更新日 :2020年03月02日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub Worksheet_Change(ByVal Target As Range)
    '-----------------------------------------------------------------------------------------------
    ' 郵便番号セル以外では動作させない
    If Target.Address <> "$B$2" Then Exit Sub                            ' @
    '---------------------------------------------------------------------------
    ' 3桁以上の郵便番号があり、住所がブランクの場合のみ住所を変換させる
    If ((Len(Cells(2, 2).Value) >= 3) And (Cells(4, 2).Value = "")) Then ' A
        Application.EnableEvents = False                                 ' B
        ' 郵便番号を全角変換し住所に転記
        Cells(4, 2).Value = StrConv(Target.Value, vbWide)                ' C
        ' 住所のセルを選択
        Cells(4, 2).Select                                               ' D
        ' F2 → Shift+Home → F13 を擬装入力する
        SendKeys "{F2}", True       ' 編集モード                         ' E
        SendKeys "+{HOME}", True    ' 文字列全体を選択                   ' F
        SendKeys "{F13}", True      ' 再変換(MS-IME)                     ' G
        Application.EnableEvents = True
    End If
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
これは、ワークシートのChangeイベントとして記述しています。「ボタンを作ってクリックされたら変換する」なども可能ですが、複数行の一覧形式での変換を考慮すると郵便番号の列を特定しての処理でも少し変更するだけで対応できるのでイベント処理としています。



概略説明
@ Changeイベントは、シート内のどこのセルが変更されても発生するので、郵便番号のセル以外でのイベント発生を無視するようにします。(先頭でチェックして抜けてしまう)
A 郵便番号変換ができる条件を判定しています。ここでは3桁以上の郵便番号が入力されていて、住所は入力されていないことを条件にしています。
B ここから住所のセルの値を変えてしまうため、この処理自体で別のChangeイベントが発生してしまいます。それを回避する記述です。
C 郵便番号を全角に変換して住所のセルに転記します。
D 住所のセルを選択します。
E F2キーを押して住所のセルの編集モードに入ります。この時点では入力文字列(郵便番号)の右端にカーソルが置かれます。
F Shiftキーを押しながらHomeキーを押して郵便番号全体を選択状態にします。
G 「再変換」キーを押します。F13MS-IMEの標準状態での仕様です。他のIMEの場合はここを書き換える必要があります。これで変換中の状態でこの処理を抜けるので、変換候補選択はオペレーションで行ないます。



上記のGの前にIMEONになっていなければなりません。このサンプルでは住所項目は「入力規則」によってONになるようにしているので、マクロ記述上では操作していません。
市町村合併などで郵便番号辞書は更新しなければなりませんが、マイクロソフトをはじめ各IMEメーカーのサイトから最新の郵便番号辞書がダウンロードできるので、更新してから利用して下さい。