VBA(Excel)で以下の

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/11/13 13:15:04
  • 終了:--

回答(3件)

id:sohei No.1

sohei回答回数471ベストアンサー獲得回数62005/11/14 11:44:35

ポイント15pt

まず、

参照設定で「Microsoft XML, v3.0」(msxml3.dll)を追加しましたか?


できれば、

Dim req As Object

ではなく、

Dim req As MSXML2.XMLHTTP

のように宣言した方が良いでしょう。


以上を修正したらエラーが消えました。

id:P-mako

ご指摘のdllは追加していませんでしたので、追加しました。

reqの宣言もご指摘のとおり変更しましたが、上手く動作しません。

どうも、

If .readyState <> 4 Or .Status <> 200 Then

の判定で「エラーを特定できません」と出力されるようです。

ちなみにreq.readyState=4、req.Status=200ですし、req.Statusは、デバッグウィンドウ(ローカル)では、statusですが、コードをいくら修正しても大文字に修正されてしまいます。

というのは関係あるのでしょうか?(=VBって大文字小文字の認識するのでしょうか?)

2005/11/14 14:01:43
id:sohei No.2

sohei回答回数471ベストアンサー獲得回数62005/11/14 22:17:12

ポイント5pt

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

id:P-mako

ご回答ありがとうございます。

その後、調べていて第3引数の意味がわかりました(ご指摘のとおりAsyncでした)。

ちなみに第4、5は認証が必要な場合のIDとPWDなんですね。(といいつつ、あるバージョンまでは不具合があるように記述してあるサイトもありました)

早速、試したところ、エラーが特定できないというメッセージは消えたものの、responseTextの内容が、<システムエラー:〜>である状態は変わりませんでした。

2005/11/15 00:03:31
id:aki73ix No.3

aki73ix回答回数5224ベストアンサー獲得回数272005/11/15 13:12:57

ポイント50pt

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の場合はようやく正常に受信できるというわけです

サーバー側でキャラセットを返すように設定しないとダメ・・・という訳ですね

id:P-mako

aki73ixさん、cgi設置ありがとうございます。

おっしゃるとおり、3で解決しました。

ホントにありがとうございます。

要はApache(Webサーバ)の設定ということですね。

2005/11/16 03:03:00
  • id:P-mako
    可能であれば

    aki73ix さん、可能であれば3のcgiを公開していただければ
    非常にうれしいです。
  • id:aki73ix
    Re:可能であれば

    これと言って大したことはしてないですよ

    #!/usr/local/bin/perl
    #print ”HTTP/1.1 200 OK¥n”;
    print qq(Content-Type: text/plain; charset=shift-jis¥n¥n);
    print qq(てすと,DATA¥n);
    print qq(てすと,DATA¥n);
    print qq(てすと,DATA¥n);

    これだけです(^^;
  • id:P-mako
    Re(2):可能であれば

    >これと言って大したことはしてないですよ
    ありがとうございます。
    なるほど、ではCSVをサーバ側で読み込んでおいて、
    ヘッダ出力後にprintしていくんですね。

    文字コードは疑ったこともあって、CSVをSJISや
    UTF-8にしたり、改行コードをCRやCR+LF、LFなどに
    してもダメだったので、本当に今回は助かりました。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません