このページは
電車の交通費を一括で調べるVBAマクロの説明になります

エクセルでできることを動画にしてみました
この動画を見れば、VBAの可能性を理解できると思います

Originally tweeted by しょーい🍤エクセルで時短生活 (@showilog) on 2020年7月28日.

こんにちわ、しょーい(@showilog)です。
最近ツイッター上でVBAマクロの強者樣をたくさん拝見します。
世の中にはまだまだVBAのスキルが高い人がいっぱいですね!

そんな中、以前ツイッターで今までのマクロをまとめた内容を動画をつぶやきました。
ありがたいことに反応が多かったので、1つずつマクロの説明をしようと思います。

今回の内容は動画の30秒あたりからの内容です。

こちらのページを見ている方へ

交通費を一括で調べるマクロを公開してから、多くの方にチェックしていただいております。本当に有難うございます!

私がVBAのコードを無料で公開している理由は「大掛かりなシステムなんて入れなくても、勉強すればある程度は自作できる」という事実を多くの企業、経営者の方に知ってほしいという気持ちがあります。
※こう言うと、システム屋さんからは煙たがられてしまうかもしれません。

けどもこれは事実です。作り方次第によっては、自分たちが一番使いやすいカスタマイズもできるシステムが作れるんです!

ですから、とにかくコピペ!でVBAを使っている人は、是非もう一段階踏み込んでほしいと思っています!
今やネットでも無料でコードは溢れかえっていますが、本で体系的に勉強すれば確実に自分の力になります。

おすすめ書籍

Excel VBAのプログラミングのツボとコツがゼッタイにわかる本

私が一番最初に「これ読んで良かった!」と思った本です。
人生で一度もプログラミングに触れてこなかった人間なので、本当に初歩から勉強したい!と思ったときに見つけた本です。
必要以上のスキルはあえて教えてない!というスタンスが逆にわかりやすいので、VBAの第一歩には鉄板でおすすめです。

パーフェクト Excel VBA

もはや辞書と化しています。かなり本格的な事が書かれているので、ある程度スキルが上がってきたらこちらの本を参考書のように使いましょう!

スポンサーリンク

VBAコードはこちら

Sub 交通費自動()
    
    Dim driver As New Selenium.ChromeDriver
    Dim strValue As String
    Dim strValueAfter As String
    
    Dim intCnt As Integer
    Dim intDataCnt As Integer
    Dim intFee As Integer
    
    intDataCnt = Worksheets("交通費自動算出").Range("A1").End(xlDown).Row
    
    For intCnt = 2 To intDataCnt
    
    driver.Get Worksheets("交通費自動算出").Cells(intCnt, 6)
    
    strValue = driver.FindElementByXPath("//*[@id=""rsltlst""]/li[1]/dl/dd/ul/li[2]").Text
    
    strValueAfter = Replace(strValue, "円", "")
        
        Select Case Cells(intCnt, 4).Text
        
        Case "往復"
        intFee = Int(strValueAfter) * 2
        Case "片道"
        intFee = Int(strValueAfter)
        Case Else
        
        End Select
    
    Worksheets("交通費自動算出").Cells(intCnt, 5).Value = intFee
    Next
    
    driver.Close
    Set driver = Nothing
   
    MsgBox "完了しました"
End Sub

コードをコピペすれば使えるようにしています。
このままVBEに貼り付けて、シート上の設定もすれば問題ありません。

マクロのコードの説明

13行目 入力されている最終列を確認
15行目 シート上の6列目のURLを検索
17行目 Xpathで金額部分を変数に入れる
19行目 円がついているので数字のみに変換(後の倍処理の為)
21行目 往復の文字が入っている行のみ数字を倍処理
37行目 メッセージボックスが出たら完了

エクセルシート側の設定はこちら

【エクセル上入力すること】

シート名「交通費自動算出」に変更
A列 日付
B列 出発駅
C列 到着駅
D列 往復か片道か入れる(入れないとエラー)
E列 調べた金額がここに出ます
F列 これが重要。下の数式を入れておきます(コピペでOK)

=IF(B2="","",HYPERLINK("https://transit.yahoo.co.jp/search/result?&from="&ENCODEURL($B2)&"&to="&ENCODEURL($C2)&"&y="&TEXT(A2,"YYYY")&"&m="&TEXT(A2,"mm")&"&d="&TEXT(A2,"dd")&"&lb=1&type=1&ws=3&s=1&&fl=1&tl=3ticket=ic&expkind=1"))

解説

Seleniumを利用しています。
設定の仕方は他のサイトで詳しく説明されているので省きます
「セレニウム VBA」で調べればたくさん出てくると思うので問題ないかと。

今回のマクロ内容は、Yahooの乗り換え検索のURLを直接起動する仕様になってます。
A-C列の情報をF列の数式でエンコードして、URLに組み込んでいます。
ネットのどこかから拾ってきた内容です。先人に感謝ですね。

エクセル上の準備ができれば、コードをVBEに貼り付けて起動すればOKです

Seleniumを使っているので、内容自体はかなりシンプルです。
変数をもっとシンプルにしても良いと思いますので、改造はご自由に。

エクセル上のF列の数式を下に引っ張って上げれば、同時に何個でも検索できます。
その際はA列が入力されているかで判別しているので、
A列に何も入力しないと、計算対象になりません。

注意点

検索結果の最上段の数字のみをとってくるので
細かい乗り換え設定等はできません。概算で使うのがベストかなーと個人的には思います。

セレニウムのバージョンがあってないと起動できないので
都度更新してくださいね(当たり前ですが)

不明点等あれば、コメントかツイッターで指摘していただけると嬉しいです。
交通費を大量に調べる際にはめちゃ楽なので、ぜひ使ってみてください。

スポンサーリンク