dポイントプレゼントキャンペーン実施中!

仕様
windows7
EXCEL2007

@ニフティで3300銘柄の株価を取得していたのですが、急に取得できなくなりました。
@ニフティ http://stocks.nifty.com/cgi-bin/quote/q?c=1301&h …

今までのコード

UrlWeb = URL & code(i + 1, 1) & "&h=3m"
With Xhtp
.Open "GET", UrlWeb, False
.send
With objstm
.Open
.Type = adTypeBinary
.write Xhtp.responsebody
.Position = 0
.Type = adTypeText
.Charset = "EUC-JP"
dthtml = objstm.readText()
.Close

Mystr1 = InStr(dthtml, "日付")
Mystr2 = InStr(Mystr1, dthtml, "表示期間")
dthtml = Mid$(dthtml, Mystr1, Mystr2 - Mystr1)
With Reg
.Global = True
.Pattern = ""
dthtml = .Replace(dthtml, "")
.Pattern = "<tr bgcolor=""#FFFFFF"">"
dthtml = .Replace(dthtml, "")
.Pattern = ">([^\S]*)<"
dthtml = .Replace(dthtml, "")
.Pattern = ">([^<>]*)<"
dat = .Execute(dthtml).Count
ReDim dat1(dat)

With .Execute(dthtml)
For j = 1 To dat - 1
dat1(j) = .Item(j).SubMatches(0)
Next j
End With
End With
End With
End With

今まではこれで問題なく取得できてました。

しかし、エラーが2種類出るようになりました。

1.出たり出なかったりの2147483638 (8000000a)この操作を完了するのに必要なデータは、まだ利用できません。

以前は一銘柄平均400ミリ秒ぐらいでした。最大650最少200ぐらい。(画像参照(1))

2-1.インデックスエラー(画像参照(2))
htmlのソースと異なった値を取得している。たぶん、3つ上の値を取得しているのだと思いますが。
実際は前日始値を当日出来高、前日高値を当日前日比率を取得しています。
こちらは、今のところ銘柄コード1308で出ます。その他は検証出来てません。

2-2.2-1を無視してマクロを続行させても
通常、配列数が406が正常に取得できる値なのですが
日付・終値・・などの項目名だけを取得し配列数が6になりエラーが出ることもあります。
(画像参照。dat1(1~6)の部分のみ取得で配列数が6になります)
このエラーに関してはYAHOO時系列&(http://japan.marketnewsline.com/market/historica …)でも出ます。

上記2-2は出たり出なかったりします。再起動してマクロを実行しても
同じ銘柄ではなく、ランダムにエラーが出ます。

なんとか修正したいのですが、どうしたらいいか分かりません。

解決策を教えて下さい。

「VBA WEB株価取得」の質問画像

A 回答 (2件)

WithステートメントのくくりとReplaceメソッドには改善の余地があるものの


コード自体は問題があるようには思えません。
もし私だったら、と考えると、
原因の究明と対策に注力するよりも
もう少し安定して取得できるサイトに切り替えるような気がします。
浅く試しただけですけど、http://japan.marketnewsline.com/のほうが堅そうな感じです。
あるいはWebBrowserを使う手法を試してみたりとか。
(サイト仕様上の問題だったら同じ結果かも)

#3300銘柄というのは想像つきませんが
#効率考えるとXMLHTTPオブジェクトは捨てがたいですね。
#普段から株やってるわけではないのであくまで参考意見として。
    • good
    • 0

1、2-2のエラーについてはサイトの状態によるのではないでしょうか。


エラー時には手動でも時系列データが表示されないようです。
何かのタイミングの所為なのか、アクセス過多の対策なのかは定かではありませんが。
(深く突っ込んで検証してないです)

2-1については銘柄コード1308でも確認できません。確実な再現性がありますか?

この回答への補足

どうもありがとうございます。
やはり、サイトの状態によるのですね。
今は取得出来たり出来なかったりが続いています。

2-1については、確実な再現ができません。
取得できる状態の時に試してみましたが、前回のようなエラーが出ませんでした。
一時的とはいえ、エラーが出た以上は気になります。

サイトによってはアクセス過多の対策などされるんでしょうね。

if dat1() = などで6なら5秒ほどおき、再度取得を試みましたが駄目ですね。

どういうきっかけでなってるのか分かれば対策も考えられるのですが・・・

補足日時:2011/03/24 00:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!