data = .responseText
のステートメントで
「実行時エラー’-2147467259 (80004005)’
エラーを特定できません」
というVBのデバッグを促すダイアログが出ます。
responseTextの内容が、<システムエラー:-1072896658>となっている
のが原因だと思いますが、なぜresponseTextの内容がシステムエラー
になるのでしょう?
当然ieで直接開けるCSVのURLをコピーペーストしています。
---
Dim data As String
Dim req As Object
Set req = CreateObject(”Microsoft.xmlhttp”)
With req
Call .Open(”GET”, ”http://your_server/sample.csv”, True)
Call .send(vbNull)
If .readyState <> 4 Or .Status <> 200 Then
’ エラー処理
End If
data = .responseText
End With
まず、
参照設定で「Microsoft XML, v3.0」(msxml3.dll)を追加しましたか?
できれば、
Dim req As Object
ではなく、
Dim req As MSXML2.XMLHTTP
のように宣言した方が良いでしょう。
以上を修正したらエラーが消えました。
http://www.atmarkit.co.jp/fwcr/special/ajax01/01.html
@IT:古くて新しいAjaxの真実を見極める
肝心なところに気づいていませんでした。申し訳ありません。
Call .Open(”GET”, ”http://your_server/sample.csv”, True)
の、Trueの部分です。
Trueにすると非同期通信を行います。レスポンスが帰ってこなくても次の処理を行います。
そのため、Statusが取得できなかったと考えられます。
このTrueをFalseにすると同期通信を行いますので、レスポンスが帰ってくるまで待機することになるので、エラーはなくなるでしょう。
非同期通信を行いたいのであれば、エラー処理をしてやれば良いと思います。
(最近流行のAjaxの論理ですね。)
http://allabout.co.jp/career/javascript/closeup/CU20050615A/
Ajax Sync(同期)とAsync(非同期) - [JavaScript]All About
ご回答ありがとうございます。
その後、調べていて第3引数の意味がわかりました(ご指摘のとおりAsyncでした)。
ちなみに第4、5は認証が必要な場合のIDとPWDなんですね。(といいつつ、あるバージョンまでは不具合があるように記述してあるサイトもありました)
早速、試したところ、エラーが特定できないというメッセージは消えたものの、responseTextの内容が、<システムエラー:〜>である状態は変わりませんでした。
http://yamashita.dyndns.org/blog/222
開発中システムにAjaxを採用してレスポンス向上 — Weboo! Returns.
同期通信の件がかいけつできてよかったです
次の問題ですが、これは、サーバー側のcharsetの問題だと思います
例えば、
1. http://nifberry.727.net/test/hatena157.cgi
2. http://nifberry.727.net/test/hatena157a.cgi
3. http://nifberry.727.net/test/hatena157b.cgi
この3つのアドレスをURLに指定して実行してみてください
1はエラー
2は文字化けが発生
3は正常受信できると思います
これは、Content-Textの中身がそれぞれ
1. Content-Type: text/plain; charset=Windows-31J
2. Content-Type: text/plain
3. Content-Type: text/plain; charset=shift-jis
を返すようになっています(どれもIEでは見ることが出来ると思います)
1の場合は、MSXMLの知らないキャラセットが設定されたために判別できずにエラーとなります
2の場合は正常にデコードできませんが、場合によっては受信できるようです
3の場合はようやく正常に受信できるというわけです
サーバー側でキャラセットを返すように設定しないとダメ・・・という訳ですね
aki73ixさん、cgi設置ありがとうございます。
おっしゃるとおり、3で解決しました。
ホントにありがとうございます。
要はApache(Webサーバ)の設定ということですね。
ご指摘のdllは追加していませんでしたので、追加しました。
reqの宣言もご指摘のとおり変更しましたが、上手く動作しません。
どうも、
If .readyState <> 4 Or .Status <> 200 Then
の判定で「エラーを特定できません」と出力されるようです。
ちなみにreq.readyState=4、req.Status=200ですし、req.Statusは、デバッグウィンドウ(ローカル)では、statusですが、コードをいくら修正しても大文字に修正されてしまいます。
というのは関係あるのでしょうか?(=VBって大文字小文字の認識するのでしょうか?)