Excel VBAとGoogle Maps APIを用いて複数地点間の移動時間を一気に求めてみた。

どうも、一年ぶりくらいですかね、、、?

資格勉強が嫌すぎて、現実逃避がてらこの記事を書いています

 

タイトルにある通り、ど素人の僕がGoogle Maps APIを使う機会があったので何をしたか、そしてどうやってするかについてご紹介します〜!

 

 

【やりたいこと】

複数の地点同士の移動時間を一気にExcel上で計算がしたい。

要は以下の表みたいな物を楽して作りたいんです。

f:id:kawanouso:20191019144439p:plain

複数地点間の移動時間を一気に表として出したい

例えば、京都駅ー静岡駅だと移動に120分かかるってことがこちらの表でわかります。 

 

こんな表、Google mapや、乗り換え検索で一つ一つ調べればすぐできるじゃん?っていう方もいらっしゃるかと思います。

確かにこの表であれば15回[ =(6*6-6)/2]Googleさんにお聞きすればいいのですが、今回僕が作りたいのは600箇所以上の移動距離をまとめた表です。

 

600箇所だとだいたい、、、(600*600-600)/2=359700

36万回Googleさんに聞かないといけないわけで

一つ調べるのに10秒とかで計算しても1000時間

 

流石に人間やめたくなります。

 

そこで、Google Maps APIのご登場です。

 

なんと、上の計算をExcel関数とAPIを使えば一瞬でできます。

 

 

【やりかた】

やり方はこちらの記事を参考にしつつ、これだけだと動かなかったのでエンジニアの友人に質問して少しだけコードをいじりました。

www.excel-pitin.net

環境はこんな感じのポンコツっぷりです。

windows7

Excel 2007

※今回のやり方はwindowsでしかできません

step2で行うMicrosoft XML. v6.0の実行環境がwindowsのみっぽいのです。

 

Step1:Google Maps APIを動かすためのKEYを取得

Step2:Excel VBAの参照設定をMicrosoft XML. v6.0に設定

Step3:VBAの標準モジュールにコードを貼り付け

Step4:Excelでユーザー定義関数を用いて表を作る

 

以上です!!

 

では、詳細にいきます。

 

Step1:Google Maps APIを動かすためのKEYを取得

こちらはわかりやすく解説しているサイトがたくさんあるので参考にたサイトを貼っときますね。

its-office.jp

ちなみに今回は特に公開するわけでもないので、キーの制限までは多分不要、、?

 

Step2:Excel VBAの参照設定をMicrosoft XML. v6.0に設定

1, まずVBAのエディターを開きます。

リボンの開発>Visual Basic

www.koikikukan.com

 

2, 参照設定で「Microsoft XML. v6.0」を選択

www.sejuku.net

 

Microsoft XML. v6.0がなかったとき

僕の場合、参照設定で「Microsoft XML. v6.0」が見当たらなかったので新しくMicrosoftのサイトからインストールしました。↓

www.microsoft.com

インストールしたあとexcelは再起動した方がいいかも

 

Step3:VBAの標準モジュールにコードを貼り付け

1, VBAの標準モジュールを開く

officetanaka.net

 

2,以下のコードを標準モジュールに貼り付ける

以下のコードを標準モジュールに貼り付けてください。

その際コード中の「ここにAPIのキーを入れる」の代わりにStep1でで取得したKEYをぶち混んでください。

 

ーーーーーーー以下、コードーーーーーー

Function DGMAP(origin As String, destination As String, distance As Boolean) As String
    http://stackoverflow.com/questions/10116301/google-maps-api-for-time-and-distance-data-access-vba
    
    Dim sXMLURL As String
    sXMLURL = "https://maps.googleapis.com/maps/api/directions/xml?origin=" _
                        & origin & "&destination=" & destination & "&sensor=false&key=ここにAPIのキーを入れる
    
    Dim objXMLHTTP As MSXML2.ServerXMLHTTP60
    Set objXMLHTTP = New MSXML2.ServerXMLHTTP60
    
    With objXMLHTTP
        .Open "GET", sXMLURL, False
        .setRequestHeader "Content-Type", "application/x-www-form-URLEncoded"
        .Send
    End With
    
    'Debug.Print objXMLHTTP.ResponseText
    
    Dim domResponse As DOMDocument60
    Set domResponse = New DOMDocument60
    domResponse.LoadXML objXMLHTTP.ResponseText
    Dim ixnStatus
    Set ixnStatus = domResponse.SelectSingleNode("//status")
    
    If ixnStatus.Text = "OK" Then
        Dim ixnDistance, ixnDuration
        Set ixnDistance = domResponse.SelectSingleNode("/DirectionsResponse/route/leg/distance/text")
        Set ixnDuration = domResponse.SelectSingleNode("/DirectionsResponse/route/leg/duration/text")
    End If
    If IsEmpty(ixnDistance) Then
        DGMAP = "Empty"
        Exit Function
    End If

 '距離(True) または時間(False)
    If distance = True Then
        DGMAP = left(ixnDistance.Text, InStr(1, ixnDistance.Text, " ") - 1)
    Else
        DGMAP = ixnDuration.Text
    End If
    Set domResponse = Nothing
    Set objXMLHTTP = Nothing
End Function

ーーーーー以上、コードーーーーーー

 

コード入力後、一旦保存してVBAを閉じます。

 

Step4:Excelでユーザー定義関数を用いて表を作る

さて、あとは表を作るだけです。

 

今回は以下のユーザー定義関数を用いて作成します。

 =DGMAP ([origin], [destination], TRUE: distance/  FALSE: time)

第1引数(出発地):[origin]

第2引数(目的地):[destination]

第3引数(距離or時間):TRUE→距離、FALSE→時間

 

今回は移動時間が調べたいので第3引数はfalseを用います。

f:id:kawanouso:20191019161131p:plain

大阪駅名古屋駅の移動時間を求める

E3のセルに

=DGMAP(B3,E2,false)

と入力

すると、数秒待つと時間が出ます!!

 

あとは

=DGMAP($B3,E$2,false)

このように参照セルを固定させてオートフィルを使えば一気に表を埋めれちゃいます!!

 

以上!!簡単!!

 

注意点

Excelの再計算機能とかで何回も再計算されるとAPIの無力枠超えたりするでの気をつけましょ〜

あとこちらの表だと、左下半分は上右半分と同じ結果なので、計算を全部させると無駄になっちゃうので一工夫した方がいいかと思います。