目次
Excelで位置情報のデータを整理
前回のページで複数のマーカーをプロットするための地理院地図のHTML,Javascriptを用意しました。
ここでは例として、全国の都道府県の県庁所在地をプロットしてみます。
都道府県の位置情報を調べてデータを作成します。いろいろな方法が考えられますが、ここではデータ範囲が明示的なテーブル定義を行います。図のようにワークシート名を「都道府県」テーブル名も「都道府県」と設定して、カラムは都道府県番号「#」、「都道府県名」、「緯度」、「経度」を用意してデータを整理します。
地図をコントロールするプロシージャ
標準モジュールに以下のコードを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
Option Explicit Public Sub putMarkers() [crayon-607ca3a6849d4210628922 ]<code>Dim ie As InternetExplorer Dim HR As Long Dim id As Variant Dim R As Long Dim lon As Double Dim lat As Double Dim Description As String 'IEのインスタンスを生成 Set ie = CreateObject("InternetExplorer.Application") 'IEで地理院地図の準備 With ie '用意したHTMLのアドレスを開く .Navigate "http://xl.hisholy.net/putMarkers/putMarkers.html" .Visible = True 'IEの表示待ち Do While .Busy Or .ReadyState < READYSTATE_COMPLETE DoEvents Loop End With 'リスト内のデータ処理 With ThisWorkbook.Worksheets("都道府県").ListObjects("都道府県") 'テーブルヘッダの行番号 HR = .HeaderRowRange.Row 'テーブルの見えている行に対するループ For Each id In .ListColumns("#").DataBodyRange.SpecialCells(xlCellTypeVisible) R = id.Row - HR 'テーブル内の行番号 lon = .ListColumns("経度").DataBodyRange(R).Value '該当行の経度を取得 lat = .ListColumns("緯度").DataBodyRange(R).Value '該当行の緯度を取得 'マーカーを配置するスクリプトを実行 ie.Document.parentWindow.execScript ("putMarkers(" _ & lon & "," & lat & _ ",'http://xl.hisholy.net/putMarkers/" & id.Value & ".png')") '下段の説明用文字列を作成 Description = Description & id.Value & ":" & _ .ListColumns("都道府県名").DataBodyRange(R) & _ ",経度 " & lon & ",経度 " & lat & "<br/>" Next 'HTMLに説明分を追加 ie.Document.getelementbyid("description").innerHTML = Description End With |
End Sub
[/crayon]
5,14行目 IEオブジェクトを生成
ExcelでIEをコントロールできるように、インスタンスを生成し、オブジェクト変数にセットします。
そのために、Microsoft Internet Controls の参照設定が必要になります。
17〜28行目 IEで地理院地図の準備
17〜28行目のWithブロック内は ieオブジェクトへの処理をまとめたものです。
20〜21行目:前回作成したhtmlファイルのURLでIEを起動し、表示させます。
24〜26行目:IEの表示が完了するまで待ちます。
31〜58行目 リスト内のデータを処理
17〜28行目のWithブロック内はリスト内のデータ処理をまとめたものです。
34行目:テーブルのヘッダ行のワークシートにおける行番号を取得しています。
37〜58行のFor Eachは、テーブル内のカラム”#”の見えている行に対してループします。
オートフィルタを使って非表示になった行は処理されません。
40行目:対象のテーブル内における行番号を取得します。
41〜42行目:その行番号の経度、緯度のカラムの値を取得します。
45〜47行目:前回作成したJavascriptの関数 putMarkersを実行しています。引数は上の行で取得した経度、緯度とアイコンの画像ファイルのアドレスを順に指定しています。画像は開発段階でボツにしたものですが、以下のような1〜47のピンを用意しました。
50〜52行目:説明文の文字列を追加しています。ループ毎に改行タグを入れています。
56行目:ループ処理完了後、作成した説明文文字列をHTMLに渡します。
実行結果
今回の例ではマクロ実行用のインターフェースは用意していませんので、適宜ボタンやメニューを作るか、「開発」タブの「マクロ」から”putMarkers”を実行して下さい。
実行すると、IEが起動し、47都道府県の県庁所在地がプロットされます。
また、フィルタをかけて一部分のみ表示させると、表示されたもののみプロットします。例えば次のように関東のみでフィルタをかけた場合、
関東の県庁所在地のみがプロットされます。
ダウンロード
本エントリで作成した、地理院地図でkmlを使わずにExcelデータから複数のマーカーをプロットするコードのサンプルファイルです。
本エントリからコピー&ペーストしてご自身で作成することが可能ですが、面倒な方、やり方がわからない方はこちらをダウンロード下さい。
※ここにGumroadのウィジェットを表示していますが、企業・学校などでフィルタリングにより表示されない場合があります。