2014-05-05 68 views
4

以下宏工作正常。它打开IE的实例并使用“getelementsbyclassname”方法返回“my_rate”的期望值。但是,当我运行使用“MSXML2”方法的第二个宏时,宏在指定的行上失败,并且发生“运行时错误438:对象不支持此属性或方法”错误。为什么“Open IE”方法能够正常工作,但是“MSXML2”方法会因为我的代码而失败?我使用IE 11运行。我还为第二个宏设置了Microsoft HTML对象库的引用,但似乎没有什么区别。预先感谢您向我解释这一点。GetElementsbyClassname:打开IE与MSXML2方法

Sub BankRate_Rate_Retrieval() 
    my_url = "http://www.bankrate.com/funnel/mortgages/mortgage-results.aspx?market=321&loan=150000&perc=20&prods=2&points=0" 
    Set ie = CreateObject("InternetExplorer.Application") 

    With ie 
     .Visible = True 
     .Navigate my_url 
     .Top = 50 
     .Left = 530 
     .Height = 400 
     .Width = 400 
    End With 

    Do Until Not ie.Busy And ie.readyState = 4 
     DoEvents 
    Loop 

    my_rate = ie.Document.getelementsbyclassname("br-col-2 br-apr")(1).getElementsByTagName("div")(0).innertext 
End Sub 


Sub BankRate_Rate_Retrieval() 
    my_url = "http://www.bankrate.com/funnel/mortgages/mortgage-results.aspx?market=321&loan=150000&perc=20&prods=2&points=0" 
    Set html_doc = CreateObject("htmlfile") 
    Set xml_obj = CreateObject("MSXML2.XMLHTTP") 

    xml_obj.Open "GET", my_url, False 
    xml_obj.send 
    html_doc.body.innerhtml = xml_obj.responseText 
    Set xml_obj = Nothing 

    my_rate = html_doc.body.getelementsbyclassname("br-col-2 br-apr")(1).getElementsByTagName("div")(0).innertext 

“运行时错误438:对象不支持此属性或方法上面的行上发生

结束子

编辑:库的屏幕截图D. Zemens

enter image description here

+2

只要您有IE9 +,HTML对象库应该工作。例如:Dim doc As HTMLDocument',然后在代码Set doc = New HTMLDocument:doc.body.innerHTML = xml_obj.responseText'。然后'Set el = doc.getelementsbyclassname(“br-col-2 br-apr”)'应该可以工作吗? – osknows

+1

宾果,这工作!我做了一些进一步的搜索,发现它是getElementsByClassName和MSXML2的已知早期与后期绑定问题。我的宏涉及迟绑定,你的方法涉及早绑定;只有伯爵结合的作品 – ron

+0

我将我的IE从IE7升级到了IE11。现在getElementsByClassName有效。 –

回答

1

错误消息非常简单:

GetElementsByClassName不是Microsoft XML,v6.0库中的一种可用方法。

您可以查看可用的方法,在这里:

http://msdn.microsoft.com/en-us/library/aa926433.aspx

虽然我无法找到一个类似文件的链接,如果启用和借鉴到MSHTML库,您可以查看到有同样确认,没有GetElementsByClassName方法。这是一种可用于IE自动化的方法,但不适用于HTML或DOMDocument。

enter image description here

修订

虽然这可能不是解决您的问题,我把它放在这里的情况下,它可以帮助他人与IE8。它似乎正在为此目的而工作,但可能需要进一步完善。

Option Explicit 

Sub BankRate_Rate_Retrieval() 
Dim my_url As String 
Dim html_doc As Object 'HTMLDocument 
Dim xml_obj As Object 'MSXML2.DOMDocument 
Dim my_rate As String 

my_url = "http://www.bankrate.com/funnel/mortgages/mortgage-results.aspx?market=321&loan=150000&perc=20&prods=2&points=0" 

Set html_doc = CreateObject("htmlfile") 
Set xml_obj = CreateObject("MSXML2.XMLHTTP") 

xml_obj.Open "GET", my_url, False 
xml_obj.send 
html_doc.body.innerhtml = xml_obj.responseText 

'attempt to replicate the GetElementsByClassName for IE8 

my_rate = IE8_GetElementsByClassName(html_doc.body, "br-col-2 br-apr", 1).GetElementsByTagName("div")(0).InnerText 

MsgBox my_rate 


Set xml_obj = Nothing 
Set html_doc = Nothing 


End Sub 

Function IE8_GetElementsByClassName(html As Object, className As String, Optional Position As Integer) 
'Function to return an array of matching classname elements 
' or if specified will return a single HTMLElement by Position index 

Dim eleDict As Object 
Dim ele as Variant 
Set eleDict = CreateObject("Scripting.Dictionary") 
For x = 0 To html.all.Length - 1 
    Set ele = html.all(x) 
    If ele.className = className Then 
     'Debug.Print i & vbTab & x & vbTab & ele.InnerText 
     Set eleDict(i) = ele 
     i = i + 1 
    End If 
Next 

If Position = Empty Then 
    IE8_GetElementsByClassName = eleDict.Items 
Else 
    Set IE8_GetElementsByClassName = eleDict(Position) 
End If 
Set eleDict = Nothing 
End Function 
+0

我的HTML文档类列出了getElementsByClassName作为成员。 – ron

+0

嗯...嗯,我不是在同一版本/系统上,所以我可能无法进一步协助。我相信他们添加了IE9 +的GetElementsByClassName。 (我正在使用8,所以我不能确认这一点)。即使W3D标准的HTMLDocument不公开一个GetElementsByClassName方法:http://www.w3schools.com/jsref/dom_obj_document.asp我添加了一个新的截图与更多的信息,是你的一样(我想知道如果你有一个与MSHTML不同的库的成员的HTMLDocument)。 –

+1

是的,我认为他们是同一个图书馆。我编辑了我的问题,并在底部放置了一个屏幕截图 – ron