如何在excel VBA中使用后期绑定来实现交叉版本兼容性

时间:2017-02-04 18:52:58

标签: excel vba excel-vba

我在excel 2013中获得了此代码,但它在excel 2007中不起作用。主要区别在于2007年的Microsoft Excel 12.0对象库与excel 2013中的15.0版本。

如何在所有版本的Excel中兼容?我已经研究过什么叫做#34;后期绑定"但是我不确定如何在这方面修改我的代码。

感谢任何帮助。

以下是代码:

Option Explicit

Sub ImportHistoricalDataSheet()

    Const SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS = 13056
    Const adSaveCreateOverWrite = 2

    Dim aBody, sPath

    ' Download Historical Data xls file via XHR
    With CreateObject("MSXML2.XMLHTTP")
    'With CreateObject("MSXML2.ServerXMLHTTP")
        '.SetOption 2, SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
        .Open "GET", "http://www.housepriceindex.ca/Excel2.aspx?langue=EN&mail=abc%40abc.com"
        .Send
        ' Get binary response content
        aBody = .responseBody
        ' Retrieve filename from headers and concatenate full path
        sPath = ThisWorkbook.Path & "\" & Replace(Split(Split(.GetAllResponseHeaders, "filename=", 2)(1), vbCrLf, 2)(0), "/", "-")
    End With
    ' Save binary content to the xls file
    With CreateObject("ADODB.Stream")
        .Type = 1
        .Open
        .Write aBody
        .SaveToFile sPath, adSaveCreateOverWrite
        .Close
    End With
    ' Open saved workbook
    With Workbooks.Open(sPath, , True)
        ' Get 1st worksheet values to array
        aBody = .Worksheets(1).UsedRange.Value
        .Saved = True
        .Close
    End With
    ' Delete saved workbook file
    CreateObject("Scripting.FileSystemObject").DeleteFile sPath, True
    ' Insert array to target worksheet
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1).Resize(UBound(aBody, 1), UBound(aBody, 2)).Value = aBody

End Sub

2 个答案:

答案 0 :(得分:3)

您的代码已将后期绑定与所有CreateObject(...语句一起使用。

但两台机器之间的库版本(一台运行Excel 2007,一台运行Excel 2013)可能会返回不同类型。您可以使用以下代码进行检查:

Option Explicit

Sub TestXMLHTTPType()

    Dim objXhr As Object

    Set objXhr = CreateObject("MSXML2.XMLHTTP")

    'check what you got
    Debug.Print TypeName(objXhr)

    Set objXhr = Nothing

End Sub

两台机器上的输出是否相同?此信息将允许您编写Excel版本之间兼容的方法和属性语句。

答案 1 :(得分:2)

因此,如果声明,您将该类型声明为对象。

Dim oSomething as Object

实例化对象时,使用专用于此绑定的特定接口(IDispatch),在运行时查找这些函数。这就是为什么它叫做后期绑定。您使用CreateObject来实例化对象。

Set oSomeThing = CreateObject("SomeObject")

早期绑定在类型库中预先查找,因此已经知道类型。

如果某些功能不存在,早期绑定将无法编译 - 因为它预先知道所有功能。后期绑定将通过编译,但在运行时会失败。

现在,

  1. 我会尽可能使用早期绑定。然后编译看你是否 得到任何错误。
  2. 然后我会打开旧版本的Excel并再次编译,看看是否有任何编译错误。
  3. 如果没有错误,你不应该这样做,你需要在调试中运行应用程序,以找到发生故障的确切行并从那里获取。