A2に(出発地の)大阪、
B2に(目的地の)名古屋とあったら、
C2に(運賃:片道)6,180円が入るようにしたいのです。
コードを教えて頂きたく御願いします。
(この部分しか書けませんでした。)
Sub test()
Dim IE
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "http://transit.map.yahoo.co.jp"
IE.Visible = True
IE.Quit
SetIE = Nothing
End Sub
No.1
- 回答日時:
ざっとの、方法のみですが…
1)大阪、名古屋をエンコードしてURLのサーチ部分に追加したものを
表示させる。(手動で検索するのとほぼ同じ)
例の場合だと
from=%E5%A4%A7%E9%98%AA&to=%E5%90%8D%E5%8F%A4%E5%B1%8B
2)表示された結果のソースから「<dl class="price">」や「運賃:」
などをキーに料金を検索。(この例だと3箇所みつかるはず)
3)検索された料金を表示。
(3箇所 6,180円、6,410円、5,980円からどの様に選択して表示する
のかはご質問文からは不明)
具体的な方法のヒントはこのあたりにあると思います。
http://www2s.biglobe.ne.jp/~iryo/vba/IE/index01. …
しかし、実際には、
この他にもパラメータがいろいろあるので、それを無視して利用しても全ての場合に正しい結果が得られるのか不明。
(利用設定や日付などによって料金が変わると思われる)
入力値が不正な場合のチェックをどうするのか?
例のように結果の料金がいろいろある場合にどれを採用するのか?
などなど、ご質問文だけでは不明な点がいろいろあります。
コーディングで行うには、これらの起こり得る可能性について対処しておく必要があるので、かなり複雑になるでしょう。
(例えば、IEのトラブルや、ネット環境が何らかの不具合で繋がらないなどの場合に、値を取ろうとしても即エラーになりますよね?)
また、ご提示のサイトの仕様が変更された時はどうするのかなどなど、他にもいろいろ問題がありそうな気がします。
(そもそも、このような利用ってありなのと言う気がしないでもない)
それなので、ご提示のように検索画面を表示させて、「大阪」、「名古屋」をそれぞれ出発地、目的地の欄にコピーするぐらいまでにしておいた方が宜しいような気がしますが…(あとの操作はユーザにさせる)
早速の御回答を有難う御座います。
御指摘のとおりすごく曖昧ですみません。
自分だけが使うので、起こり得る可能性に関しては
とりあえず、置いといて、まず、料金の取得方法を知りたいと思いました。
会社内で、旅費交通費の金額が間違いなく請求されているかをチェックするのに、
何回も繰り返して調べているので、
何か良い方法がVBAを使用して出来ないかと思っています。
No.2
- 回答日時:
こんにちは。
複数の運賃を探す場合は、ループするか、正規表現を使わなくてはなりませんが、とりあえず、参考までコードを書いておきます。今回は、最初に出てくるものだけを取り出しています。
本来、正規表現での取得のほうが、いろんな面で失敗が少ないのですが、私は、検索スピードが落ちるような気がしています。細かい部分は、もう少し手を加えなくてはなりません。
なお、ヤフーは、年に一度か二度は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
御回答を有難うございます。
Private Function Encode_Uni2UTF(ByRef strUni As String)
のところで止まります。
(ボタンを作成し、標準モジュール1にコピペしました。
A1に大阪、A2に名古屋と手入力してあります。)
すみませんが宜しく御願いします。
No.3ベストアンサー
- 回答日時:
こんばんは。
失礼しました。ADO を参照設定ままで、作っていたので、それを外さずに動かしていたからです。
>Private Function Encode_Uni2UTF(ByRef strUni As String)
>のところで止まります。
止まる理由はよく分かりませんが、以下のようにすればよいはずです。
ただ、金額は、日時設定していませんから、値段が変わります。
ひとつのまとまりを、以下に、そのまま上書きしてしてください。
'-------------------------------------------
Private Function Encode_Uni2UTF(ByRef strUni As String)
Dim buf As Variant
Dim tbuf As Variant
Dim n As Variant
Const CSET = "UTF-8"
Const ADTYPETEXT = 2
Const ADTYPEBINARY = 1
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
まるごと全部作成して頂き、本当に感謝の気持ちでいっぱいです。
頭が良いと、こんなに業務が楽になるんだなあとつぐつぐ思います。
今の私のレベルでは、難し過ぎて解読出来ないので、
そのまま使用させてもらうのですが、理解出来る様に、
勉強を続けたいと思います。
御指導有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【エクセルマクロ】既に開いているIEの、サイズや表示位置を変更するには 4 2022/12/01 22:57
- Visual Basic(VBA) バックグラウンドのプロセスのエクセルを閉じる方法 4 2022/05/12 15:39
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Chrome(クローム) グーグルクロムをマイクロソフト・エッジに切り替える方法 2 2022/06/20 10:08
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- InternetExplorer(IE) Microsoft edgeのIEモードを解除したいのですが。 3 2023/04/09 13:51
- Excel(エクセル) Excel-VBAの「しばらくお待ちください」のダイアログが自動的に閉じない 2 2023/05/24 15:31
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- その他(ブラウザ) IE・edgeで日増しに観られるサイトが減ってくる。 1 2022/10/04 22:40
- その他(パソコン・周辺機器) EXCELで「WEBオプションの対象ブラウザ」を変更する方法 2 2023/04/12 15:44
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
くら寿司WiFiパスワード分から...
-
関西弁はなぜ人を不快にさせる...
-
日本へ架ける国際電話のcountry...
-
キャバ嬢です。 お客様が好きに...
-
JRで神戸駅から大阪まで 快...
-
今(大阪)花火の音が聞こえま...
-
大阪人ですが、大阪人が嫌いで...
-
関西人の気質
-
複数列の平均を出したい
-
風俗の大阪のアポロビルみたい...
-
電信棒という表現は方言ですか?
-
「ばびる」の使い方
-
「自~至~」について
-
友達(東京人)が大阪が合わな...
-
大阪に合わない
-
話してる時に『〇〇〇〇じゃな...
-
「無理しないでね」って意味だ...
-
【関西の方限定】 関西弁につ...
-
『あんた』と呼ぶ心理
-
大阪弁の「かんにんなー」の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関西弁はなぜ人を不快にさせる...
-
くら寿司WiFiパスワード分から...
-
日本へ架ける国際電話のcountry...
-
キャバ嬢です。 お客様が好きに...
-
大阪に合わない
-
大阪人ってどうして威圧的なん...
-
JRで神戸駅から大阪まで 快...
-
「無理しないでね」って意味だ...
-
大阪人ですが、大阪人が嫌いで...
-
贈呈式の司会進行の原稿につて
-
友達(東京人)が大阪が合わな...
-
大阪が嫌いになりだした
-
「○○さんの家」という意味で「...
-
複数列の平均を出したい
-
関西のノリがほんとにしんどいです
-
電信棒という表現は方言ですか?
-
関西弁で言う「ええしの子」の...
-
電話番号の最初の3桁や4桁って...
-
風俗の大阪のアポロビルみたい...
-
呼び出しの「元」と「先」って...
おすすめ情報