連載
» 2014年09月08日 18時00分 UPDATE

VBA/マクロ便利Tips:ExcelにGoogle Maps APIで地図を埋め込み、住所検索、拡大/縮小、地図種類変更 (1/2)

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、Geocoding APIとGoogle Static Maps APIを利用して、指定した住所の位置を検索表示したり、地図を拡大/縮小したり、地図の種類を変えたりする方法を紹介。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 Tips「ExcelにBing Mapsを挿入し、Google Places APIで取得した住所から店舗の分布地図を作成」では、Excel VBAを使って、Bing Maps上にコンビニエンスストアの位置を表示するサンプルを紹介した。今回はGoogle Mapsの表示の方法を紹介する。入力した住所にマーカーを表示させる処理と、地図のズームイン、ズームアウト、地図タイプの表示方法を変える方法を解説しよう。

 顧客の会社の位置をGoogle Maps上に表示して、場所の確認を行うなどの用途に大いに役立つのではないだろうか。

Google Static Maps APIを使う際の注意点

 今回は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のMicrosoft Web BrowserコントロールではGoogle Mapsを使えない

 Excel VBAを使ってGoogle Mapsを表示させるには、Excel 2013より前のバージョンのExcelなら、Microsoft Web Browserコントロールを使用していた。Excel 2013メニューの[開発]→[挿入]と選択して、「ActiveXコントロール」内の「コントロールの選択」アイコンを選択する(図1)。

GoogleMaps_01.png 図1 「ActiveXコントロール」内の、「コントロールの選択」アイコンを選択する

 表示されるコントロールから「Microsoft Web Browser」を選択して「OK」ボタンをクリックする(図2)。

GoogleMaps_02.png 図2 表示されるコントロールから「Microsoft Web Browser」を選択する

 「OK」ボタンをクリックし、アクティブシート上に「Microsoft Web Browser」コントロールを配置すると図3のように「オブジェクトを挿入できません。」と表示される。

GoogleMaps_03.png 図3 「Microsoft Web Browser」コントロールを配置すると、「オブジェクトを挿入できません。」と表示される

 このエラーはExcel 2013から発生するエラーのようで、現時点では有効な回避策はないようだ。そこで、2013以降はユーザーフォームを使用することが推奨されている。

 エラーの詳細については下記を参照してほしい(英文)。

 そこで、今回はユーザーフォームを使用してGoogle Mapsを表示する方法を解説する。

Google Maps表示用のユーザーフォームの作成

 まず、VBE(Visual Basic Editor)のメニューから、[挿入]→[ユーザーフォーム]と選択する。プロジェクトにUserForm1が追加されるので、UserForm1ダブルクリックして表示されるフォーム画面に、「ツールボックス」からコントロールを配置する。

 まず、UserForm1を選択し、プロパティからCaptionに「Google Mapsを表示する」と指定する。するとUserForm1のタイトルが「Google Mapsを表示する」に変わる

 フォーム上に配置するコントロールは表1のようになる。

表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のようなレイアウトになる。

GoogleMaps_04.png 図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
リスト1 指定した住所の位置をGoogleMapsに表示するコード

 初めは、モジュールシート内の全てのプロシージャから利用できる変数、「プライベートモジュールレベル」(以下、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を使った処理とほとんど同じであるため、そちらを参照してほしい。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。