我正在尝试让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")
编辑器中的我的参考资料包括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,了解其所谓的故障安全方式。
你的代码看起来不错,所以我的钱在等待循环中。
尽管VBA不区分大小写,但document
下的所有方法/属性都区分大小写。
使用后期绑定调用它们的一种安全方法是使用CallByName
:
Set items = CallByName(IE.document, "getElementsByTagName", VbMethod, "input")