VBA - 后期绑定与早期绑定错误 - xml 响应的差异

VBA - Late Binding vs. Early Binding Error - Difference in xml responses

我写了一些代码来使用早期绑定从服务器获取响应(mbEARLY_BINDING_FSO = True

时的第一个语句
Option Explicit
Option Private Module


#Const mbEARLY_BINDING_FSO = False
Private Const msMODULE_NAME As String = "Controls"

Public Sub refresh_database()

Const sPROC_NAME As String = "refresh_database()"
If Not gbDEBUG Then On Error GoTo errExitLL

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'LOWER LEVEL PROCEDURE

'Comments: Refresh the database from call to app.longtrend.com/api/seach?map=tickers
'Agurments: None
'Dependencies: None
'Returns: JSON object of available companies listed to Company List sheet
'----------------------------------------------------------------------------------------------------------------------

Dim base_url As String
Dim successMsg As Variant
Dim Json As Object
Dim account_key As Variant
Dim dict_key As Variant
Dim item As Variant
Dim sheet_ticker As Worksheet
Dim lrow As Long
Dim lcol As Long
Dim rng As Range

#If mbEARLY_BINDING_FSO Then
    Dim xml_obj As MSXML2.XMLHTTP60
    Set xml_obj = New MSXML2.XMLHTTP60
#Else
    Dim xml_obj As Object
    Set xml_obj = CreateObject("MSXML2.XMLHTTP.6.0")
#End If

Set sheet_ticker = Sheets("Admin_Control")

       UserFormProgress.Display 5, False
       UserFormProgress.SetText "Checking stuff XX ..."
       Application.Wait Now + #12:00:01 AM#

base_url = "https://app.longtrend.com/api/search?map=tickers"

'Open a new get request using URL
xml_obj.Open bstrMethod:="GET", bstrURL:=base_url
xml_obj.send

'set up the object and parse the response
Set Json = JsonConverter.ParseJson(xml_obj.responseText)

' Status code router - 200 is Success, all else will print error in range("STATUS") and exit sub
If xml_obj.Status <> 200 Then
    With Range("STATUS")
        .Value = xml_obj.Status & ": " & Json("Error")
        .Font.Color = RGB(255, 143, 143)
    End With

    Application.ScreenUpdating = True
    End
End If

'Parse Json object
Dim i As Long
Dim key As Variant

i = rng.Row + 1
For Each key In Json
    sheet_ticker.Cells(i, rng.Column) = key
    sheet_ticker.Cells(i, rng.Column + 1) = Json(key)("name")
    sheet_ticker.Cells(i, rng.Column + 2) = Json(key)("sector")
    sheet_ticker.Cells(i, rng.Column + 3) = Json(key)("industry")
    sheet_ticker.Cells(i, rng.Column + 4) = Json(key)("marketCap")
    sheet_ticker.Cells(i, rng.Column + 5) = Json(key)("lastFY")
    i = i + 1
Next

Exit Sub
errExitLL:
       Application.ScreenUpdating = True
       ErrorHandling.LowLevel msMODULE_NAME, sPROC_NAME, "url", base_url, "last row", lrow

End Sub

通过早期绑定,我的 xml_obj 回复符合预期。 responseText 存储所有要在 JSON 转换器中解析的值。现在,在发布之前,我想设置为后期绑定。我已经创建了第二个语句中所示的对象,但是本地 window 中的 responseText 说:在调用发送方法之前无法调用此方法。 xml_obj 在此本地响应之前发送。

到目前为止我已经尝试了以下方法:

Set xml_obj = CreateObject("Microsoft.XMLHTTP")
Set xml_obj = CreateObject("MSXML2.XMLHTTP60")
Set xml_obj = CreateObject("MSXML2.XMLHTTP.6.0")
Set xml_obj = CreateObject("MSXML2.ServerXMLHTTP")

无果!当我尝试创建对象 CreateObject(XX) 并且没有可用的关联 ActiveX 时发生错误,或者如上所述,发送请求后响应请求不正确.我不确定我错过了什么,因为这应该足够简单 activity。非常感谢任何帮助。

运行 Windows(64 位,VBA7)

的 Office 365(内部版本 14228)

谢谢, 斯科特

如果你没有指定值,那么 Open(异步)的第三个参数默认为 True,所以你应该在那里传递 False

如果您运行异步,您的代码将不会等到响应完成。