自動連続読み込み
さて先週の方法では直近50日分しか読み込むことができません。Yahoo!には1991年1月4日からのデータがあるのです、それを50日分ずつ読み込むにはまず「 年 月 日から」を「1991年1月4日から」と書いて「表示」ボタンを押します。そして表示されたデータをコピーしてエクセルに張り付けてから「次の50件」を押して50日分表示してコピーしてエクセルに張り付ける、ということを何十回も繰り返さなければならず大変です。そこでこの作業をVBAを使って自動化しようと思います。
作業の流れ
- 読み込むためのページはどれか。URL(インターネットのアドレス)を知る。
- そのアドレスで表示される表を、エクセルのシートに順番に貼り付ける。
アドレスの規則性
まず、インターネットのどのアドレスからこのデータを読み込んでいるのかを見ましょう。「1991年1月4日から」と書いて「表示」ボタンを押したときにはこのアドレスから読み込んでいます。
「次の50件」を押したときにはこのアドレスから読み込んでいます。
二つのアドレスを見比べて、規則性を読み取りましょう。
http://table.yahoo.co.jp/t?c=1991&a=1&b=4&f=2008&d=4&e=23&g=d&s=998405.t&y=0&z=998405.t
http://table.yahoo.co.jp/t?s=998405.t&a=1&b=4&c=1991&d=4&e=23&f=2008&g=d&q=t&y=50&z=998405.t&x=.csv
http://table.yahoo.co.jp/t?までは共通です。その後に、
アルファベット一文字 = 数字か文字
が並んでいて、&で区切られています。
a | 「~から」の月 |
b | 「~から」の日 |
c | 「~から」の年 |
d | 「~までのデータ」の月 |
e | 「~までのデータ」の日 |
f | 「~までのデータ」の年 |
g | dはデイリーだと思われます |
q | 良く分かりませんが、最初のアドレスにはないので省いて大丈夫でしょう。 |
s | 998405.tはTOPIXのこと |
x | ファイルの形式でしょうか、最初のアドレスにはないので省いて大丈夫でしょう。 |
y | ここが二つのアドレスで違っているので重要です。 |
z | sと同じ |
以上より、おそらく
http://table.yahoo.co.jp/t?c=1991&a=1&b=4&g=d&s=998405.t&z=998405.t&y=0
http://table.yahoo.co.jp/t?c=1991&a=1&b=4&g=d&s=998405.t&z=998405.t&y=50
http://table.yahoo.co.jp/t?c=1991&a=1&b=4&g=d&s=998405.t&z=998405.t&y=100
でうまく行くと思われます。試してみてください。
プログラムで連続的に取得するには「マクロの記録」で保存したプログラムの
With ActiveSheet.QueryTables.Add(Connection:= _
から
End With
までを例えば
For i = 0 To 10
Next i
で囲って、
"URL;http://table.yahoo.co.jp/t?s=998405.t&g=d", Destination:=Range("$A$1"))
を
"URL;http://table.yahoo.co.jp/t?c=1991&a=1&b=4&g=d&s=998405.t&z=998405.t&y=" & i*50, Destination:=Range("$A$1"))
に書き換えることで、取得するページを順次変化させられます。
これでは同じ場所に重ねて読み込んでしまいますので、読み込む場所を順次下に下げましょう。
最初(i=0のとき)は1行目、次(i=1のとき)は51行下の52行目…ですのでi+50+1行目に読み込めば良いです。従って
Destination:=Range("$A$1"))
を
Destination:=Cells(i * 51 + 1, 1))
に書き換えてください。
0 件のコメント:
コメントを投稿