getelementbytagname未被识别

时间:2017-12-22 17:35:08

标签: vba internet-explorer

我试图让Excel打开网站,填充一些字段,提交并将结果数据下载到文件中。

然而,我的代码从未走得太远,因为看起来Excel并不能识别" getelementsbytagname"作为现有的操作。我认为这是问题,因为它没有像GetElementsByTagName那样纠正其他所有情况。

编辑器中的我的参考资料包括Microsoft Internet Controls和Microsoft HTML Object Library。还有另一个我需要激活吗?

代码只是在线发现的某些内容的修改版本。

Private Sub IE_automation()
'Retrieve data from Enterprise Reporting with IE
Dim i As Long
Dim IE As Object
Dim objElement As Object
Dim objCollection As Object

'Create Internet Explorer Object
Set IE = CreateObject("InternetExplorer.Application")

'Comment out while troubleshooting
'IE.Visible = False

'Send the form data to URL as POST binary request
IE.Navigate "http://corpprddatawhs1/Reports/Pages/Report.aspx?ItemPath=%2fInventory%2fInventory+By+Branch"

'Set statusbar
Application.StatusBar = "Webhost data is loading. Please wait..."

'Wait while IE loading
Do While IE.busy
    Application.Wait DateAdd("s", 1, Now)
Loop

'Find 2 input tags:
'   1. Text field
'   <input type="text" class="null" name="ct132$ct104$1ct105$txtValue" size="30" value="" />
'
'   2. Button
'   <input type="submit" value="View Report" />

Application.StatusBar = "Searching form submission. Please wait..."

Set objCollection = IE.document.getelementsbytagname("input")

2 个答案:

答案 0 :(得分:0)

  

编辑器中的我的参考资料包括Microsoft Internet Controls和Microsoft HTML Object Library。

然后你没有必要这样做:

Dim IE As Object
Dim objElement As Object
Dim objCollection As Object

Set IE = CreateObject("InternetExplorer.Application")

声明所有内容As Object是一种称为后期绑定的技术。在该范例中,您通过将 ProgID 传递给CreateObject函数来创建对象的新实例。

根据定义,后期绑定代码在运行时被解析:编译器对Object接口感到满意,并且您有责任使用正确的成员。

使用后期绑定代码,您无法获得 IntelliSense 或自动完成,因为编译器不知道您要做什么:它看到的只是Object。< / p>

实际引用类型库时,您可以使用早期绑定,这意味着在编译时而不是运行时解析类型和成员调用。但要实现此功能,您需要使用您引用的类型。否则,你对引用的类型库进行了后期绑定...并且后期绑定代码不需要引用(只是某些版本的类型库在运行代码的机器上注册)。

Dim browser As InternetExplorer
Set browser = New InternetExplorer

browser.Navigate url

'...

Dim dom As HTMLDocument
Set dom = browser.Document

Dim inputElements As HTMLElementCollection
Set inputElements = dom.getElementsByTagName("input")

现在你正在对HTML DOM进行编码,就像对任何Excel工作表一样,使用IntelliSense和参数信息以及所有好东西。

这很可疑:

Do While IE.busy
    Application.Wait DateAdd("s", 1, Now)
Loop

该等待循环甚至没有查看浏览器的ReadyState。试试这个:

Do Until IE.ReadyState = 4 And IE.Busy = False
    DoEvents
Loop

请参阅this post,了解据称可以采用故障安全的方法。

你的代码看起来不错,所以我的钱在等待循环中。

答案 1 :(得分:0)

尽管VBA不区分大小写,但document下的所有方法/属性都区分大小写。

使用后期绑定调用它们的安全方法是使用CallByName

Set items = CallByName(IE.document, "getElementsByTagName", VbMethod, "input")
相关问题