tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルVBA MSXML2.xmlHttp でエラー
記事No15397
投稿日: 2011/12/11(Sun) 17:46
投稿者たか
Excel2003のVBAでURLからHTMLを取得するプログラムを
作成しようと思っています。
しかし「xmlHttp.responseText」の部分で
「実行時エラー '-1072896658(c00ce56e)':」
「システムエラー:-1072896658」
のエラーが出てしまいます。
解決方法をご教授いただけないでしょうか?
'**************ソース**********************************
    Dim xmlHttp As MSXML2.xmlHttp
    Dim html    As String
    Dim url     As String    

    url = "" 'ここにURLを記述
    Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
    Call xmlHttp.Open("GET", url, False)
    Call xmlHttp.send(vbNull)
    html = xmlHttp.responseText
    
    Set xmlHttp = Nothing
'**************ソース**********************************

[ツリー表示へ]
タイトルRe: VBA MSXML2.xmlHttp でエラー
記事No15398
投稿日: 2011/12/12(Mon) 00:47
投稿者魔界の仮面弁士
>     url = "" 'ここにURLを記述
どのサイトでもエラーになりますか?

VBA 等からの MSXML や WinHTTP によるリクエストをブロックするタイプの
セキュリティソフトもあるようなので、その場合は、お使いのソフトで
除外設定が必要になるかも知れません。

>     Call xmlHttp.Open("GET", url, False)
>     Call xmlHttp.send(vbNull)
vbNull って、Long 型の「1」と同義ですよね。
何故そんな物を渡しているのでしょうか?

"GET" メソッドの実行時は、リクエスト ボディを含めないでください。

また、たとえそれ以外のメソッド(たとえば "POST")をリクエスト
する場合であっても、Send メソッドに渡すことができる型は
 ・文字列
 ・Byte配列
 ・IStream(XML DOMDocument 等)
に限られており、Long 値はサポートされていません。


>     html = xmlHttp.responseText
> 「実行時エラー '-1072896658(c00ce56e)':」
> 「システムエラー:-1072896658」

利用不可能なエンコードを呼び出した場合に、0xc00ce56e が出ることがあります。

そのサイトが返す文字コードは何でしょうか? responseText プロパティは、
基本的に UTF-8 で処理しようとします(BOM がついている場合には、
UCS-2、UCS-4 もサポートされます)。しかしそれ以外の文字コードの場合、
MSXMLのバージョンにもよっては、文字コード判定に失敗することがよくあります。
(そもそも、サーバー側が正しい Charset を返していないというケースもありますし)

そのため、非UTF-8 なサイトを対象とする場合には、responseBody プロパティから
バイト配列を得て、自分でデコードすることも視野に入れておいた方が良いでしょう。

[ツリー表示へ]
タイトルRe^2: VBA MSXML2.xmlHttp でエラー
記事No15399
投稿日: 2011/12/14(Wed) 00:30
投稿者たか
> >     url = "" 'ここにURLを記述
> どのサイトでもエラーになりますか?
⇒エラーになるサイトとエラーにならないサイトがあります


> >     Call xmlHttp.Open("GET", url, False)
> >     Call xmlHttp.send(vbNull)
> vbNull って、Long 型の「1」と同義ですよね。
> 何故そんな物を渡しているのでしょうか?
⇒参考にしたソースにそのような記述されており、意味もわからずに渡していました


> そのサイトが返す文字コードは何でしょうか? responseText プロパティは、
⇒エラーになるサイトはSHIFT-JISでした

>
> そのため、非UTF-8 なサイトを対象とする場合には、responseBody プロパティから
> バイト配列を得て、自分でデコードすることも視野に入れておいた方が良いでしょう。
⇒ありがとうございます。大変参考になりました。

[ツリー表示へ]
タイトルRe^3: VBA MSXML2.xmlHttp でエラー
記事No15400
投稿日: 2011/12/14(Wed) 06:42
投稿者魔界の仮面弁士
> > >     Call xmlHttp.Open("GET", url, False)
> > >     Call xmlHttp.send(vbNull)
> > vbNull って、Long 型の「1」と同義ですよね。
> > 何故そんな物を渡しているのでしょうか?
> ⇒参考にしたソースにそのような記述されており、意味もわからずに渡していました
恐らくそのソースは、C++ 等でいうところの「NULL」のつもりで
書いていたのかもしれませんね。この場合は引数指定なしで呼び出しましょう。

VB には、良く似たキーワードとして
 ・Null:データベースの null 値を表す Variant 値。
 ・Empty:初期値を表す Variant 値。
 ・vbNullChar:ASCII コード 0 を表す文字…ChrW(0)と同義。
 ・vbNullString:未初期化文字列、API に文字列の null pointer を渡す際に利用。
 ・vbNull:CLng(1) 相当の定数値。VarType関数に Null を渡した時に返される値。
 ・"":長さゼロの文字列。
などがあり、それぞれを正しく使い分ける必要があります。


> ⇒エラーになるサイトはSHIFT-JISでした
この場合は正確には、SHIFT-JIS ではなく Shift_JIS だったりします。
http://www.iana.org/assignments/character-sets

[ツリー表示へ]