2014-05-05 62 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