我在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
答案 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")
早期绑定在类型库中预先查找,因此已经知道类型。
如果某些功能不存在,早期绑定将无法编译 - 因为它预先知道所有功能。后期绑定将通过编译,但在运行时会失败。
现在,