2008-04-24

Webからの自動取得

この講義で勉強するインターネットからのデータ読み込み法は、株式指数のデータだけでなく気象庁から気温など環境データを読み込むことにも使えます。でも先週、株式データを例に挙げたので今週もその続きをやります。

自動連続読み込み

さて先週の方法では直近50日分しか読み込むことができません。Yahoo!には1991年1月4日からのデータがあるのです、それを50日分ずつ読み込むにはまず「 年 月 日から」を「1991年1月4日から」と書いて「表示」ボタンを押します。そして表示されたデータをコピーしてエクセルに張り付けてから「次の50件」を押して50日分表示してコピーしてエクセルに張り付ける、ということを何十回も繰り返さなければならず大変です。

そこでこの作業をVBAを使って自動化しようと思います。

作業の流れ

  1. 読み込むためのページはどれか。URL(インターネットのアドレス)を知る。
  2. そのアドレスで表示される表を、エクセルのシートに順番に貼り付ける。

アドレスの規則性

まず、インターネットのどのアドレスからこのデータを読み込んでいるのかを見ましょう。
「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「~までのデータ」の年
gdはデイリーだと思われます
q良く分かりませんが、最初のアドレスにはないので省いて大丈夫でしょう。
s998405.tはTOPIXのこと
xファイルの形式でしょうか、最初のアドレスにはないので省いて大丈夫でしょう。
yここが二つのアドレスで違っているので重要です。
zsと同じ
yの数字が0から50に増えています。おそらくもう一度「次の50件」を押すとy=100になると思われます。またd,e,fにはデータの最後の日付を書くのでVBAで今日の日付を得て記入するようにしても良いのですが、省略すると規定値として最新のデータまでが得られるようです。

以上より、おそらく
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 件のコメント: