Excel-DNA で XLL をつくる(その12)

 郵便番号と住所の相互検索をするには、郵便番号変換ウィザードを使う方法もありますが、「関数」として値を代入してくれると、手間が省けますね^^ WebAPI を使って「郵便番号⇔住所」相互検索する関数を記述してみます。
 利用する API は「郵便番号検索API」(グレープテクノロジー) です。「利用規約」をみると、非商用であればだれでも無償で利用できるようです。

 今回は、これまでの記事で利用した方法を使いますので、これと言ってキモはありません(笑) この API はJSON でデータを返すので、DynamicJson.dll を利用します。

 さっそく、記述してみましょう。

(こんな感じ↓)

using System;
using System.Collections.Generic;
using System.Text;
using ExcelDna.Integration;
using System.Net;
using Codeplex.Data;
using System.Windows.Forms;


public static class ZipDecode
{
    const string ZIP_URL = 
             @"http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch?";

    [ExcelFunctionAttribute(Description = "郵便番号から住所を取得します", 
                                   Name = "ZipDecode")]
    public static string Decode(string ZipCode)
    {
        try
        {
            string query_url = @ZIP_URL + @"zipcode=" + @ZipCode;
            List<dynamic> items = new List<dynamic>();

            var reply = new WebClient().DownloadData(query_url);
            var json = DynamicJson.Parse(Encoding.UTF8.GetString(reply));
            foreach (var item in json["zipcode"])
            {
                items.Add(item);
            }
            if (items.Count == 1)
            {
                return items[0].Value["prefecture"] + 
                       items[0].Value["city"] + 
                       items[0].Value["town"];
            }
            else
            {
                ShowList(items);
            }

            return "複数あります";
        }
        catch (Exception)
        {
            return "err";
        }
    }

    [ExcelFunctionAttribute(Description = "住所から郵便番号を取得します", 
                                   Name = "ZipEncode")]
    public static string Encode(string Address)
    {
        try
        {
            string query_url = @ZIP_URL + @"word=" + @Address;
            List<dynamic> items = new List<dynamic>();

            var reply = new WebClient().DownloadData(query_url);
            var json = DynamicJson.Parse(Encoding.UTF8.GetString(reply));
            foreach (var item in json["zipcode"])
            {
                items.Add(item);
            }
            if (items.Count == 1)
            {
                return items[0].Value["zipcode"];
            }
            else
            {
                ShowList(items);
            }
            return "複数あります";
        }
        catch (Exception)
        {
            return "err";
        }
    }

    private static void ShowList(List<dynamic> items)
    {
        StringBuilder strbld = new StringBuilder();
        foreach (var item in items)
        {
            strbld.Append(item.Value["zipcode"]);
            strbld.Append(":");
            strbld.Append(item.Value["prefecture"]);
            strbld.Append(":");
            strbld.Append(item.Value["city"]);
            strbld.Append(":");
            strbld.AppendLine(item.Value["town"]);
        }
        MessageBox.Show(strbld.ToString(), "〒");
    }
}

 これだけです(笑)

 いつものように、上記コードをテキストファイルに貼り付け Zip.dna という名前で保存しましょう。
ExcelDna.xll を Zip.xll に名前変更して Excel に ドラッグ&ドロップしてください。

 作成した関数 ZipDecode を使ってみましょう。セル”A1″ に、「1000001」 と入力し、例えば セル”B1″ に「= ZipDecode(A1)」 と入力すると、セル”B1″ に「東京都千代田区千代田」と表示されます。

 セル”A1″ に入力された番号の桁が不足していた場合は、それにつづく郵便番号と住所を列挙し、
関数を入力したセルには「複数あります」とメッセージを返します。

(こんな感じ↓)

 次に、ZipEncode 関数を使ってみましょう。セル “A2” に、「東京都千代田区千代田」 と入力し、どこかのセルに 「=ZipEncode(A2)」 と入力すると、 「1000001」 と郵便番号が表示されます。

 セル “A2” を、「東京都杉並区」 としてみると、ZipDecode 関数の時と同じように入力された住所につづく住所とその郵便番号を列挙し、関数を入力したセルには「複数あります」とメッセージを返します。

(こんな感じ↓)

 この API は、毎日データベースを更新しているようなので、常に新しいデータが得られるようです。WebAPI ですので、もちろんインターネットに接続された環境でないと利用できませんが、便利な時代になったもんです^^

では、また(笑)

ダウンロードはこちら ⇒ Zip.zip
(Excel(x86) の場合は Zip.xll を、Excel(x64) の場合は Zip64.xll をドラッグ&ドロップしてください)

This entry was posted in Excel, .NetFramework and tagged , . Bookmark the permalink.

3 Responses to Excel-DNA で XLL をつくる(その12)

  1. ALT says:

    初めましてこんにちは。
    サイトを見させて頂きまして住所変換の良いのがあり興味があり設定してみました。

    Excel2016 64bit にてZip64.xllをドラッグ&ドロップしていれてアドインも有効にしたのですが
    郵便番号 デコード及びエンコードもやってみるとerrと返されてしまいます。
    何が悪いのでしょうか。
    ご回答頂けましたら幸いです。
    何卒宜しくお願い致します。

  2. ALT says:

    supermab様
    ご回答ありがとうございます。終了してしまったのですね・・・

    下記のサイトでも代用できそうですがいかがでしょうか。
    http://zipcloud.ibsnet.co.jp/doc/api
    私にはプログラムとかは無知なのですができるようであれば地道にやっていこうと思っています。
    ご助言頂けましたら幸いです。
    お忙しい中申し訳ございませんが宜しくお願い致します。

Leave a Reply

Your email address will not be published. Required fields are marked *