忍者ブログ

EXCEL VBAで あくせく

Yahooファイナンスから株価詳細情報を取得

 Yahooファイナンスは、リアルタイムで株価情報を更新しており、
この情報を外部に無料で配信するサービスを行っています。
自分のパソコンからEXCELシートを開いて、EXCEL VBAを起動して
Yahooに接続すれば、リアルタイムの株価情報を取得する事ができます。
Yahooファイナンスのページは、リアルタイム情報を表示する「詳細情報」の
ページと、前日までの情報を表示する「時系列」情報ページがあります。
「詳細情報」のページは、東証の株価情報を1分以内の遅れで表示しており
このデータを元にして、PERやPBRなどのデータも変化しています。
VBAでYahooファイナンスから情報を取得するための記述は、
下記の様になります
EXCELシートに追加したコマンドボタン1に、Yahooファイナンスから
情報収集する処理を割り付けています。



Private Sub CommandButton1_Click()
On Error GoTo ErrorTrap
Dim oHttp      As Object
Dim strURI     As String
Dim strText    As String
Dim cmpText    As String
Dim syCode     As String
Dim wRow       As Integer
Dim matubi     As Integer

Application.Cursor = xlWait                   
Set oHttp = CreateObject("MSXML2.XMLHTTP")    
matubi = Cells(Rows.Count, 4).End(xlUp).Row   
   wRow = 6
Do Until wRow > matubi
  If (Cells(wRow, 4) >= 1000 And Cells(wRow, 4) <= 9999) Or Cells(wRow, 4) = 998407 Or  Cells(wRow, 4) = 998405 Then
  With oHttp
    strURI = "https://stocks.finance.yahoo.co.jp/stocks/detail/?code=" & Cells(wRow, 4)
        .Open "GET", strURI, False
        .setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
        .send
     syCode = GetText(.responsetext, "【", "】")
     cmpText = GetText(.responsetext, "contents-body", "contents-footer")
  End With

  --- cmpTextから株価データの抜き取り処理。--- 

   End If
           wRow = wRow + 1
Loop
    Application.Cursor = xlDefault
    Set oHttp = Nothing       
  End sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Public Function GetText(prmAllText As String, prmStrText, prmEndText)
    Dim wStrNo      As Long
    Dim wEndNo      As Long
    wStrNo = InStr(1, prmAllText, prmStrText) + Len(prmStrText)
    wEndNo = InStr(wStrNo, prmAllText, prmEndText)
    GetText = Mid$(prmAllText, wStrNo, wEndNo - wStrNo)
End Function
-------------------------------------

ここでは、EXCEL表の6行目から証券コードの記入が始まっています。
Cells(wRow, 4)は、EXCEL表の4列目に、証券コードを記載している事を
示しています。
998407 ;日経平均株価
998405 ;TOPIX
GetText Fanctionで、Yahooから受取った該当証券コード情報の内、
.responsetext内の<Title>~</title>行にある【】に挟まれた証券コードを
抜き取っています。
Yahooファイナンスの各銘柄データは、1銘柄毎の全体量が100Kbぐらい あり
ますので、非力なEXcelの関数で100Kbを1バイト単位に比較して株価データを
抜き取るには、銘柄数が1000件のもなれば処理時間が長くなってきます。
ここでは、受取ったHTMLデータの個別銘柄情報のすぐ前にある
<contents-body>のタグから、信用取引情報の後ろの<contents-footer>タグ
までの間を切り取って、比較用の cmpTextを作成しています。
抜き取り後のデータ量は、35Kb程度になりました。

 Yahooファイナンスからリアルタイム情報を取得する場合は、下記の1行を指定
 しないと、最新情報が得られません。この.setRequestHeaderの1行を指定しな
 いとサーバーに蓄積された古い情報をもってくる様です。
  Yahooは、AM8:00~AM9:00の間は、株価データのサービスを行っていない
 ため、各項目の欄に"---"が入っておりデータがありません。
 銘柄によっては、AM8:00~AM9:00の間の データが、サーバに残っている場合
 があります。この時間帯のデータを持ってきた場合には、データに抜けがでる
 事になります。

 .setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"



2017.4.01 Yahooファイナンスの仕様変更により情報収集ができなくなったので修正。接続先URLの変更。
2014.6.11 Yafooファイナンスの仕様変更により、全情報が収集できなくなったため修正。

2014.5.21 Yahooファイナンスの仕様変更により、「市場」情報が収集できなくなったので抜き取りタグの位置を変更。

拍手[6回]

PR