
エクセルのBVAでIEを使って自動車のルート検索をして距離と高速料金をエクセルのシートに抽出したいと考えています。
<作業の流れ>
・エクセルシートのA1セルに郵便番号をハイフン無しで手入力
・マクロを起動(下記参照)
・IEで「ジオコーディング」サイトが開きエクセルシートのB2とC2セルに
ゴール地点となる緯度と経度が抽出される(ちなみに運用上エクセルシートに抽出されなくてもよい)
(ここまでは出来ました)
・IEで「ナビタイム」サイトを開きます
・車でのルートを検索してエクセルシートのD2とE2セルに距離と高速料金(ETC)が抽出される
(これもできました)
問題は「ジオコーディング」で抽出したゴール地点の緯度と経度を「ナビタイム」を開く時の
URLの中に挿入?置き換え?して入れ込み「ナビタイム」でルートを検索する事ができません.
----------------------------------------------------------------
Sub 自動車ルートの距離と高速料金算出()
'ジオコーディングで緯度と経度を算出して取得する
Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.Application")
With objIE
.Visible = True
Dim strSearchWord As String '検索ワード
Dim yuubin As Range
Set yuubin = Cells(Rows.Count, 1).End(xlUp) '表の郵便番号の最終行を選択
strSearchWord = yuubin
.navigate "https://www.geocoding.jp/?q=" & strSearchWord
Do While .Busy = True Or .ReadyState <> 4
DoEvents
Loop
Dim ido As Variant '緯度
Dim keido As Variant '経度
ido = objIE.document.all.tags("b")(2).outerText '緯度の値を取得する
keido = objIE.document.all.tags("b")(1).outerText '経度の値を取得する
Cells(2, 2).Value = ido 'プログラム上で連動するならシートへの抽出は不要
Cells(2, 3).Value = keido 'プログラム上で連動するならシートへの抽出は不要
End With
'ナビタイムでルート検索して距離と高速料金を取得する
Dim objIE2 As Object
Set objIE2 = CreateObject("InternetExplorer.Application")
With objIE2
.Visible = True
Dim adoresu As Variant
'※この中の緯度と経度の値を「ジオコーディング」で取得したゴール地点の値にしたい
'ここが繋がっていません。
'(スタート地点の緯度経度は固定でよいです)
'↓
Address = "136.916786,""road-type"":""default"",""lat"":35.074385}"
.navigate "https://www.navitime.co.jp/maps/routeResult?star …{""name"":""スタート地点"",""lon"":137.231326,""road-type"":""default"",""lat"":35.354389}&goal={""name"":""ゴール地点"",""lon"":" & Address
Do While .Busy = True Or .ReadyState <> 4
DoEvents
Loop
.Top = 0
.Left = 300
.Width = 550
.Height = 1100
Do
On Local Error Resume Next
Err.Clear
Cells(2, 4) = .document.getElementsByClassName("value")(0).outerText
Cells(2, 5) = .document.getElementsByClassName("value-etc-fare")(1).outerText
If Err.Number = 0 Then Exit Do
Loop
On Local Error GoTo 0
End With
End Sub
-------------------------------------------------------------------
どの様に、すれば良いか壁にぶつかっています。
アドレス頂けます様、宜しくお願い致します。
No.6ベストアンサー
- 回答日時:
#5です。
5に回答したような事では無いのですね。全体を検証してなんとなく。。
まず、
keido = objIE.document.all.tags("b")(0).outerText '経度の値を取得する
ido = objIE.document.all.tags("b")(1).outerText '緯度の値を取得する
この取得が安定しませんでした。あ、("b")(0)と(1)にしました。。いずれにしても、期待通りに取得できるのは10回のうち1度くらいでした。
原因は、確かめていません。
なので、getElementsByClassName("nowrap") で抽出して、文字列を加工して変数に入れるのが安定していました。
(力技みたいですけど、20回ほど試して1回取得を失敗しましたnode
。Application.Wait Now + TimeValue("00:00:02")を
挿入したら20回で失敗なしでしたが、念のため変数が空の場合の対応を講じれば、良いと思います。
また、この出力も思惑と違う値が返されるようです。
.document.getElementsByClassName("value")(0).outerTextは、OK
.document.getElementsByClassName("value-etc-fare")(1).outerText は上記と同じ項目の金額ならやはり(0)では?
下記の処理は、考え直した方が良いかも知れません。エラーが発生すると抜けられません。
Do
On Local Error Resume Next
Err.Clear
Cells(2, 4) = .document.getElementsByClassName("value")(0).outerText
Cells(2, 5) = .document.getElementsByClassName("value-etc-fare")(1).outerText
If Err.Number = 0 Then Exit Do
Loop
なかなか面白い(郵便番号で旅してみました)ので検証しているうちに作ってしまいました。。。
結果抽出はまだ課題がありそうなので、途中段階の参考として
整理して変えている部分もあるので、、outerTextをinnerTextとか、、
Sub 自動車ルートの距離と高速料金算出()
'ジオコーディングで緯度と経度を算出して取得する
Dim objIE As Object
Dim Str As Object
Dim strSearchWord As String '検索ワード
Dim yuubin As Range
Dim ido As Variant, keido As Variant '緯度' 経度
Dim tmp As String
Set objIE = CreateObject("InternetExplorer.Application")
Set yuubin = Cells(Rows.Count, 1).End(xlUp) '表の郵便番号の最終行を選択
strSearchWord = "5410001" 'yuubin
With objIE
.Visible = True
.navigate "https://www.geocoding.jp/?q=" & strSearchWord
Call WaitResponse(objIE) '読み込み待ち
For Each Str In .document.getElementsByClassName("nowrap") 'ソースより判断
' Debug.Print Str.innerText
If InStr(Str.innerText, "緯度") > 0 Then
tmp = Mid(Str.innerText, InStr(Str.innerText, " ") + 1)
ido = Left(tmp, InStr(tmp, " ") - 1)
keido = Right(Str.innerText, InStr(StrReverse(Str.innerText), " ") - 1)
'Debug.Print ido; "<>"; keido
End If
Next Str
End With
objIE.Quit 'IEを閉じる
Set objIE = Nothing
'ナビタイムでルート検索して距離と高速料金を取得する
Dim i As Long
Dim Address As String, TargetURL As String
Set objIE = CreateObject("InternetExplorer.Application")
Address = keido & ",""road-type"":""default"",""lat"":" & ido & "}"
'Debug.Print Address
TargetURL = "https://www.navitime.co.jp/maps/routeResult?star …
TargetURL = TargetURL & "{""name"":""スタート地点"",""lon"":137.231326,""road-type"":""default"",""lat"":35.354389}&goal={""name"":""ゴール地点"",""lon"":" & Address
'Debug.Print TargetURL
With objIE
.Visible = True
.navigate TargetURL
.Top = 0
.Left = 300
.Width = 550
.Height = 1100
Call WaitResponse(objIE) '読み込み待ち
Do
i = i + 1
On Local Error Resume Next
Err.Clear
Cells(2, 4) = .document.getElementsByClassName("value")(0).innerText
Cells(2, 5) = .document.getElementsByClassName("value-etc-fare")(0).innerText
' Dim s1, s2, s3, s4
' s1 = .document.getElementsByClassName("value")(0).innerText
' s2 = .document.getElementsByClassName("value-etc-fare")(0).innerText
' s3 = .document.getElementsByClassName("value")(2).innerText
'Debug.Print s1; "<>"; s2; "<>"; s3
If Err.Number = 0 Then Exit Do
Application.Wait Now + TimeValue("00:00:01")
DoEvents '読み込めない時がある為
Loop Until i = 10
On Local Error GoTo 0
End With
objIE.Quit 'IEを閉じる
Set objIE = Nothing
End Sub
Sub WaitResponse(objIE As Object)
Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE
DoEvents
Loop
Application.Wait Now + TimeValue("00:00:02")
End Sub
検証用のコードは、削除してください。
Qchan1962さーん(≧∇≦)/
すごいです。
途中段階だなんて、出来てしまっているではないですか~
コピぺして動かしてみたら見事に動きましたよ。
ありがとうございます。
エラー回避の事も考えて頂いて、私ではたどり着けない境地です。
…私では改良もままなりません。
>結果抽出はまだ課題がありそうなので
とは、どのような事例なのでしょうか?
ま~それはともかく、本当にありがとうございました。
頂いたコードを元に勉強してスキルアップして問題に対処していきます。
…また、お願いするかもしれませんが…
ありがと~~
No.5
- 回答日時:
#1です。
パット見で回答してしまいましたね。
" の数は、イミディエイトウィンドウに出力した時に希望する文字列になっているのかなと思い回答した次第です。
申し訳ないので、ちょっと検証してみました。
取り敢えず下記の内容で検証しました。
全体を検証するのは、難儀なので勘弁ですが、エラー部分だけ 結果としては、{""name"の前の "を加えました
変な変数の入れ方していますが、部分検証する為の残骸です。
Sub testIE()
Dim objIE As InternetExplorer
Dim TargetURL As String
Dim s, Address
Address = "136.916786,""road-type"":""default"",""lat"":35.074385}"
' Debug.Print Address
s = "https://www.navitime.co.jp/maps/routeResult?star …
' Debug.Print s
s = s & "{""name"":""スタート地点"",""lon"":137.231326,""road-type"":""default"",""lat"":35.354389}&goal={""name"":""ゴール地点"",""lon"":" & Address
' Debug.Print s
TargetURL = s 'キーワード
Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
objIE.Visible = True 'IEを表示
objIE.navigate TargetURL 'IEでURLを開く
Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE
DoEvents
Loop
' objIE.Quit 'IEを閉じる
Set objIE = Nothing
End Sub
私の環境では、しっかり遷移しました。
IE 11 Windows10 64bit Excel2013 32bit (2016未検証)
Qchan1962さん
ありがとうございます。
知識不足のため、色々と気を使って頂いたようで申し訳ありません。
Qchan1962さん
ちょっとお待ちくださいね~
アドバイス&既次の回答が答えなのかもしれませんが
教えて頂いた事を確認するにも、理解力がー(≧∇≦)努力します!
取り急ぎ「色々助かります(T▽T)ありがとうございます」
No.4
- 回答日時:
No3です
こちらに確認できる環境がないのと、質問者様の状況が今一つよくわからないので、ほとんど推測になってしまいますが・・・
>str= """lat"":" & ido & ",""lon"":" & keidoを試みたのですが…
>コンパイルエラー「引数は省略出来ません」っとでてしまいます。
それって、VBAのエラーですか?
今、確かめることはできないのですが、多分、文法は間違っていないと思うのですけれど・・・?
センテンス自体は単なる文字連結なので、「引数」に当たるものは無いと思いますし……
もしも、サイトがエラーを出しているのなら、クエリが全体で見て正しくないということではないでしょうか?
>緯度と経度の値は取得できているとおもうのですが、
Debug.Print等を利用して確認すれば、直ぐにわかると思いますけれど。
クエリ全体も同様にして、間違いないかを確認して見るのが宜しいかと思います。
>そもそも上の記述だけでは、ダメなのでしょうか?
クエリ部の構成は前回の回答通りの内容が揃っていないと結果が得られないと想像します。
(省略できる項目がまだあるかも知れませんが…)
>取得データが無く無限エラーになってしまいます。
「無限エラー」という意味がわかりかねますが、対象DOMが存在しない場合でも、取得処理ではエラーにならないはずです。(nullなどがかえされるはず)
そのままvalueやtext等の属性値を取得しようとするとエラーになりますので、値の取得前にDOMの存在を確認するようにすれば、エラーは回避できるものと推測します。
No.2
- 回答日時:
こんにちは。
テストできる環境がないので、ご提示のコードを斜めに見ただけですが……
>これもできました
現状のコードが意図通りに動作していると仮定できるとして、
>問題は「ジオコーディング」で抽出したゴール地点の緯度と経度を「ナビタイム」
>を開く時のURLの中に挿入?置き換え?できません
という点だけのご質問と解釈しました。
URIは普通の文字列ですので、クエリ部の作成も文字列操作で行えば可変の内容として作成が可能です。
変数 ido、keido に目的とする経緯度が文字列で取得できているなら、単純な文字列連結で、
str= """lat"":" & ido & ",""lon"":" & keido
のような要領でも作成できますし、定型文の一部を変更するという考え方で、
str= """lat"":*lat*,""lon"":*lon*"
str=Replace(Replace(str,"*lat*",ido),"*lon*",keido)
のような処理でも同様の結果を得ることができると思います。
fujillinさん
こんにちは
アドバイスありがとうございます。
fujillinさんが解釈してくれた通りの所がわからないのです。
教えて頂いた
str= """lat"":" & ido & ",""lon"":" & keidoを試みたのですが…
コンパイルエラー「引数は省略出来ません」っとでてしまいます。
緯度と経度の値は取得できているとおもうのですが、
そもそも上の記述だけでは、ダメなのでしょうか?
記述場所が悪いのでしょうか?
また、プログラムの最後から数えて6行目の
Cells(2, 5) = .document.getElementsByClassName("value-etc-fare")(1).outerText
で高速料金(ETC)代を取得しているのですが、
スタート地点からゴール地点が近い場合高速を利用ルートになるため
取得データが無く無限エラーになってしまいます。
お手数ですが、もう少しアドバイスをおねがいできないでしょうか
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
最強の防寒、あったか術を教えてください!
とっても寒がりなのですが、冬に皆さんがされている最強の防寒、あったか術が知りたいです!
-
洋服何着持ってますか?
洋服を減らそうと思っているのですが、何着くらいが相場なのかわかりません。
-
集中するためにやっていること
家で仕事をしているのですが、布団をはじめ誘惑だらけでなかなか集中できません。
-
エクセルVBAでNAVITIMEを使って自動車のルート検索をして距離と高速料金を自動表示したいのです
Visual Basic(VBA)
-
Excelについての質問です。 2点の住所からの距離を一括で算出したいのですが データ数が5万ほどあ
Excel(エクセル)
-
エクセルで、毎日の走行距離(クルマ)を自動計算したい
Excel(エクセル)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelについて質問です。 画像...
-
EXCELで、60進法の緯度経度を10...
-
緯度、経度 1分は何km?
-
Excelでの緯度経度入力方法
-
Excelの自動計算で緯度・経度を...
-
北九州市は、思いのほか寒いと...
-
エクセルVBA IEを操作して自動...
-
経度緯度の小数点表記への変換...
-
インドのニューデリーは鹿児島...
-
金髪で青い目の人が多い国はど...
-
GPS装置で得たロランC時差表示...
-
測地緯度経度からUTM図法への変換
-
EXCELで緯度、経度を入力して、...
-
潮の干満と緯度の高低の相関に...
-
緯度と経度の秒とその下の単位...
-
GPSのNMEA-0183フォーマット...
-
秒数が3ケタの緯度経度の意味は?
-
中緯度、高緯度、低緯度って具...
-
住所から直線距離を算出したい...
-
緯度・経度からの角度計算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでの緯度経度入力方法
-
緯度、経度 1分は何km?
-
Excelについて質問です。 画像...
-
EXCELで、60進法の緯度経度を10...
-
Excelの自動計算で緯度・経度を...
-
【至急!】座標データを緯度経...
-
緯度と経度や赤道線を習うのは...
-
中緯度、高緯度、低緯度って具...
-
GIS、GPS,WebGIS...
-
金髪で青い目の人が多い国はど...
-
日の出が5時半ぐらいになるのは...
-
北緯・緯度の読み方について
-
2点の緯度経度から2点の交点...
-
1秒(角度の)辺りの距離は何...
-
緯度と経度の秒とその下の単位...
-
住所から直線距離を算出したい...
-
緯度経度1秒=?m
-
経度緯度の小数点表記への変換...
-
インドのニューデリーは鹿児島...
-
秒数が3ケタの緯度経度の意味は?
おすすめ情報