Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 97)
IE制御でのgetElementByIdについて教えてください。
投稿日時: 19/01/02 16:04:58
投稿者: kin1964

お世話になります。
高速バスサイト(https://www.kousokubus.net/BusRsv/ja/)の予約を自動化できるようVBAを考えていますが、なにぶん初心者なもので、行き詰っております。基本的な質問で申し訳ないですが、ご教示をお願いいたします。
操作は、指定の箇所をクリックするだけですので、クリックする箇所のIDを取得すれば、良いと考えました。
とりあえず、書籍等を見ながら、以下のコードを書きました。
マクロ操作の手順 出発地クリック → 関東クリック → 東京クリック(ここでオブジェクトが必要とエラー)
 
Sub SearchIE3()
Dim win As Object
Dim strTemp As String
Dim objIE As Object
Dim label1 As HTMLLabelElement
Dim li1 As HTMLLIElement
  
    Set colSh = CreateObject("Shell.Application")
    
    For Each win In colSh.Windows
        strTemp = ""
        On Error Resume Next
            strTemp = win.document.Title
        On Error GoTo 0
        If InStr(strTemp, "高速バスネット:全国の高速バス・夜行・深夜バス予約") > 0 Then
            Set objIE = win
            Exit For
        End If
    Next
     
    Set label1 = objIE.document.getElementById("departure")
    label1.Click '出発地ラベルのIDを取得してクリック
    
    Set li1 = objIE.document.getElementById("depAreaCd3")
    li1.Click '関東のIDを選択クリック
     
    Set li1 = objIE.document.getElementById("u8kx7p-acc-menu-link") 
  '東京を選択したいのですが、オブジェクトが必要とエラーになります。
  li1.Click
 End Sub
 
要素の検査で確認すると以下のようになっております。
<li class="is-accordion-submenu-parent" id="u8kx7p-acc-menu-link" role="menuitem" aria-expanded="false" aria-haspopup="true" aria-controls="l269yv-acc-menu" aria-label="東京">
 
<a class="prefectures-name js-pref" href="#" value="13">東京</a>
 
<ul class="menu vertical nested bus-stop-area-list submenu is-accordion-submenu" id="l269yv-acc-menu" role="menu" aria-hidden="true" aria-multiselectable="true" aria-labelledby="u8kx7p-acc-menu-link" style="display: none;" data-accordion-menu="q5z9m2-accordion-menu" data-submenu=""></ul>
</li>
 
 
 
 
                                                          

回答
投稿日時: 19/01/02 17:59:27
投稿者: WinArrow
投稿者のウェブサイトに移動

質問に対する回答ではありません。
 
個人的に感想です。
 
この処理は、会社の仕事として、行うものでしょうか?
 
外部サイトの情報を活用することには、限界があることを想定すべきと思います。
 
まず、外部サイトのデザインは、当該サイトの都合で変更がありうるということです。
 
ひょっとすると、(ひょっとしなくても)URLも変わる可能性もあります。
 
そのような場合、タイムリーに追従できるできるかということです。
今まで便利に使えていたツールが、ある日突然変わったり、そのURLがなくなったりした場合、
担当者はパニックに陥ります。
 
水を差すようで申し訳ないが、
そのようなリスクを覚悟して取り組むべき・・・と思います。
 

回答
投稿日時: 19/01/02 20:20:30
投稿者: simple

こんばんは。
 

<a class="prefectures-name js-pref" href="#" value="13">東京</a> 

が操作対象でしょう。
 
そうすると、class名で抽出して、InnerTextで判定するなどということが思いつきます。
例えば、下記のような感じです。
     Dim a
     For Each a In objIE.Document.getElementsByClassName("prefectures-name js-pref")
        If a.innerText = "東京" Then
            a.Click
            Exit For
        End If
     Next

なお、IE操作に関して、有名なサイトがあります。
↓こちらをひととおり学習されるとよいと思います。
http://www.ken3.org/cgi-bin/group/vba_ie.asp
 
まだ途中でしょうが、その先の疑問については、
そのサイトに直接質問されるとよいかもしれませんね。

投稿日時: 19/01/02 22:24:06
投稿者: kin1964

お世話になります。
WinArrowさん 
この件は、仕事とは、関係のない、個人的な思いで取り組んでおります。アドバイス有難うございます。
 
simpleさん
アドバイス有難うございます。ご教示頂いたコードで上手くできました。
なんとなくですが、classコレクションの場合、この様にする必要があることが判りました。
紹介して頂いたサイト:三流君で勉強します。
有難うございました。