業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、Geocoding APIとGoogle Static Maps APIを利用して、指定した住所の位置を検索表示したり、地図を拡大/縮小したり、地図の種類を変えたりする方法を紹介。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Tips「ExcelにBing Mapsを挿入し、Google Places APIで取得した住所から店舗の分布地図を作成」では、Excel VBAを使って、Bing Maps上にコンビニエンスストアの位置を表示するサンプルを紹介した。今回はGoogle Mapsの表示の方法を紹介する。入力した住所にマーカーを表示させる処理と、地図のズームイン、ズームアウト、地図タイプの表示方法を変える方法を解説しよう。
顧客の会社の位置をGoogle Maps上に表示して、場所の確認を行うなどの用途に大いに役立つのではないだろうか。
今回は2つのWeb APIを利用する。一つは前述のTipsでも使用した、「Geocoding API」で、詳細は下記のURLを参照してほしい。
もう一つは、「Static Maps API V2」を使用する。Tips「ExcelにBing Mapsを挿入し、Google Places APIで取得した住所から店舗の分布地図を作成」でもグーグルのAPIを使用していた。その場合はグーグルのAPIキーが必要だったが、今回は必要ない。
「Static Maps API V2」については、「Static Maps API V2 デベロッパー ガイド - Google Maps Image API - Google Developers」を参照してほしい。
「Google Static Maps API」には、1日当たりのアクセス数が2万5000回という制限がある。この制限を超えると地図が表示されなくなるので注意してほしい。しかし、太平洋標準時間で日付が変わると、再び地図は表示されるようになる。
Excel VBAを使ってGoogle Mapsを表示させるには、Excel 2013より前のバージョンのExcelなら、Microsoft Web Browserコントロールを使用していた。Excel 2013メニューの[開発]→[挿入]と選択して、「ActiveXコントロール」内の「コントロールの選択」アイコンを選択する(図1)。
表示されるコントロールから「Microsoft Web Browser」を選択して「OK」ボタンをクリックする(図2)。
「OK」ボタンをクリックし、アクティブシート上に「Microsoft Web Browser」コントロールを配置すると図3のように「オブジェクトを挿入できません。」と表示される。
このエラーはExcel 2013から発生するエラーのようで、現時点では有効な回避策はないようだ。そこで、2013以降はユーザーフォームを使用することが推奨されている。
エラーの詳細については下記を参照してほしい(英文)。
そこで、今回はユーザーフォームを使用してGoogle Mapsを表示する方法を解説する。
まず、VBE(Visual Basic Editor)のメニューから、[挿入]→[ユーザーフォーム]と選択する。プロジェクトにUserForm1が追加されるので、UserForm1ダブルクリックして表示されるフォーム画面に、「ツールボックス」からコントロールを配置する。
まず、UserForm1を選択し、プロパティからCaptionに「Google Mapsを表示する」と指定する。するとUserForm1のタイトルが「Google Mapsを表示する」に変わる
フォーム上に配置するコントロールは表1のようになる。
コントロール名 | オブジェクト名 |
---|---|
ラベルコントロール | Label1(住所) |
テキストボックス | addressTextBox |
ボタン | okButton |
スピンボタン | SpinButton1 |
WebBrowser | WebBrowser1 |
オプションボタン | OptionButton1(roadmap) |
オプションボタン | OptionButton2(satellite) |
オプションボタン | OptionButton3(hybrid) |
オプションボタン | OptionButton4(terrain) |
addressTextBoxの「プロパティ」→「IMEModeプロパティ」に「fmIMEModeOn」と指定して、日本語入力を可能にしておく。okButtonのプロパティのEnableプロパティとSpinButton1のプロパティのEnableプロパティに「False」を指定して、最初の状態では、使用を不可としておく。
各OptionButton1〜4までのプロパティからCaptionプロパティに上から順に「roadmap」「satellite」「hybrid」「terrain」と指定しておく。
ちなみに「roadmap」は道路地図を表示、「satellite」はGoogle Earthの航空写真を表示、「hybrid」は通常のビューと航空写真を混合して表示、「terrain」は地形情報に基づいて表示という意味になる。
全て指定すると、図4のようなレイアウトになる。
もし、「ツールボックス」に「WebBrowser」コントロールが表示されていない場合は、「ツールボックス」上で、マウスを右クリックして表示されるメニューから、「その他のコントロール」を選択して、「Microsoft Web Browser」にチェックを付けると、「ツールボックス」に登録される。
今回も、「MSXML2.XMLHTTP」と「MSXML2.DOMDocument」を使用するため、VBE(Visual Basic Editor)メニューの[ツール]→[参照設定]から「Microsoft XML,v3.0」を参照しておく必要がある。詳細については、Tips「ExcelにBing Mapsを挿入し、Google Places APIで取得した住所から店舗の分布地図を作成」の「参照設定」を参照してもらいたい。
フォームに配置された「実行」ボタンをダブルクリックすると、コードエディター画面が表示されるので、そこにリスト1のコードを書いていく。
Option Explicit Private myAddressCoodinatePosition As String Private myLatitude As String Private myLongitude As String Private myMapType As String Private no As Integer Private Sub okButton_Click() SpinButton1.Enabled = True no = 10 Dim xmldoc As MSXML2.XMLHTTP Dim myUri As String Set xmldoc = CreateObject("MSXML2.XMLHTTP") If addressTextBox.Text = "" Then MsgBox "正確な住所を入力してください。" Exit Sub End If myUri = "http://www.geocoding.jp/api?v=1.1&q=" & addressTextBox.Text xmldoc.Open "POST", myUri, False xmldoc.send (Null) Dim doc As MSXML2.DOMDocument Set doc = CreateObject("MSXML2.DOMDocument") doc.LoadXML (xmldoc.responseText) Dim myNodes As MSXML2.IXMLDOMNodeList Set myNodes = doc.SelectNodes("result/coordinate") Dim i As Integer For i = 0 To myNodes.Length - 1 myLatitude = myNodes(i).ChildNodes(0).Text myLongitude = myNodes(i).ChildNodes(1).Text Next Call 地図の表示 End Sub
初めは、モジュールシート内の全てのプロシージャから利用できる変数、「プライベートモジュールレベル」(以下、Private)変数として、 文字列型の「myAddressCoodinatePosition」「myLatitude」「myLongitude」「myMapType」を、2〜5行目で宣言する。6行目でInteger型の「no」変数も宣言する。
8行目以降は「実行」ボタンがクリックされたときの処理だ。
9行目では、使用不可となっていたSpinButton1の使用を可能にしている。このSpinButton1は地図の縮小拡大を操作するボタンだ。10行目でズーム値を格納するPrivate変数「no」を「10」で初期化しておく。
11行目以下、Geocodingを使って、入力された住所の緯度・経度を取得する処理は、Tips「ExcelにBing Mapsを挿入し、Google Places APIで取得した住所から店舗の分布地図を作成」のBing Mapsを使った処理とほとんど同じであるため、そちらを参照してほしい。
Copyright © ITmedia, Inc. All Rights Reserved.