郵便番号から住所を表示する方法
◆概要
このページは、Visual Basic 6.0で郵便番号から住所を表示する方法について記載しています。
日本郵政公社が無償で公開しているCSV形式の郵便番号データを使って、入力された郵便番号から住所を検索して表示します。全国版はデータ量が多く、表示に多少時間がかかります。
まず、以下のリンク先から「全国一括」郵便番号データをダウンロードしてください。なお、ダウンロードしたファイルを解凍して、KEN_ALL.CSVをCドライブのルートに置いてください。
フォームにラベルを2つ、テキストボックス2つ(コントロール名:Text1,Text2)とコマンドボタン(コントロール名:Command1)、ステータスバー(コントロール名:StatusBar1)を配置してください。
次に標準モジュールに次のコードを実装します。これは、処理時間を計測するためのものです。
◆標準モジュール
Option Explicit ' 処理時間を計測するAPIの宣言 Public Declare Function timeGetTime Lib "winmm.dll" () As Long
次にフォームモジュールに次のコードを実装します。
◆フォームモジュール
Option Explicit Private Sub Command1_Click() ' ******************************************************* ' Copyright(C) White Tiger ' 作成日:2007/07/22 23:59 ' 更新日:2007/09/11 00:37 ' 概要 入力された郵便番号から市町村名を返す ' ******************************************************* Dim objFileSystem As Object ' ファイルシステムオブジェクト Dim objFile As Object ' ファイルオブジェクト Dim strFileName As String ' 読み込むファイル名 Dim CurLine As String ' CSVの一行 Dim Array_Zip() As String ' CSVの各項目を表す配列 Dim PostalCode As String ' 郵便番号 Dim Address As String ' 住所 Dim blnFlag As Boolean ' 成功フラグ Dim strPostalCode As String ' TextBox1の郵便番号 Dim lngStart, lngEnd As Long ' 処理時間を格納する '読み込むファイル名********************************** strFileName = "C:\KEN_ALL.CSV" ' 全国郵便番号データ ' *************************************************** ' 開始時間を変数に格納 lngStart = timeGetTime() ' マウスポインタを砂時計に Screen.MousePointer = vbHourglass ' 郵便番号が入力されていないときは If Me!Text1.Text = "" Then MsgBox ("郵便番号が入力されていません。"), _ vbOKOnly + vbCritical, "郵便番号入力エラー" Text1.SetFocus Screen.MousePointer = vbDefault Exit Sub ' 処理を抜ける End If ' 左右の空白を取る strPostalCode = Trim(Text1.Text) ' ハイフォン(-)が入力されているときを考慮 strPostalCode = Left$(strPostalCode, 3) & _ Right$(strPostalCode, 4) ' 全角を半角に変換する strPostalCode = StrConv(strPostalCode, vbNarrow) ' 変数の初期化 blnFlag = False 'ファイルシステムオブジェクトへの参照 Set objFileSystem = CreateObject("Scripting.FileSystemObject") ' ファイルが存在しているかどうか確認する If objFileSystem.FileExists(strFileName) = False Then MsgBox ("ファイル「KEN_ALL.CSV」がありません。"), _ vbOKOnly + vbCritical, "郵便番号ファイルエラー" Screen.MousePointer = vbDefault Exit Sub ' 処理を抜ける End If 'ファイルを開く Set objFile = objFileSystem.OpenTextFile(strFileName) 'ファイルの最後に達するまでループ Do Until objFile.atEndOfStream 'ファイルを1行読み込む CurLine = objFile.readline ' 読み込んだデータをカンマで分解して ' Array_Zipという配列に格納する Array_Zip = Split(CurLine, ",") ' 配列の3番目が7桁郵便番号。ダブルクォートを除去 PostalCode = Replace(Array_Zip(2), """", "") ' TextBox1の郵便番号と比較 If strPostalCode = PostalCode Then ' 都道府県名+市区町村名+町域名 Address = Array_Zip(6) & Array_Zip(7) & Array_Zip(8) Address = Replace(Address, """", "") ' " を取り除く blnFlag = True ' 見つかったのでフラグを立てて Exit Do ' ループを抜ける End If Loop lngEnd = timeGetTime ' 処理時間をステータスバーに表示する Me.StatusBar1.Panels(1).Text = _ (CDbl(lngEnd) - CDbl(lngStart)) / 1000 & "秒" ' マウスポインタを既定にする Screen.MousePointer = vbDefault If blnFlag = False Then MsgBox "一致する郵便番号が見つかりませんでした。", _ vbInformation Else Text2.Text = Address ' Text2にddressを代入 End If 'ファイルを閉じる objFile.Close 'オブジェクトを開放 Set objFileSystem = Nothing Set objFile = Nothing End Sub
◆実行結果
Text1に適当な郵便番号を入力して、Command1ボタンをクリックしてください。次の例は、Text1に「9071801」(KEN_ALL.CSVの最終データ)と入力してボタンをクリックした結果です。
◆高速化のヒント
概要に書いたとおり、全国版のデータから検索すると時間がかかります。高速なパソコンなら問題ないのかもしれませんが、高速化したいときは次のような方法があります。ヒントにしてください。
- 県版のデータを使う。この方法では最終レコードでも0.8秒程度で検索できます(マシン環境:Pentium4 2.53GHz、1.5GB RAM)。ユーザーにオプションで選択させ、レジストリかINIファイルに設定を保存する方法が考えられます。
- シェル ソートやクイックソートを使う。これは試していませんが検索アルゴリズムを勉強するといいのかも知れません。参考ページVBレスキュー(花ちゃん)に郵便番号検索ソフトやVBのシェルソート、クイックソートの例があります。
- データベースに郵便番号を保存し、データベースのメソッドで検索する。
ちなみに、Access2000形式のMDBに全国版のデータを格納して、ADOのRecordsetオブジェクトのFindメソッドを使うと最終レコードでも0.8秒程度で検索できます(Pentium4
2.53MHz Memory1.5GB)。ただ、MDBファイルサイズが8MB程度となります。この辺はアプリケーションのパフォーマンスを取るか、ディスクのサイズを取るかで選択することになります。
なお、C# .NET 2005での同じ処理を行うと、0.8秒程度で検索できます。コード例は郵便番号から住所を検索する方法を参照してください。
また、Accessで郵便番号変換を行うには、ZipConv 関数 - 郵便番号と住所を変換する方法により行うといいでしょう。