1

なぜこのような奇妙な振る舞いをするのか理解できません! htmlfile オブジェクトを作成して割り当てると、関数は空のオブジェクト (「何もない」) を返し、コードを行ごとに実行すると、F8 キーを押して次の行を実行しなくても自動的に実行されます...エラーは発生しません。何が起こっているのかについてのアイデアはありますか?

奇妙な動作が始まる行:Set htmlObj = CreateObject("HTMLFILE")

Public Function XMLHTTP_Request(Method As String, URL As String, Optional PostData As String, Optional StrCookie As String) As HTMLDocument

Dim oXMLHTTP As Object, htmlObj as object
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open Method, URL, False
oXMLHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oXMLHTTP.setRequestHeader "Cookies", StrCookie

On Error GoTo ErrorHandler
oXMLHTTP.send (PostData)
On Error GoTo 0

While oXMLHTTP.ReadyState <> 4: DoEvents: Wend
While oXMLHTTP.Status <> 200: DoEvents: Wend

Set htmlObj = CreateObject("HTMLFILE")

htmlObj.body.innerHTML = oXMLHTTP.responseText
Set XMLHTTP_Request = htmlObj

End Function
4

1 に答える 1

1

関数を繰り返し呼び出すと、CreateObject 関数が複数回呼び出されます。oXMLHTTP および htmlObj オブジェクト変数を静的にするか、ライブラリ参照を含めて、変数宣言を Early Binding に変更することができます。

アーリー バインディングでは、VBE の [ツール] ► [参照] コマンドを使用して、次の既定以外のライブラリ参照を追加する必要があります。

  • Microsoft HTML オブジェクト ライブラリ
  • Microsoft インターネット コントロール
  • Microsoft XML 6.0 (お使いのバージョンは若干異なる場合があります)。

Module1 コード シート:

Option Explicit

Sub main()
    Debug.Print Left(XMLHTTP_Request("http//example.com").body.innerText, 512)
End Sub

Public Function XMLHTTP_Request(URL As String, _
                                Optional Method As String = "POST", _
                                Optional PostData As String = "", _
                                Optional StrCookie As String = "") As HTMLDocument
    Dim oXMLHTTP As New MSXML2.XMLHTTP60
    Dim htmlObj As New HTMLDocument

    oXMLHTTP.Open Method, URL, False
    oXMLHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    oXMLHTTP.setRequestHeader "Cookies", StrCookie

    oXMLHTTP.send PostData

    If oXMLHTTP.Status <> 200 Then Exit Function

    htmlObj.body.innerHTML = oXMLHTTP.responseText

    Set XMLHTTP_Request = htmlObj

End Function

サブ プロシージャを実行main()すると、Web ページのテキストの最初の 512 文字がイミディエイト ウィンドウ ([Ctrl]+G) に出力されます。

于 2016-07-29T17:52:32.703 に答える