getelementsbytagname无法识别

问题描述 投票:0回答:2

我正在尝试让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")
vba internet-explorer
2个回答
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

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

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,了解其所谓的故障安全方式。

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


0
投票

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

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

Set items = CallByName(IE.document, "getElementsByTagName", VbMethod, "input")
© www.soinside.com 2019 - 2024. All rights reserved.