Yahoo!ファイナンスからランキング上位銘柄を取得する
VBAにはInternet Explorerを操作する機能がありますので、これを使ってYahoo!ファイナンスの値上がり率ランキング上位銘柄を取得してみたいと思います。
1.事前準備
VBEの「ツール」⇒「参照設定」から「Microsoft Internet Controls」にチェックを入れておきます。
これで、InternetExplorer型オブジェクトが宣言できるようになります。
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として持っておくことにします。
今日はここまで!