[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Yahooファイナンスは、リアルタイムで株価情報を更新しており、
この情報を外部に無料で配信するサービスを行っています。
リアルタイム情報を表示する「詳細情報」のページと、
前日までの情報を表示する「時系列」情報ページがあります。
時系列情報のページからEXCEL VBAで情報を取得するための
記述を下記に示します。
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) Then
With oHttp
strURI = "https://finance.yahoo.co.jp/quote/" & 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, "<head>", "<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
-------------------------------------
時系列データの場合は、YahooファイナンスのURLが、"/quote/"
になっている事に気づいてください。
ここでは、EXCEL表の6行目から証券コードの記入が始まっています。
Cells(wRow, 4)は、EXCEL表の4列目に、証券コードを記載している事を示しています。
GetText Fanctionで、Yahooから受取った該当証券コード情報の内、
.responsetext内の<Title>~</title>行にある【】に挟まれた証券コードを
抜き取っています。
Yahooファイナンスの各銘柄データは、1銘柄毎の全体量が100Kbぐらい
ありますので、非力なEXcelの関数で100Kbを1バイト単位に比較して株価
データを抜き取るには、銘柄数が1000件のもなれば処理時間が長くなって
きます。 ここでは、受取ったHTMLデータの個別銘柄情報のすぐ前にある
<head>のタグから、信用取引情報の後ろの<footer>タグ
までの間を切り取って、比較用の cmpTextを作成しています。
抜き取り後のデータ量は、3Kb程度になりました。
Yahooファイナンスからリアルタイム情報を取得する場合は、下記の1行を指定
しないと、最新情報が得られません。この.setRequestHeaderの1行を指定しない
とサーバーに蓄積された古い情報をもってくる様です。
しかし、時系列データの場合は、そもそもが蓄積データのため、この1行は
コメントアウトしました。これをコメントアウトすると約15%程度収集速度が、
向上します。これは、負荷のかかっているリアルタイムサーバに最新データを
要求して応答が返ってくるまでの処理時間が無くなったからだと 思います。
コメントアウトした1行
.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
2021.04.25 Yahooファイナンスの仕様変更により情報収集が出来なくなったので修正。
998407 ;日経平均株価、998405 ;TOPIXはサービスがなくなったので収集できません。
2017.04.01 Yahooの仕様変更により情報収集ができなくなったので修正。
接続先URLの変更。