Yahoo!ファイナンスからランキング上位銘柄を取得する

VBAにはInternet Explorerを操作する機能がありますので、これを使ってYahoo!ファイナンスの値上がり率ランキング上位銘柄を取得してみたいと思います。

1.事前準備

VBEの「ツール」⇒「参照設定」から「Microsoft Internet Controls」にチェックを入れておきます。
これで、InternetExplorer型オブジェクトが宣言できるようになります。

画像1


2.必要な部品を揃える

最初にInternetExplorer型オブジェクトObjIEを宣言しておきます。

Public ObjIE As New InternetExplorer


次に、ページが表示されるまで待機するFunctionを作っておきます。これは必須です!
どこからでもアクセスできるようにPublicで宣言しておくとしましょう。

Public Function 待機()
   'ページが完全に表示されるまで待機する
   Do While ObjIE.Busy = True Or ObjIE.ReadyState < READYSTATE_COMPLETE
       DoEvents
   Loop
   Application.Wait Now() + TimeValue("00:00:01")
End Sub

6行目は"1秒待つ"というコードですが、HTMLを表示した後にjavascript等で描画するタイプのページに対応させるためです。
回線速度やページの重さにもよりますが、1秒あれば大丈夫でしょう!
足りなければ後で調整するとします。


最後に、指定したページを表示するFunctionを作っておきます。

Public Function ページを表示(ByVal page_url As String, ByVal is_visible As Boolean) As Object
   ObjIE.Visible = is_visible
   ObjIE.Navigate page_url
   Call 待機
   Set ページを表示 = ObjIE.Document
End Function

引数には"page_url"と"is_visible"を用意します。"page_url"は表示したいURL、"is_visible"はIEの画面を表示させるかどうかです。
OBjIE.Nabigateで指定したURLに遷移したら、さっき作った待機Functionを呼び出して待機します。
戻り値にはページのDocumentを返します。

これで必要な部品は揃ったでしょう。

3.ランキング上位銘柄を取得する

早速ですがコードです。

Private Sub 値上がり率上位銘柄を厳選()
   '【条件】
   '  1. 値段が100円~999'  2. 午後は出来高が1,000,000以上
   
   'Yahoo!ファイナンスの値上がり率ランキング1ページ目のURL
   Const pageURL As String = "https://info.finance.yahoo.co.jp/ranking/?kd=1&tm=d&vl=a&mk=1&p=1"
       
   'ページのDocumentをstockRankDocにセット
   Dim stockRankDoc As Object
   Set stockRankDoc = ページを表示(pageURL, False)
   
   Dim rankNo As Long, lastRank As Long
   'ページに表示されている最後のランキング順位を取得
   lastRank = stockRankDoc.getElementsByClassName("rankingTable")(0).getElementsByTagName("tbody")(0).Children.Length
   
   Dim rowIndex As Long: rowIndex = 2
   'ランキング1位からページの最後の順位までループ
   For rankNo = 0 To lastRank - 1
       '銘柄コード、銘柄名、現在値、出来高を配列に格納
       Dim stockArray As Variant
       With stockRankDoc.getElementsByClassName("rankingTable")(0).getElementsByTagName("tbody")(0).Children(rankNo)
           stockArray = Array(.Children(1).innerText, .Children(3).innerText, .Children(5).innerText, .Children(8).innerText)
       End With
       
       '条件に合う銘柄かどうか判定
       Dim isOK As Boolean
       If Time < "12:00:00" Then
           If stockArray(2) >= 100 And stockArray(2) < 1000 Then
               isOK = True
           End If
       Else
           If stockArray(2) >= 100 And stockArray(2) < 1000 And stockArray(3) >= 1000000 Then
               isOK = True
           End If
       End If
       
       '条件に合った銘柄なら、シートに追加する
       If isOK Then
           StockSheet.Range(StockSheet.Cells(rowIndex, "A"), StockSheet.Cells(rowIndex, "D")) = stockArray
           rowIndex = rowIndex + 1
       End If
   Next rankNo
   
   'IEオブジェクトを閉じて破棄する
   ObjIE.Quit
   Set ObjIE = Nothing
End Sub

めんどくさいので細かい説明は省いてしまいますが、コメントを読むと大体の流れは理解できるかと思います。
これを実行すると、3秒ほどで情報がエクセルシートに書き込まれます。

取得結果

こんな感じです。これを実行したのが6月16日の午後なので、出来高が100万以上という条件もちゃんと満たしているのが分かります。

さて、Yahoo!ファイナンスから銘柄を取得することには成功しました。
実際にKabマシーンで使うときには、定期的にこのコードを走らせて、随時監視銘柄を追加していきます。
今回はテストなので、分かりやすいようにエクセルに書き出しましたが、実際に動かすときに毎回エクセルに書き込むのはかなり遅くなってしまうので、内部でDictionaryかCollectionとして持っておくことにします。

今日はここまで!



この記事が気に入ったらサポートをしてみませんか?