Excelマクロでブラウザ(IE)操作。交通費をExcelから読取→サイトで検索→Excelへ書込

Excelマクロで、ブラウザ(IE。InternetExplorer)を操作することもできます。
交通費検索のしくみで解説してみました。

IMG_7331

※カフェにて iPhone X

ExcelマクロでIEを操作する設定

ExcelマクロでIE(インターネットエクスプーラー)を操作するには、次のような設定をしておきましょう。

VBE(ExcelでAlt+F11)で、[ツール]→[参照設定]を選び、

次の2つにチェックを入れて、Enterキーを押します。
これで設定は終わりです。

ex-it_13

 

まずは、次のプログラムを書きましょう。
IEを動かす設定です。
(IEは任意です)
〇〇.Visible = True
だと、実際にIEを表示します。
開発中は、表示させて動きを確認したほうがやりやすいです。

    Dim IE As InternetExplorer
        
    Set IE = CreateObject("internetexplorer.application")
    
    IE.Visible = True
    IE.Navigate "transit.yahoo.co.jp"

IE.Navigate “transit.yahoo.co.jp”で開くサイトを指定します。

F5キーを押して実行して、IEが起動するか確認しましょう。

 

ExcelマクロでIE操作を表現するには

 

ExcelマクロでIEを操作するときに、問題となるのは、「どうやって伝えるか」です。
Excel内であれば、セル名やシート名で指定できます。
IE、ブラウザ内ではどうすればいいのでしょうか。

実は、ブラウザ内にも名前がついています。
目に見えませんが、IEでは、その部分を右クリックして[要素の検査]をすれば、中身が見れるのです。
この場合はyahoo!路線情報の[出発]のボックスを右クリックしてから選びましょう。

 

ex-it_14

 

IEの下になにやら表示されます。
これがHTMLというプログラムです。
さらに、ボックスを指定したまま再度[要素の検査]を選びましょう。

ex-it_15

 

該当部分のプログラムが出てきます。
このうち、id=”sfrom”に注目し、このsfrormをExcelマクロで指定するのdす。

ex-it_16

 

Excelからの読込

 

Excelファイルはこうなっていますので、2行目の出発駅(セルB2)を、sfromに入れていきます。

image

Excelマクロでは、
〇=△
で、
〇に△を入れる
という意味です。

IEのsfromに、ExcelのセルB2を入れる
ので、
IE.Document.getElementById(“sfrom”).Value = Range(“b2”).Value
と入れます。

IE.Document.getElementById(“sfrom”).Valueは、「IEのIDがsfromの値」という意味です。
id=”sfrom”をgetElementById(分割すると、get Element By ID)でとってきます。
ex-it_16

 

到着駅も同様に、
IE.Document.getElementById(“sto”).Value = Range(“c2”).Value
とします。

検索ボタンのクリック

次に検索ボタンをクリックしましょう。
こういった形式のものは、フォームと呼ばれています。

このフォームがどんな名前か、[要素の検査]で調べると、searchという名前がついていることがわかります。

検索ボタンは、submitです。
Excelマクロには、
IE.Document.forms(“search”).submit
と書きます。

Excelへの書込

Excelへは、E列に書き込んでいきます。
ひとまず、セルE2に書き込んでいきましょう。
image

こう書きます。

Range(“e2”).Value = Replace(IE.Document.getElementsByClassName(“fare”)(0).innerText, “円”, “”)

195円という交通費は、fareという名前がついています。

ただ、これは、IDではなく、classというものです。
IE.Document.getElementsByClassNameとします。
さらに、この場合、3つともとってきてしまうので(そういうものだと思っていただければ)、そのうちの1番上という意味で、
IE.Document.getElementsByClassName(“fare”)(0)
にしています。

プログラム上は、0、1、2、3・・・と数えるので、一番上は0なのです。

そして、このままだと、「195円」と、円がついてしまうので、replaceで、円を””(ブランク)に変えています。

以上をつなげたのがこのプログラムです。

Do While IE.Busy Or IE.ReadyState < 4
DoEvents
Loop
という部分を随時入れて、IEのページ読込を待っています。
そうしないと、プログラムが速すぎて、データを取り切れないことがあるからです。
(それでも不安定ですが)

Sub fare_search_IE0()


'IEの操作設定
    Dim IE As InternetExplorer
        
    Set IE = CreateObject("internetexplorer.application")
    
    IE.Visible = True
    
'サイトを開く
    IE.Navigate "transit.yahoo.co.jp"
    
'IE読込待ち
    Do While IE.Busy Or IE.ReadyState < 4
        DoEvents
    Loop
    
'Excelから出発駅入力
    IE.Document.getElementById("sfrom").Value = Range("b2").Value
    
'Excelから到着駅入力
    IE.Document.getElementById("sto").Value = Range("c2").Value
    
'検索
    IE.Document.forms("search").submit
    
    
'IE読込待ち
    Do While IE.Busy Or IE.ReadyState < 4
        DoEvents
    Loop
    

'検索結果をExcelへ書きこむ&「円」を消す
    Range("e2").Value = Replace(IE.Document.getElementsByClassName("fare")(0).innerText, "円", "")
    
    
End Sub

 

さらには、
For i = 2 To Range(“a” & Rows.Count).End(xlUp).Row
(2行目からデータの最後まで繰り返す)

Next

ではさんで、セルの部分を2→iに変えると、シートにあるデータの数だけ、「読取→検索→書込)を繰り返します。

Sub fare_search_IE()


'IEの操作設定
    Dim IE As InternetExplorer
        
    Set IE = CreateObject("internetexplorer.application")
    
    IE.Visible = True
    
    Dim i As Long
    For i = 2 To Range("a" & Rows.Count).End(xlUp).Row
    'サイトを開く
        IE.Navigate "transit.yahoo.co.jp"
        
    'IE読込待ち
        Do While IE.Busy Or IE.ReadyState < 4
            DoEvents
        Loop
        
    'Excelから出発駅入力
        IE.Document.getElementById("sfrom").Value = Range("b" & i).Value
        
    'Excelから到着駅入力
        IE.Document.getElementById("sto").Value = Range("c" & i).Value
        
    '検索
        IE.Document.forms("search").submit
        
        
    'IE読込待ち
        Do While IE.Busy Or IE.ReadyState < 4
            DoEvents
        Loop
        
    
    '検索結果をExcelへ書きこむ&「円」を消す
        Range("e" & i).Value = Replace(IE.Document.getElementsByClassName("fare")(0).innerText, "円", "")
    Next
    
    IE.Quit
    
End Sub

RPAとの比較

 

「Excelでブラウザを操作する」
というと、RPAでもできます。
これらを比較すると、RPAのほうは、ブラウザの操作を記録して動かすことができるので、やはり敷居は低いといえるでしょう。
ex-it_18

他のアプリも操作しやすいです。
プログラムを書く量も、RPAは少なくて済みます。
とはいえ、RPAもプログラミングの知識は必要なので(繰り返し、変数など)、RPAからプログラミングに慣れて、Excelマクロをやってみるのもいいでしょうね。

UiPath×Excel。Excelデータを読み取り、ブラウザで交通費検索。無料で使えるRPAツール。 | EX-IT

 

PythonでExcelからデータ読込→サイトで交通費検索→Excelへデータ書込 | EX-IT

 

サンプルはこちらです。

EX-ITサンプル 交通費検索IE.xlsm

 


■編集後記

昨日は、Excel本の原稿を提出しつつ打ち合わせ。
11月に出せそうです。

その後、RPA入門セミナーを開催しました。

■昨日の1日1新
※詳細は→「1日1新」

Excel本 原稿渡し
どぶろくハイボール

■昨日の娘日記
体のパーツを指さしながら言うのが好きなようです。
おめめ、くち、はな、みみ、おしり、あしを覚えました。