我试图让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")
答案 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")