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

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

» 2014年09月08日 18時00分 公開
[薬師寺国安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)。

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

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

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

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

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

図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のコードを書いていく。

  1. Option Explicit
  2. Private myAddressCoodinatePosition As String
  3. Private myLatitude As String
  4. Private myLongitude As String
  5. Private myMapType As String
  6. Private no As Integer
  7. Private Sub okButton_Click()
  8. SpinButton1.Enabled = True
  9. no = 10
  10. Dim xmldoc As MSXML2.XMLHTTP
  11. Dim myUri As String
  12. Set xmldoc = CreateObject("MSXML2.XMLHTTP")
  13. If addressTextBox.Text = "" Then
  14. MsgBox "正確な住所を入力してください。"
  15. Exit Sub
  16. End If
  17. myUri = "http://www.geocoding.jp/api?v=1.1&q=" & addressTextBox.Text
  18. xmldoc.Open "POST", myUri, False
  19. xmldoc.send (Null)
  20. Dim doc As MSXML2.DOMDocument
  21. Set doc = CreateObject("MSXML2.DOMDocument")
  22. doc.LoadXML (xmldoc.responseText)
  23. Dim myNodes As MSXML2.IXMLDOMNodeList
  24. Set myNodes = doc.SelectNodes("result/coordinate")
  25. Dim i As Integer
  26. For i = 0 To myNodes.Length - 1
  27. myLatitude = myNodes(i).ChildNodes(0).Text
  28. myLongitude = myNodes(i).ChildNodes(1).Text
  29. Next
  30. Call 地図の表示
  31. 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 © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

Coding Edge 記事ランキング

本日月間

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

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

メールマガジン登録

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