こんにちは。
複数の運賃を探す場合は、ループするか、正規表現を使わなくてはなりませんが、とりあえず、参考までコードを書いておきます。今回は、最初に出てくるものだけを取り出しています。
本来、正規表現での取得のほうが、いろんな面で失敗が少ないのですが、私は、検索スピードが落ちるような気がしています。細かい部分は、もう少し手を加えなくてはなりません。
なお、ヤフーは、年に一度か二度はHTMLコードを書き換えますので、結構、泣かされます。だから、やはり正規表現のほうが便利です。それは、研究してください。
ワークシートにボタンを置いて、A1,A2 に書いてあげれば、A3に、金額が出てきます。
例:
Private Sub CommandButton1_Click()
Call GetFareTest1
End Sub
出力例:
A1:大阪
A2:名古屋
A3:6,180円
なお、失敗したときも表示します。
'-------------------------------------------
'標準モジュール
'-------------------------------------------
'Option Explicit
Sub GetFareTest1()
Dim IE As Object
Dim myURL As String
Dim myContent As String
Dim buf As String
Dim sST As String
Dim sDST As String
'ヤフー運賃検索(Yahoo!路線情報)
myURL = "http://transit.map.yahoo.co.jp"
sST = Encode_Uni2UTF(Range("A1").Value)
sDST = Encode_Uni2UTF(Range("A2").Value)
If sST = "" Or sDST = "" Then MsgBox "セルに文字がありません。", 48: Exit Sub
myURL = myURL & "/search/result?from=" & sST & "&to=" & sDST
Set IE = CreateObject("InternetExplorer.Application")
With IE
'.Visible = True 'コメントブロックをしたら、表示する
.Navigate myURL
Do While .Busy
DoEvents
Loop
Do Until .ReadyState = 4
DoEvents
Loop
myContent = .Document.body.innerHTML
'情報が取れなくなったときは、ここでログを取る
.Quit
End With
Set IE = Nothing
'出力
Range("A3").Value = PickUpString(myContent, "片道")
End Sub
Function PickUpString(ByVal strContent As String, SearchTxt As String)
Dim buf As String
Dim i As Long
Dim j As Long
buf = Mid$(strContent, InStr(1, strContent, SearchTxt, 1) + 2, 40)
i = InStr(1, buf, ">", 1) + 1
j = InStrRev(buf, "</S", , 1)
If i * j > 0 Then
PickUpString = Mid$(buf, i, j - i)
Else
PickUpString = "取得に失敗"
End If
End Function
Private Function Encode_Uni2UTF(ByRef strUni As String)
Dim buf As Variant
Dim tbuf As Variant
Dim n As Variant
Const CSET = "UTF-8"
Dim ADOstrm As Object 'ADODB.Stream
On Error GoTo ErrHandler
Set ADOstrm = CreateObject("ADODB.Stream") 'New ADODB.Stream
ADOstrm.Open
ADOstrm.Type = ADTYPETEXT
ADOstrm.Charset = CSET
ADOstrm.WriteText strUni
ADOstrm.Position = 0
ADOstrm.Type = adTypeBinary
ADOstrm.Position = 3
buf = ADOstrm.Read()
ADOstrm.Close
Set ADOstrm = Nothing
For Each n In buf
tbuf = tbuf & "%" & Hex(n)
Next
Encode_Uni2UTF = tbuf
Exit Function
ErrHandler:
If ADOstrm Is Nothing = False Then ADOstrm.Close
Set ADOstrm = Nothing
End Function
お礼
まるごと全部作成して頂き、本当に感謝の気持ちでいっぱいです。 頭が良いと、こんなに業務が楽になるんだなあとつぐつぐ思います。 今の私のレベルでは、難し過ぎて解読出来ないので、 そのまま使用させてもらうのですが、理解出来る様に、 勉強を続けたいと思います。 御指導有難うございました。