カテゴリ: YahooBT By Excel


 星の王子ニューヨークへ行く。

田舎者のハマスンは、夜行バスに乗って横浜へ行く。

星の王子には、お供のホセが付いていたがハムスンには誰もいない。

(アルメン,,,気楽でござる。)

アキーム王子はセレブでハマスンはビン太郎だ。

でも、王子にもハムスンにも共通点がある。アキームは始めてだったに違いない。

ハムスンも横浜に行くのは初めてだ。アキーム王子は、ニューヨークの事を

知っていたのだろうか? ハムスンは何も知らない。




 所用で横浜辺りへ参ることに成りました。

貧乏人の時間うしないです。早々と夜行バスを予約したのですが、

予定が本決定してみると、かの地での用件が早々と終わりそうです。

横浜駅辺りの名所旧跡尋ねて見ようか等と考えています。

でも。。。弱りました。横浜の名所?一体何処なのでしょうか。



WikiPedia 検索


 知っている事が常識であり、非常識の内容を知らないことと定義したなら、

『WikiPediaに記載されている場所が名所である。』と呼ばなければ成らないほど、

WikiPedia検索の機会が増加している感のある今日この頃ではないでしょうか。

良しにつけ悪しきにつけ、WikiPediaの内容の多さには驚かされます。

そこで今回は緯度経度,検索半径,検索件数を指定して、

どのような場所がWikiPediaに記載されているか

ハムスンに知らせるマクロを作ってみなした。なお、InfoMap.xlsでは、英語版と日本語版で

記事が記載されている項目を洗い出す事は出来ますが、その内容は、

記載されている項目を選択し、実際の閲覧はブラウザを立ち上げて見る

仕様にしています。



イメージ 1




WikiPediaAPI


 今回の緯度経度を指定してWikiPediaの記事を検索するマクロは、

ongmap.comさんのWikiPedia APIを使用しています。


氏のブログに、WikiPediaAPIの内容についての説明がありますので、

その内容を見てみましょう。


この記事によれば、


このAPIは緯度経度と半径を入力パラメーターとして、その範囲に含まれる

Wikipediaの記事へのリンクを出力します。

緯度経度からの検索については、GeoNamesのFind nearby Wikipedia Entries

というAPIを利用しています。英語での記事検索についてはこれだけで

事足りるのですが、日本語記事の検索については、検索結果にサマリが含まれないので、

少々不便だったりします。そこで、SimpleAPIで提供されている

WikipediaAPIを呼び出すURLを加えた結果を返すようにしてみました。


と説明されています。

又、当初、私の作ったマクロではレスポンスの応答が悪く、酷い場合は

エクセルがレスポンス待ちで止まってしまうという現象がありましたが、

送信する緯度経度の桁数を少なくするという手段で、応答時間の短縮を

図って見ました。トイウコトで、今回の書き込みを終了いたします。

なお、新しいInfoMap.xlsはマイクロソフトさんのSkydriveに

置いてあります。

 「冬の夜空は、如何してこんなに綺麗なのかしら。」良妻賢母さんが言った。

月と宵の明星,木星 惑星大接近がおりなす西の夜空に浮かぶ大三角形は、

誰もをロマンチストにするのでしょうか?

「水蒸気が少ないからだよ。」私は答えた。

何処にも,誰か例外が存在するようです。

例外の存在と非常識こそが、歴史の営みではないでしょうか。

はて?何処かで読んだ気がします。まあ?いいでしょう。

記憶が不確かという事は、キット古い話に違いありませんから。

記憶が薄れないうちに、InfoMap.xlsのマクロを見ていく事にしましょう。



経度緯度からの検索


 前回お話したように、経度緯度から郵便番号を検索するマクロは、

経度緯度から地名を検索するWeb APIと地名候補から郵便番号を検索する

APIによって成り立っています。

地名検索API
http://api.alpslab.jp/
郵便番号検索API
http://groovetechnology.co.jp/

 緯度経度から地名を求めるAPIは前回も使用したAlpslab.jpさんの

標高APIを使用しています。このAPIは、緯度経度を与えてその場所の標高と

共に、指定した緯度経度(列)の最初の地点の住所文字列(丁目字レベル)

を返します。今回はこのaddress情報を使用しています。

ただ、このレスポンスの住所の中に丁目字レベルが含まれていると、

次に使用する郵便番号検索APIでバグの元になるという問題点は含まれています。




 求めて地名より郵便番号を検索するには、グローバルテクノロジーさんの

住所入力らくらく補助郵便番号検索APIを使用しました。


このAPIの説明を見ると


このAPIは、郵便事業株式会社様(旧日本郵政公社)が公開している

郵便番号のデータを取得する機能を提供します。

郵便番号から住所、住所から郵便番号の取得が可能です。


とあります。標高APIで求めた住所を使って郵便番号を求めています。

なお、YahooさんのローカルサーチAPIには、住所,郵便番号,

施設,駅から緯度経度を求める機能はありますが、緯度経度あるいは

住所から郵便番号を求める機能はありません。



郵便番号検索マクロ




 以下に、検索ボタン,CommandButton51_Clickの今回のマクロを示し、

今日のマクロを終わります。なお、住所から郵便番号を検索するマクロ

については、特に説明の必要がないと思いますので、今回は記載を

取りやめます。windows SkyDriveに保存しているInfoMap.xlsを

参照願います。



Dim zipcode() As String  'グローバル変数

Private Sub CommandButton51_Click()
Dim pos As String
Dim DomDoc As New MSXML2.DOMDocument30
Dim url As String
Dim searchAd As String
Dim searchAd1 As String

On Error GoTo Err

'以下緯度経度から住所検索
If TextBox36.Text <> vbNullString Then
 pos = PosTrance(TextBox36.Text)
 url = "http://api.alpslab.jp/v1/level?appid=guest&p=" + pos
 
  DomDoc.async = False
  DomDoc.Load (url)
  
  searchAd1 = DomDoc.getElementsByTagName("address").Item(0).Text
  
End If

'以下住所から郵便番号検索
Dim DomDoc2 As New MSXML2.DOMDocument30
Dim url2 As String
Dim zipnum As Long
Dim adressnum As Long
Dim officenum As Long

searchAd = URLEncode(searchAd1)
url2 = "http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch?word=" _
        + searchAd + "&format=xml&ie=UTF-8"
  DomDoc2.async = False
  DomDoc2.Load (url2)
 'ClipBoard_SetData DomDoc2.XML
zipnum = DomDoc2.getElementsByTagName("zipcode").Length
adressnum = DomDoc2.getElementsByTagName("address").Length
officenum = DomDoc2.getElementsByTagName("office").Length

If ((adressnum = 0) And (officenum = 0)) Then
  MsgBox "地名で検索願います"
  TextBox38.Text = searchAd1
  GoTo 110
End If
 ReDim zipcode(zipnum - 1, 1)
 
  For n = 0 To adressnum - 1
      zipcode(n, 0) = DomDoc2.getElementsByTagName("address").Item(n).childNodes.Item(1).Text _
                    + DomDoc2.getElementsByTagName("address").Item(n).childNodes.Item(2).Text _
                    + DomDoc2.getElementsByTagName("address").Item(n).childNodes.Item(3).Text
      zipcode(n, 1) = DomDoc2.getElementsByTagName("address").Item(n).childNodes.Item(0).Text
   Next n
   
   If officenum > 0 Then
         For n = adressnum To officenum
             k = n - adressnum
            zipcode(n, 0) = DomDoc2.getElementsByTagName("office").Item(k).childNodes.Item(5).Text + " " _
                    + DomDoc2.getElementsByTagName("office").Item(k).childNodes.Item(1).Text _
                    + DomDoc2.getElementsByTagName("office").Item(k).childNodes.Item(2).Text _
                    + DomDoc2.getElementsByTagName("office").Item(k).childNodes.Item(3).Text _
                    + DomDoc2.getElementsByTagName("office").Item(k).childNodes.Item(4).Text
                   
            zipcode(n, 1) = DomDoc2.getElementsByTagName("office").Item(k).childNodes.Item(0).Text
            
          Next n
   End If
   
    ComboBox6.Clear
    For n = 0 To zipnum - 1
       ComboBox6.AddItem zipcode(n, 0)
    Next n
  
110:
Set DomDoc = Nothing
Set DomDoc2 = Nothing


Exit Sub
Err:
 MsgBox "予期しないエラーが発生しました"
 Set DomDoc = Nothing
 Set DomDoc2 = Nothing
End Sub

「お父~さん。助けて~。」

狭い我が家に、悲鳴に似た泣き面が走り回る。

誤解なきよう。

これは我が家の年中行事です。年が押し迫ると娘がSOSを投げかけてきます。

「先んずれば人を制す。」

孫子の兵法でござる!え、違う?ゴメンこげ面。史記(項羽本紀)からの故事成語だって。


 今日は午後から先輩のお宅へお伺いしますと、年賀状の山を見かけました。

午前中は小春を思う日和であったのに、

先輩のお宅を出る頃には、薄暗い空となり冷たい雨混じりの風も吹き荒れていました。

今年も、もうこんな季節です。今回の年賀状は如何にすべきか。

今年は、AIRで出来た「プリントマジック」を使ってみようかな。

「プリントマジック」は勿論フリーソフトです。

窓の杜で紹介されていました。




郵便番号検索


 各々方。(おのおのがた)シバレル今宵は、日本測地系の緯度経度から

郵便番号を検索するInfoMap.xlsのマクロを見て見様ではござらんか。

ご油断めされるな。風邪は万病の基といいまする。

ちと早いか。今年もまた忠臣蔵の月がやってきます。

検索Dataの書式は度.分.秒の形式を使用します。

緯度経度欄にDataを入力し中断の検索ボタンをクリックすると

候補地及び事業所名を表示します。

イメージ 1


この候補地から確答する場所を選ぶと郵便番号を表示します。

イメージ 2


候補地を選びきれない時は地名検索欄に郵便番号検索に使用した

地名Dataを地名検索欄に表示します。多くの場合、

候補を絞りきれない原因は、検索に利用した地名Dataに番地等が

入っていた場合のようです。

イメージ 3


この場合は丁目,番地等の部分を削除して再度下段の

検索ボタンをクリックしてください。

イメージ 4




郵便番号検索マクロのフロー


 上記の一連の流れから、InfoMap.xlsの郵便番号検索マクロは、

緯度経度から地名を検索し、地名から郵便番号を割り出している

フローが分かると思います。地名から割り出される郵便番号には

2つ以上の番号や事業所の郵便番号も含まれていますので、

この選択は使用者の方にその選択を委ねています。

又、地名に住所番号が含まれていると、検索が上手く動作しませんので、

この場合は、地名で検索願いますと表示し、検索に使用した地名を

地名検索欄に表示します。この場合は、〇丁目とか〇番地,〇番

と表示された部分を削除し、再度地名検索欄内の検索ボタン(最下段)で

検索します。

 通常、郵便番号のDATAや地名との関連付けに使用するDataは、

そのソフトの内部に内蔵しているのが普通だと思います。

このエクセルで作ったInfoMap.xlsでは、郵便番号,地名のData

と関連付けの機能はWeb APIに受け持ってもらっています。

つまり、緯度経度のDataをWebに送り、マズ地名に変換したDataを

受け取ります。この地名を再度Web APIに渡して地名と郵便番号の

Xml形式のdataを取得します。この時、このDataをグローバル変数

として定義することにより、このDataはUserForm終了までメモリー上に

保持することが出来ますので、ComboBoxに地名,名称を表示し、

この地名,名称を選択すると、郵便番号欄に表示することが出来ます。


 さてさて各々方、今日はこの位にして、実際のマクロについては
次回といたしとうござる。

 マズ最初に言っておかなければならない事が ありました。

InfoMap.xlsのマクロを動かす為には、Microsoft XML と

Microsoft scripting Runtime を事前バンティングする必要があります。

この2つのライブラリ ファイルの参上は Visual Basic を開き

ツール → 参照設定 → 参照設定ーVBAProject

参照可能なライブラリ ファイル(A)より選択します。

なお、InfoMap.xlsでは MSXML2.DOMDocument30 を事前バンティングを

行っていますので、Microsoft XML v3 以上を選ぶ必要があります。

あれ?これって前にもいいましたっけ。。。

前に言ったかどうか忘れてしまう。くどくど繰り返し同じことを言う。

う~ん。これって何かの前兆,特徴なのでしょうか。

明日の天気の流れ


 明日の天気を調べる為のマクロのフローを書いて見ました。

イメージ 1


明日の天気では、日本測地系の緯度経度情報を入力し、これを世界測地系に変換

のうえ、ongmap.com さんのWeather API に送信し xml 形式で 

Yahoo.com と Livedoor.com のお天気情報へのLinkを取得します。

この中からLivedoorを選び出しこの中に記載されている地域IDを

Livedoorさんの Weather Hacks への問い合わせに使います。

Weather Hacks へ問い合わすためには地域IDと 検索日

(今日,明日,明後日から選択)が必要となります。

明日の天気のマクロ


 実際のマクロを下に示します。なお、livelink と wetherLink はグローバル変数

として General のTopに宣言しています。


Dim livelink As String
Dim wetherLink() As String

Private Sub CommandButton46_Click()
Dim pos As String
Dim posW() As String
Dim url1 As String
Dim url2 As String
Dim lat As String
Dim lng As String
Dim DomDoc1 As New MSXML2.DOMDocument30
Dim handan As Integer
Dim m As Long
Dim wethersearch As String


pos = TextBox30.Text
If pos = vbNullString Then
 MsgBox "緯度経度が入力されていません"
 GoTo 110
End If
On Error GoTo Err
    posW = Split(JaToWorld(pos), ",")
   lat = posW(0)
   lng = posW(1)
   url1 = "http://ongmap.com/api?v=1.0&data=weather&lat=" _
            + lat + "&lng=" + lng + "&num=5"
      DomDoc1.async = False
      DomDoc1.Load (url1)
      
  For m = 0 To 4  'livelink
   wethersearch = DomDoc1.getElementsByTagName("Link").Item(m).Text
   handan = InStr(3, wethersearch, "weather.livedoor.com")
        If handan <> 0 Then
           livelink = wethersearch
           Exit For
         End If
    Next m
       If livelink = vbNullString Then
          MsgBox "地域が確定できません"
          GoTo 120
        End If
        
Dim DomDoc2 As New MSXML2.DOMDocument30
Dim linkNum As Integer
Dim cityNo As String
Dim i, k, n As Long
Dim searchday As String
Dim liveUrl As String

    i = Len(livelink)
    k = InStrRev(livelink, "city=")
    cityNo = Mid(livelink, k + 5, i)
    
If OptionButton1.Value = True Then
    searchday = "today"
   ElseIf OptionButton2.Value = True Then
    searchday = "tomorrow"
  ElseIf OptionButton3.Value = True Then
    searchday = "dayaftertomorrow"
  End If
liveUrl = "http://weather.livedoor.com/forecast/webservice/rest/v1?city=" + cityNo _
         + "&day=" + searchday
    

   
 DomDoc2.async = False
 DomDoc2.Load (liveUrl)
 'ClipBoard_SetData DomDoc2.XML
 linkNum = DomDoc2.getElementsByTagName("link").Length
 ReDim wetherLink(linkNum - 1, 1)
 For n = 0 To linkNum - 1
    wetherLink(n, 0) = DomDoc2.getElementsByTagName("title").Item(n).Text
    wetherLink(n, 1) = DomDoc2.getElementsByTagName("link").Item(n).Text
  Next n
  
  TextBox31.Text = wetherLink(0, 0)
  TextBox32.Text = DomDoc2.getElementsByTagName("telop").Item(0).Text
  TextBox33.Text = DomDoc2.getElementsByTagName("celsius").Item(0).Text
  TextBox34.Text = DomDoc2.getElementsByTagName("celsius").Item(1).Text
  TextBox35.Text = DomDoc2.getElementsByTagName("description").Item(0).Text
  
  ComboBox5.Clear
  For n = 2 To linkNum - 3
    ComboBox5.AddItem wetherLink(n, 0)
    Next n
   
120:
Set DomDoc1 = Nothing
Set DomDoc2 = Nothing
110:
Exit Sub

Err:
 MsgBox "予期しないエラーが発生しました"
 Set DomDoc1 = Nothing
 Set DomDoc2 = Nothing
End Sub


 あ~寒(サム)。夜があけると、(薄っすらではあるが)私の住む街の屋根にも

今年始めての大陸からの贈り物が届いていた。

『お父さ~ん、雪だよー!』出かける間際になって起きだしてきた

良妻賢母さんが叫んだ。広島のシベリア出身であるから雪など珍しくないはずだが。。。

「あ。。」ご苦労さん。昨夜は遅かったからな。頭で解っていても体が何故か

シックリこない。今だシャツの上に一枚引っ掛けただけの三枚着は、

おん歳50の身には響くのかもしれない。痩せが我慢するから痩せ我慢?

メタボが意地を張るのは『?』  張りブタと呼ぶのだろうか。

ともかく。。。風邪をひかないようにしよう。

「ハマさん、近頃インスタントココアを飲んでいるのは風邪の予防ですか。」

「はっはは,インスタントコーヒーより安いからさ。」

な~んだ。体がシックリこないのは、財布の中身が軽くてバランスが取れなかったからか。

メタボだって軽いものがあるさ。




 一年先のことは解らない。一週間先の事も不確かだ。

ただ、今日,明日,明後日の事ぐらい知りたいと思う。なんたって心の準備がある。

天を読む。

それが髪結い亭主の心の備えじゃないだろうか。

それが洗濯の極意じゃないだろうか。

我が家には乾燥機がない。蓋の外れそうな全自動洗濯機が今だご健在だ。

「長く使う以上のエコはこの世に存在しない。」一人納得する。

そこで、InfoMap.xlsに緯度経度を指定して今日,明日,明後日(あさって)

の天気を知る機能を追加してみた。



イメージ 1




お天気


 InfoMap.xlsのお天気は、緯度経度を指定して今日,明日,明後日の

天気,最高最低の気温およびお天気の概要を知ることが出来る。

使用する緯度経度のData形式は、日本測地系の10進数形式だ。

60進数形式のデータを10進数形式に変換するボタンをつけてみた。

緯度経度で表示するのは、大まかな区域の天気の予報だ。

こまかくピンポイントで知りたい場合は、ComboBoxの中から

対象の地域を選ぶ必要がある。確答地区を選択すると、その地区の天気予報を

ブラウザに表示する。間違い。表示するのはLivedoorさんの天気情報だ。



マクロの概要


 InfoMap.xlsのお天気オジサン機能は、Livedoorさんの

第三者向け気象データ提供サービス「Weather Hacks」を利用している。


地域別に定義されたID番号と取得したい日(今日,明日,明後日)を送ると

予報を返してくる。ただ、ここで送付するのはID番号であって

緯度経度の情報ではない。緯度経度の情報から「Weather Hacks」の

ID番号を知るために、ongmap.comさんのWeather APIを利用している。


ongmap.comさんのWeather APIは世界測地系の緯度経度を渡すと

確答するLivedoorさんの地域ID番号を含んだLink先および

Yahoo.comさんのweather.yahooapisのLink先を

候補として返してくる。ここからLivedoorさんの地域ID番号を取り出し、

「Weather Hacks」へ送信している。

今まで使ってきたマクロの送信先は一つであったが、今回は返ってきた

Dataから情報を取り出し、それをキーワードにして別のサイトから

情報を取得している。これが、お天気マクロの概要だ。

今日はこれくらいにしておこう。



なんとなく


 宮本武蔵の五輪書によると陰陽の歩みがある。

誤解なきよう。五輪書を読んだ訳じゃない。誰かが読んで

そのように書いてあった。一歩前に踏み出す歩み(陰)は仮の姿であり、

ひきつける足が陽であり確定の姿だそうだ。

明日のことは誰にもわからない。その時になって始めて解る。

もうすぐYahooのブリーフケースサービス(無料)が使えなくなるなんて

考えていなかった。そこで、新しいInfoMap.xlsは

Microsoft さんの Windows Liveサービスの Sky Driveに保存した。

↑このページのトップヘ