如何在Excel VBA中使用后期绑定进行跨版本兼容

我在Excel 2013中有这样的代码,但在Excel 2007中不起作用。主要的区别似乎是2007年的Microsoft Excel 12.0对象库vs Excel 2013中的15.0版本。

我将如何去使所有版本的Excel兼容? 我已经查看了所谓的“后期绑定”,但我不知道如何修改我的代码在这方面。

任何帮助表示赞赏。

代码如下:

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 

您的代码已经使用所有CreateObject(...语句的后期绑定

但是两台机器(一台运行Excel 2007,一台运行Excel 2013)之间的库版本可能会返回不同的types。 你可以用下面的代码来检查它:

 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版本之间兼容的方法和属性语句。

所以,后期绑定的工作方式是,当你声明它的时候你声明types为Object。

 Dim oSomething as Object 

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

 Set oSomeThing = CreateObject("SomeObject") 

早期绑定在types库中预先查找,所以已经知道types。

如果某个函数不存在,那么早期绑定将会导致编译失败,因为它知道所有的函数。 后期绑定会通过编译,但运行时会失败。

现在,

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

希望有所帮助,保罗