三流君のソースコード置き場

三流プログラマーが作成したコードが置いてあります。ブログに過去のソースコードをアップして、ブログの検索機能で利用してます(利用予定です)※古くさいコードが多いです・・・

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
(※詳細は[三流君 三流プログラマーとは?]を見てください)


広告:


[記事一覧、バックナンバーを見る]

VBA IE操作 ヤフーファイナンスの信用買い残 の 取得にチャレンジしてみた

いつもの三流解説動画
【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



三流君へ メッセージを送る

全ての質問に答えることはできませんが、
ダメもとで、気軽に質問、感想、メッセージを送ってくださいね・・・

感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)
例:[XXXXさんへ回答例]←みたいに回答していたり...


Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。
・[Excel/Access VBA]の解説
・[ASP(Active Server Pages)]の解説。
・[元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
・[プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
三流君を踏み台にする
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。

三流解説動画の再生リスト
https://www.youtube.com/user/ken3video/playlists

本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)