いつもの三流解説動画
【VBA IE操作】URLのパラメータを作りながら表を取り込む テスト 【三流君】 - YouTube
www.youtube.com
下記の質問をいただきました。
ヤフーファイナンスの信用買い残のデータを77表分ワークシートに取得するにはどういうコ
ードを書いたら良いか悩んでいます。
最初の表は取得出来るのですが、
下の数字や次へを自動的に押して取得する方法が上手く出来ません。
ご教授頂けると幸いです。
URLは、下記の通りです。
http://info.finance.yahoo.co.jp/ranking/?kd=15&tm=w&vl=a&mk=1&p=1
宜しくお願い致します。
急ぎかもしれないので、手抜きの回答を作成。
こんにちは。
コードを見ていないので、何とも言えませんが、
http://info.finance.yahoo.co.jp/ranking/?kd=15&tm=w&vl=a&mk=1&p=1 1ページ目
http://info.finance.yahoo.co.jp/ranking/?kd=15&tm=w&vl=a&mk=1&p=2 2ページ目
・
・
・
http://info.finance.yahoo.co.jp/ranking/?kd=15&tm=w&vl=a&mk=1&p=77 終了
なので、
&p=ページ の ループで読み込んで、エラーの判断いでいかなぁとおもったら
^^^^^^^^^^^^
http://info.finance.yahoo.co.jp/ranking/?kd=15&tm=w&vl=a&mk=1&p=88
など、範囲外の88ページを指定してもエラーが発生しないんですね
また、信用買い残なので、日によってページが違うので、
固定の77までじゃなくて、
次へ が あるかで 判断しないといけないのかなぁ・・・
案1
For p=1 to 999 までの適当なループを作成して、
'ページの作成
url = "http://info.finance.yahoo.co.jp/ranking/?kd=15&tm=w&vl=a&mk=1&p=" & trim(p)
と、pを可変にしてURLを作成していく。
ナビゲートでページ開く
表示待ち
表の取得
終わりの判断 次へが無かったら ループを抜ける
ここを、表の行数が見出しだけだったらの判断にしてみる。
Next
とか
3251~3300件/3818件中
など、文字列から、MAX77ページを判断するのもなんだか変だしなぁ。
お急ぎかもしれないので、穴の開いた 処理の提案を送ります。
ヒントになればいいのですが・・・
※そんなのわかっているよ、実際の処理を聞きたかったといわれそうですが・・・
で、作成してみました。
まずは、終了判断無しの固定ページで
1から4ページ取得してみた。
'URLのパラメータを作り、ループで回す Sub le_test20161103_複数ページテスト() 'IE起動 Dim objIE As Object 'IEオブジェクト参照用 Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作 る objIE.Visible = True '見えるようにする(お約束) 'PAGEのループを作る Dim page As Integer 'ページ番号 Dim strURL As String 'URLを組み立て用で使用 Dim yEXCEL As Integer 'セットする行番号 Dim x As Integer '列の管理 Dim y As Integer '行の管理 'まず、書き込み先シートに切り替え、データをクリアする Sheets("DATA").Select 'シートを切り替える Cells.Delete Shift:=xlUp 'シート全体を削除する Range("A2").Select '先頭A1を選択する、 yEXCEL = 1 'セット位置を一行目からにする 'ページ単位でループする For page = 1 To 4 'テストで一ページ目から四ページまでループ 'URLを組み立てる strURL = "http://info.finance.yahoo.co.jp/ranking/" 'ペース基本URLを代入 strURL = strURL & "?kd=15&tm=w&vl=a&mk=1&p=" & page 'パラメータを追加 URL作 成 '.Navigate で 作成したパラメーターのURLを開く objIE.Navigate strURL '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ル ープ Do While objIE.Busy = True DoEvents '特に何もしないで.Busyの状態が変わるまで待つ Loop Do While objIE.ReadyState <> 4 DoEvents '特に何もしないで.ReadyStateの状態が4に変わるまで待つ Loop '遊びで500縦にIE画面をスクロールさせる objIE.Document.Script.setTimeout "javascript:scrollTo(0,500);", 1000 '念のため1秒待つ・・・ Application.Wait (Now + TimeValue("0:00:01")) 'テーブルを探す 'タグの取出しが、.getElementsByTagName("TABLE")で 可能なので、 Dim objTABLE As Object 'TABLEの格納用 'TABLEタグを抜き先頭0番目のテーブルをセット Set objTABLE = objIE.Document.getElementsByTagName("TABLE")(0) '↑で代入したオブジェクトからテーブルデータを取り出す。 '表をDATAシートに書き出す 'Webの表をシートへ転記(代入する) For y = 0 To objTABLE.Rows.Length - 1 '行のループ For x = 0 To objTABLE.Rows(y).Cells.Length - 1 '列数分ループ ' objTABLE.rows(行).cells(列).innertext Cells(yEXCEL, x + 1) = objTABLE.Rows(y).Cells(x).innertext Next yEXCEL = yEXCEL + 1 'EXCELのセット位置も一行下にする Cells(yEXCEL, 1).Select '遊びでカーソル移動 DoEvents '一呼吸置く、カーソル描画のためかな Next Next '終了処理 objIE.Quit 'IEを閉じる Set objIE = Nothing '変数の後始末 End Sub
次に終了判断で、
'読み込んだ表が見出しだけの2行しかなかったらエラーループを抜ける
If objTABLE.Rows.Length <= 2 Then
の判断を入れてみた。
'URLのパラメータを作り、ループで回す 'テーブルの行数で終了を判断する Sub le_test20161103_複数ページ終了判断() 'IE起動 Dim objIE As Object 'IEオブジェクト参照用 Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作 る objIE.Visible = True '見えるようにする(お約束) 'PAGEのループを作る Dim page As Integer 'ページ番号 Dim strURL As String 'URLを組み立て用で使用 Dim yEXCEL As Integer 'セットする行番号 Dim x As Integer '列の管理 Dim y As Integer '行の管理 'まず、書き込み先シートに切り替え、データをクリアする Sheets("DATA").Select 'シートを切り替える Cells.Delete Shift:=xlUp 'シート全体を削除する Range("A2").Select '先頭A1を選択する、 yEXCEL = 1 'セット位置を一行目からにする 'ページ単位でループする For page = 75 To 999 'テストで75から999までループ 'URLを組み立てる strURL = "http://info.finance.yahoo.co.jp/ranking/" 'ペース基本URLを代入 strURL = strURL & "?kd=15&tm=w&vl=a&mk=1&p=" & page 'パラメータを追加 URL作 成 '.Navigate で 作成したパラメーターのURLを開く objIE.Navigate strURL '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ル ープ Do While objIE.Busy = True DoEvents '特に何もしないで.Busyの状態が変わるまで待つ Loop Do While objIE.ReadyState <> 4 DoEvents '特に何もしないで.ReadyStateの状態が4に変わるまで待つ Loop '遊びで500縦にIE画面をスクロールさせる objIE.Document.Script.setTimeout "javascript:scrollTo(0,500);", 1000 '念のため1秒待つ・・・ Application.Wait (Now + TimeValue("0:00:01")) 'テーブルを探す 'タグの取出しが、.getElementsByTagName("TABLE")で 可能なので、 Dim objTABLE As Object 'TABLEの格納用 'TABLEタグを抜き先頭0番目のテーブルをセット Set objTABLE = objIE.Document.getElementsByTagName("TABLE")(0) '↑で代入したオブジェクトからテーブルデータを取り出す。 '読み込んだ表が見出しだけの2行しかなかったらエラーループを抜ける If objTABLE.Rows.Length <= 2 Then Exit For 'ページのループを抜ける End If '表をDATAシートに書き出す 'Webの表をシートへ転記(代入する) For y = 0 To objTABLE.Rows.Length - 1 '行のループ For x = 0 To objTABLE.Rows(y).Cells.Length - 1 '列数分ループ ' objTABLE.rows(行).cells(列).innertext Cells(yEXCEL, x + 1) = objTABLE.Rows(y).Cells(x).innertext Next yEXCEL = yEXCEL + 1 'EXCELのセット位置も一行下にする Cells(yEXCEL, 1).Select '遊びでカーソル移動 DoEvents '一呼吸置く、カーソル描画のためかな Next Next '終了処理 objIE.Quit 'IEを閉じる Set objIE = Nothing '変数の後始末 End Sub
やっと完成??
'ヤフーファイナンスの信用買い残のデータ取得テスト Sub le_test20161103_ヤフーファイナンスの信用買い残() 'IE起動 Dim objIE As Object 'IEオブジェクト参照用 Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作 る objIE.Visible = True '見えるようにする(お約束) 'PAGEのループを作る Dim page As Integer 'ページ番号 Dim strURL As String 'URLを組み立て用で使用 Dim yEXCEL As Integer 'セットする行番号 Dim x As Integer '列の管理 Dim y As Integer '行の管理 'まず、書き込み先シートに切り替え、データをクリアする Sheets("DATA").Select 'シートを切り替える Cells.Delete Shift:=xlUp 'シート全体を削除する Range("A2").Select '先頭A1を選択する、 yEXCEL = 1 'セット位置を一行目からにする 'ページ単位でループする For page = 1 To 999 'テストで1から999までループ 'URLを組み立てる strURL = "http://info.finance.yahoo.co.jp/ranking/" 'ペース基本URLを代入 strURL = strURL & "?kd=15&tm=w&vl=a&mk=1&p=" & page 'パラメータを追加 URL作 成 '.Navigate で 作成したパラメーターのURLを開く objIE.Navigate strURL '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ル ープ Do While objIE.Busy = True DoEvents '特に何もしないで.Busyの状態が変わるまで待つ Loop Do While objIE.ReadyState <> 4 DoEvents '特に何もしないで.ReadyStateの状態が4に変わるまで待つ Loop '遊びで500縦にIE画面をスクロールさせる objIE.Document.Script.setTimeout "javascript:scrollTo(0,500);", 1000 '念のため3秒待つ・・・ Application.Wait (Now + TimeValue("0:00:03")) 'テーブルを探す 'タグの取出しが、.getElementsByTagName("TABLE")で 可能なので、 Dim objTABLE As Object 'TABLEの格納用 'TABLEタグを抜き先頭0番目のテーブルをセット Set objTABLE = objIE.Document.getElementsByTagName("TABLE")(0) '↑で代入したオブジェクトからテーブルデータを取り出す。 '読み込んだ表が見出しだけの2行しかなかったらエラーループを抜ける If objTABLE.Rows.Length <= 2 Then Exit For 'ページのループを抜ける End If '表をDATAシートに書き出す 'Webの表をシートへ転記(代入する) For y = 1 To objTABLE.Rows.Length - 1 '行のループ Y=1からで見出しを飛ばす For x = 0 To objTABLE.Rows(y).Cells.Length - 1 '列数分ループ ' objTABLE.rows(行).cells(列).innertext Cells(yEXCEL, x + 1) = objTABLE.Rows(y).Cells(x).innertext Next yEXCEL = yEXCEL + 1 'EXCELのセット位置も一行下にする Cells(yEXCEL, 1).Select '遊びでカーソル移動 DoEvents '一呼吸置く、カーソル描画のためかな Next '最後に見出し行が書かれているので、マイナス1で調整 yEXCEL = yEXCEL - 1 '次のEXCELのセット位置を小細工する Next '終了処理 objIE.Quit 'IEを閉じる Set objIE = Nothing '変数の後始末 End Sub
アレンジして、使ってみてください。
少しでも使えるヶ所があるといいなぁと思いつつ、失礼します。
三流プログラマー ken3
下記、冒頭と同じ解説動画です。
【VBA IE操作】URLのパラメータを作りながら表を取り込む テスト 【三流君】 - YouTube
www.youtube.com