Vba GetElementsbyClassname:开放IE与MSXML2方法
下面的宏工作正常。它打开IE实例并使用“getelementsbyclassname”方法返回“my_rate”的预期值。但是,当我运行使用“MSXML2”方法的第二个宏时,宏在注释行失败,并出现“运行时错误438:对象不支持此属性或方法”错误。为什么“openie”方法可以工作,但“MSXML2”方法在我的代码中失败了?我在用IE 11跑步。我还为第二个宏设置了对MicrosoftHTML对象库的引用,但这似乎没有什么区别。提前谢谢你向我解释这件事Vba GetElementsbyClassname:开放IE与MSXML2方法,vba,internet-explorer,excel,getelementsbyclassname,Vba,Internet Explorer,Excel,Getelementsbyclassname,下面的宏工作正常。它打开IE实例并使用“getelementsbyclassname”方法返回“my_rate”的预期值。但是,当我运行使用“MSXML2”方法的第二个宏时,宏在注释行失败,并出现“运行时错误438:对象不支持此属性或方法”错误。为什么“openie”方法可以工作,但“MSXML2”方法在我的代码中失败了?我在用IE 11跑步。我还为第二个宏设置了对MicrosoftHTML对象库的引用,但这似乎没有什么区别。提前谢谢你向我解释这件事 Sub BankRate_Rate_Retr
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的库截图
错误信息非常简单:
GetElementsByClassName
不是Microsoft XML v6.0库中可用的方法
您可以在此处查看可用的方法:
虽然我找不到类似的文档链接,但是如果您启用了MSHTML库的referec,您可以查看那里以确认没有GetElementsByClassName
方法。这是一种可用于IE自动化的方法,但不适用于HTML或DOMDocument
已更新
虽然这可能无法解决您的问题,但我将其放在这里,以防它在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
我的HTML文档类将getElementsByClassName列为成员。Hmmmm。。。我的版本/系统与您不同,因此我可能无法进一步提供帮助。我相信他们用IE9+添加了GetElementsByClassName。(我正在使用8,因此无法确认这一点)。即使是HTMLDocument的w3标准也没有公开GetElementsByCassName方法:我添加了一个包含更多信息的新屏幕截图,您的截图是否相同(我想知道您是否有一个HTMLDocument是与MSHTML不同的库的成员)。是的,我认为它们是同一个库。我编辑了我的问题并在底部放了一个屏幕截图抱歉我没有发布更新的屏幕截图。它现在应该在那里。确保您可以看到MSHTML.yep的类HTMLDocument成员,它们是相同的库只要您有IE9+,HTML对象库就应该工作。例如
Dim doc As HTMLDocument
,然后在后面的代码中设置doc=New HTMLDocument:doc.body.innerHTML=xml_obj.responseText
。那么Set el=doc.getelementsbyclassname(“br-col-2br-apr”)
应该可以了吧?没错,可以了!我做了进一步的搜索,发现这是已知的getElementsByClassName和MSXML2的早期与晚期绑定问题。我的宏涉及后期绑定,您的方法涉及早期绑定;只有earl binding worksI将IE从IE7更新为IE11。现在getElementsByClassName可以工作了。