VBA IE制御 TABLE取得できません

このQ&Aのポイント
  • VBAを使用してWEBページからテーブルを取得するコードですが、「レース検索結果」のテーブルを取得できません。
  • コードを実行してもエラーは出ませんが、メッセージボックスが表示されず、ローカルウィンドウで確認したところ、「レース検索結果」が取得できていません。
  • WEBページのソースには「レース検索結果」のsummaryが存在しているのに取得できない理由が分かりません。
回答を見る
  • ベストアンサー

VBA IE制御 TABLE取得できません

以下のコードを使用し、WEBページから「レース検索結果」のテーブルを取得しようとしました。 エラーは出ないのですがコード下から5行目で「OK」のメッセージボックスが 表示されるはずなのですが表示されませんでした。 ローカルウィンドウで確認したところ、summary「レース検索結果」が取得できていませんでした。 WEBページのソースには「レース検索結果」というsummaryは存在しているんですが・・・ どなたかご教授ねがいます OS:Windows 7 Excel:2007 InternetExplorer:11 Sub test() Const strURL As String = "http://db.netkeiba.com/?pid=race_search_detail" Dim objIE As New InternetExplorer Dim objDoc As HTMLDocument Dim objAllInput As Object Dim objInput As HTMLInputButtonElement Dim objAllTable As Object Dim objTable As HTMLTable With objIE .navigate strURL .Visible = True End With Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop Set objDoc = objIE.document Set objAllInput = objDoc.getElementsByTagName("input") For Each objInput In objAllInput If objInput.ID = "check_Jyo_09" Then objInput.Checked = True Exit For End If Next Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop For Each objInput In objAllInput If objInput.Value = "検索" Then objInput.Click Exit For End If Next Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop Application.Wait (Now + TimeValue("00:00:10")) Set objDoc = objIE.document Set objAllTable = objDoc.getElementsByTagName("table") For Each objTable In objAllTable If objTable.Summary = "レース検索結果" Then MsgBox "OK" Exit For End If Next End Sub

  • cskw
  • お礼率68% (28/41)

質問者が選んだベストアンサー

  • ベストアンサー
  • Abyss1
  • ベストアンサー率100% (1/1)
回答No.2

こんにちは。 今回の場合、下記の手順 > Do While objIE.Busy = True Or objIE.readyState <> 4 > DoEvents > Loop でのDocument完全ロード確認は不十分です。 素直にIEイベントを使う事をお勧めします。 (NavigateComplete2とDocumentComplete) http://support.microsoft.com/kb/180366/ja 個人的にはHTMLTable取得が目的なら、WinHttpRequestオブジェクトを 利用するのがよい気がしますね。

cskw
質問者

お礼

Abyss1様 ご回答ありがとうございました。 IEでイベントが使用できることを初めて知りました。 クラスモジュールを使用した経験がほとんどありません。 今のところは安定して動作はしませんが、試行錯誤しながらでもやってみたいと思います。 改めて、ありがとうございます。

cskw
質問者

補足

Abyss様 ご回答ありがとうございます。 大変、勉強になります。 まずは検証してみたいと思いますのでお礼は改めてとさせていただきます。

その他の回答 (1)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

HTMLInputButtonElement型を使っているところなど、初めて見たので動かしてみましたが、当方の環境では問題なく動作しました。 Windows7Home-64bit、xl2010-32bit、IE11です。 正常終了以降、 With objTable For Each myRow In .Rows For Each myCell In myRow.Cells Debug.Print Application.WorksheetFunction.Clean(myCell.innerText); Debug.Print " "; Next myCell Debug.Print Next myRow End With てな感じで、データが取得できました。 開催日 開催 天気 R レース名 映像 距離 頭数 馬場 タイム ペース 勝ち馬 騎手 調教師 2着馬 3着馬 2014/06/22 3阪神6 雨 1 3歳未勝利 ダ1800 16 稍 1:53.7 38.2-37.7 ... なお、Dim objAllInput As Object のところはIHTMLElementCollection型だと動作しましたが、I無しだと後のFor Eachループのところで型違いとなりました。I有無の違いが良くというかさっぱり分かりません。 ご参考まで。

cskw
質問者

お礼

mitarashi様 検証して頂き誠にありがとうございます。 お礼が遅くなりまして申し訳ございません。 mitarashi様の環境では動作したとしますと当方の環境に問題があるのかもしれません。 このような現象は初めてで全く困惑しておる次第です。 改めてありがとうございます。

関連するQ&A

  • VBA、IE操作、初心者になります

    webページの操作についての質問になります。 VBAでやりたいことです。 (1)webページを開き、指定したソースが表示されるまで、画面を更新 (2)ソース表示がされたら、指定したボタンをクリック (3)画面が移行する (4)移行したページの指定したボタンをクリック 不具合 (2)ボタンクリック後、ページは移行するが(4)のボタンが押せません。 しかし(3)のページを直接指定して開いた後に(4)の動作を行うときちんとボタンクリックが出来ます。 順番に(1)→(2)→(3)→(4)と処理を行うと(4)のボタンが押せないという状況です。 こんな感じで作成しました。 Dim objIE As InternetExplorer ' Set objIE = CreateObject("Internetexplorer.Application") objIE.Visible = True Dim strUrl As String strUrl = "●●●●●●?sc_i=shp_pc_top_mdItemRanking_01" objIE.navigate strUrl Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE Loop (1)の処理 Do While (True) If (TypeName(objIE.document.getElementsByClassName("●●●●")(0)) <> "Empty") Then Set tmp = objIE.document.getElementsByClassName("●●●●") flag = False For Each t In tmp If (InStr(t.getAttribute("class"), "●●●●") > 0) Then t.Click flag = True Exit For End If Next End If If (flag = True) Then Exit Do Application.Wait [Now() + "0:00:00.5"] objIE.Refresh Do Loop Until (objIE.Busy = False) And (objIE.readyState = 4) Loop (3)の画面移行 (4)の処理 Set objINPUT = objIE.document.getElementsByTagName("INPUT")  For n = 0 To objINPUT.Length - 1 If InStr(objINPUT(n).Value, "●●●●") > 0 Then objINPUT(n).Click Exit For End If Next Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE Loop Set objINPUT = Nothing 以上になります。 お手数ですが、どなたかご教示をお願いいたします。

  • 【VBA】IEのリンクを新しいタブで開く

    VBAでIEを制御しリンク(アンカー)<a href="***">を新しいタブで開くようにしたいのですが可能でしょうか? 仮にグーグルのトップページ(http://www.google.co.jp/)の『検索オプション』(http://www.google.co.jp/advanced_search?hl=ja)を新しいタブで開くとします 実際に開きたいリンクのURLは固定ではないためURLの指定では開けませんが、飛びたいリンクの文言(『検索オプション』)は固定です リンクに飛ぶ前に飛ぶ先のURLを取得する仕方か、Shift+Ctrl+クリックのようにリンクを新しいタブで開く方法を教えてください 一度普通にリンクに飛んでからURLを取得し、戻ってから新しいタブで開くぐらいしかできないのでしょうか? Sub 新しいタブで開く() Dim objIE As Object Dim objShell Dim URL As String Set objShell = CreateObject("Shell.Application") For n = objShell.Windows.Count To 1 Step -1 Set objIE = objShell.Windows(n - 1) If Right(UCase(objIE.FullName), 12) = "IEXPLORE.EXE" Then objIE.Navigate "http://www.google.co.jp/" Exit For End If Next Set objShell = Nothing objIE.Visible = True Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop For Each Obj In objIE.Document.getElementsByTagName("a") If Obj.innerText = "検索オプション" Then Obj.Click Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop URL = objIE.Document.URL objIE.GoBack Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Navigate URL, CLng(&H800) Exit For End If Next End Sub よろしくお願いいたします

  • VBAによるIE操作について

    VBAでIEを操作し、PHPで開発されているMoodleというe-learningのサイトを操作しようと思っています。 概ね自分の思い通りに動くように作れたのですが、一点だけ問題が発生してしまいました。 (1)Submitのボタンを押して、(2)ページを読み込み待ち、(3)次のページのSubmitのボタンを押すという処理がうまく行きません。 エラーが出るのが、(3)のボタンを押したつもりになって、次の作業に行ってしまっていました。 (2)のページの読み込み待ちがうまく行かず、(3)のボタンを押したつもりになってしまい、次の作業でエラーを起こす、そんな次第です。 (2)のページの読み込みは下記の様に組んでます。 (4)の様に組んでも結果は一緒でした。 あとページが変わるまで、ボタンを押し続ける様に組むと、サーバーが落ちました。(ボタンが無くても押していることができるということだったので、試してみました。コードは残していなかった。) ちなみにボタンを押すコードは(5)です。 PHPの読み込みを待っていないとかそんな原因ではないかと思うのですが、解決できないでしょうか。 (2) Function IEwait(ByRef objIE As Object) Do While objIE.readystate <> 4 DoEvents Loop End Function (4) Do Until objIE.Busy = False WScript.sleep(250) Loop' (5) Public Function IEButtonClick(ByRef objIE As Object, buttonValue As String) Dim objInput As Object For Each objInput In objIE.document.getElementsByTagName("INPUT") If objInput.Value = buttonValue Then objInput.Click Exit Function End If Next End Function

  • vba ie操作 ボタンを押したい

    こんばんは。度々すいません。 またまたIE操作で詰んでしまいました。 以前、http://hiroba.chintai.net/qa7798169.htmlで質問してご回答いただいたのですが 違うサイトにも応用しようとしたところ、うまくいきませんでした。 https://www.jaccs.co.jp/icmclub/icm_login.htmlのログインボタンを押下したいのですが Sub test() Dim objIE As InternetExplorer Dim myObj As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.navigate "https://www.jaccs.co.jp/icmclub/icm_login.html" objIE.Visible = True Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop For Each myObj In objIE.document.forms(0).all If TypeName(myObj) = "HTMLInputElement" Then If myObj.alt = "ログイン" Then Debug.Print myObj.alt myObj.Click Exit For End If End If Next Set objIE = Nothing End Sub をするとエラーにもならないけどボタンも押せません。 でもmyObj.Clickは通過しているようです。 なぜボタンを押せないのでしょうか? ご教授よろしくお願いします。

  • VBAによるIE操作について

    VBAによるIE操作について WEBブラウザの表示が完了しているかを確認する方法で以下を利用しています。 While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Wend Set objDoc = objIE.Document Do Until objDoc.ReadyState = "complete": DoEvents: Loop これで完了するまで処理を待つのですが、たまにブラウザが読み込み状態で固まってしまうことがあります。 F5で更新すると再度読み込みを行い、処理が正常に戻るのですが、固まってしまった場合のプログラムでの対処法はないでしょうか? 10秒間ループし続けたらsendkeysでF5を押下するなど色々考えたんですが、うまく表現できません>< どなたか分かる方ご教授お願いします!

  • 無限ループ VBA IE操作

    VBAです。 とあるサイトで Sub IE_wait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.readyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub が無限ループに陥ります。 中断して Exit Sub を入れてみましたが、抜けれません。 ページは既に表示済みです。 なぜ無限ループが抜けられないのか、 なぜページが表示されているのにこのコードが繰り返されるのか 何かわかる方よろしくお願いします。

  • vba ie操作 検索後のタイトルが取得できない

    vba ie操作 ヤフーファイナンス 検索後のタイトルが取得できない win8、エクセル2010です。 ヤフーファイナンスで会社名を検索して、その後のコードを取得したいのですが その場合、タイトルに企業コードがあるので、その文字を取得しようとしたら、 検索前のページが取得されてしまいます。 ------------------------------------------------------------ Dim objIE As New InternetExplorer Sub test() Dim str企業名 As String Dim myObj As Object str企業名 = "ホテルオークラ" Set objIE = CreateObject("InternetExplorer.application") With objIE .navigate "http://finance.yahoo.co.jp/" .Top = 0 .Left = 0 .Width = 1000 .Visible = True End With Call IE_wait For Each myObj In objIE.document.all.tags("input") If myObj.ID = "searchText" Then myObj.Value = str企業名 Exit For End If Next For Each myObj In objIE.document.all.tags("input") If myObj.ID = "searchButton" Then myObj.Click Call IE_wait Exit For End If Next Debug.Print objIE.document.Title Set objIE = Nothing End Sub ----------------------- Sub IE_wait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.readyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub ------------------------------------------------------------ というコードなのですが 検索語の2ページ目は 「(株)京都ホテル【9723】:株式-株価 - Yahoo!ファイナンス」 というタイトルなのに 1ページ目と同じ 「Yahoo!ファイナンス - 株価やニュース、企業情報などを配信する投資・マネーの総合サイト」 が返ります。 なぜ次のページのタイトルが取得できないのでしょうか? 画面上IEブラウザには2ページ目が表示されています。

  • ie操作 ローカルパスだとエラーになる

    ヤフーなら問題なくコードが動くのに、URLがローカルのパスだと、エラーになってしまいます。 具体的には、 *********************************************************** Sub Sample1() Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.yahoo.co.jp/" objIE.Visible = True Do Until objIE.ReadyState = 4 Loop Do While objIE.Busy = True DoEvents Loop End Sub *********************************************************** だと、問題なく実行されるのに、 *********************************************************** Sub Sample2() strFName = MyDesktop & "\index.html" Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate strFName objIE.Visible = True Do Until objIE.ReadyState = 4 Loop Do While objIE.Busy = True DoEvents Loop End Sub ------------------------- Function MyDesktop() Dim WSH As Variant Set WSH = CreateObject("Wscript.Shell") MyDesktop = WSH.SpecialFolders("Desktop") Set WSH = Nothing End Function *********************************************************** だと、 Do Until objIE.ReadyState = 4 で オートメーションエラー 起動されたオブジェクトはクライアントから切断されました。 となります。 なぜローカルだと、エラーになるのでしょうか? 何が違うのでしょうか?

  • vba IE操作で こういう事ってできない?

    vba IE操作で こういう事ってできないのでしょうか? Dim objIE As InternetExplorer Sub test() Dim myObj As Object Dim myStr As String Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://employment.en-japan.com/search/search_list.cfm?area=23&startRow=1&m=1&job=100000" objIE.Visible = True Call iewait For Each myObj In objIE.Document.all.tags("a") If myObj.outerText = "詳細を見る" Then myObj.Click Call iewait Debug.Print objIE.LocationName objIE.GoBack Call iewait End If Next objIE.Quit Set objIE = Nothing End Sub Sub iewait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub このコードを実行して、 1ページ目の「詳細を見る」をクリックして、2ページ目のタイトルを抜き出し 1ページ目に戻り、次の「詳細を見る」をクリックして、2ページ目のタイトルを抜き出し・・・ と言う処理を繰り返したいのですが、 1回目のmyObj.Clickを通った後(Call iewaitの後かも?)に、 myObjの値が変数なしになってしまい、 2回目のIf myObj.outerText = "詳細を見る" Thenで 書き込みできません。(Error 70) になります。 1ページ目のリンクをクリックして、戻って また1ページ目のリンクをクリックして・・・ と言う処理をしたい場合どうすればよろしいでしょうか?

  • オブジェクト変数または With ブロック変数が設定されていません。

    下記の様に組みましたが、下記の★印の所で止まる様な事があります。 毎回止まるわけではないのですが、止まる時に「オブジェクト変数または With ブロック変数が設定されていません。」と表示されますが、 原因は何か?どの様にすればいいのか?など詳しく教えてください。 よろしくお願いします。 Sub test() Dim objIE As Object Dim strCOMMENT As String Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://" While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop 'データをセットする 'htmlドキュメント フォーム(0番目) アイテムに転記(代入)する objIE.Document.forms(0).Item("username").Value = "11111" objIE.Document.forms(0).Item("password").Value = "11111" While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Document.all.subm.Click While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop For Each link In objIE.Document.Links If link.href = "http://" Then link.Click End If Next While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop 'タイトル・コメントの読み込み strtitle = Sheets("sheet1").Range("k7") strCOMMENT = Sheets("sheet1").Range("k9") Application.WindowState = xlMinimized While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Document.forms(0).Item("title").Value = strtitle objIE.Document.forms(0).Item("comment").Value = strCOMMENT While objIE.readystate <> 4 While objIE.busy = True DoEvents ' Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Document.all.submit.Click While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop 'フォーム(0番目)を .Submit(確認) する objIE.Document.forms(0).getElementsByTagName("input")(11).Click '←★この部分で止まる時があります。 While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop For Each link In objIE.Document.Links If link.href = "http://" Then link.Click End If Next While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 7, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Quit '.Quitで閉じる End Sub

専門家に質問してみよう