VBA-Excel:在IE窗口中填写表单

我希望有人能帮助。 我正在努力加快填充networking表格的过程,这个表格必须用excel中存储的信息完成几十或几百次。

要做到这一点,我需要一个button来打开一个IE窗口,并导航到某个网站的login页面(我已经弄清楚了这一点)。 用户可以login并导航到需要填写的表单。 然后,我希望用户能够返回到Excel页面,点击另一个button,这将自动填充几个下拉菜单和文本框。

在Excel中,我已经有了一些代码来允许用户search需要转到表单的特定信息,所以他们只需点击button即可转移。 代码的第一位是这样的:

Public IE As Object Public Sub OpenIE() Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.Navigate "loginpage url" End Sub 

然而,在我遇到麻烦的情况下,一旦用户login并导航到窗体,具有不同的function访问相同的IE窗口。 现在我已经得到了这个:

 Sub FillMacro() Dim sh As Object, oWin As Object Set sh = CreateObject("Shell.Application") For Each oWin In sh.Windows If TypeName(oWin.document) = "HTMLDocument" Then Set IE = oWin Exit For End If Next IE.Visible = True Application.Wait (Now + TimeValue("00:00:01")) IE.document.getElementById("idec").Value = "John" Application.Wait (Now + TimeValue("00:00:01")) IE.document.getElementById("idee").Value = "Smith" End Sub 

我从这个论坛上的其他post得到的大部分,而我在这个有点新手,这个问题似乎是由于某种原因,VBA找不到带有姓氏或ID的文本框或名字。 更重要的是,IE.Visible = True并不会将IE窗口带回前台,所以我正在寻找合适的线路来做到这一点。 当我尝试运行代码时,出现“Object Required”错误:

 IE.document.getElementById("idec").Value = "John" 

我试着search这个网站,并会继续看,但在此期间的任何帮助将不胜感激!

在Internet Explorer页面上,这是我要填写的第一个文本框的行:

 <input name="componentListPanel:componentListView:1:component:patientLastNameContainer:patientLastName" class="input300" id="idec" type="text" maxlength="60" value=""> 

为什么不自动logging过程呢? login可以存储在Excel中,macros的值可以从单元格中读取。

正如蒂姆·威廉斯(Tim Williams)所build议的那样,如果网站上有iframe,请使用(对我来说,它仅适用于内容窗口):

 IE.document.getElementById("iFrameIdHere").contentwindow.document.getEleme‌ntById("idec").Value = "John" 

而不是Application.Wait使用:

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

当页面加载速度很快时,它会为您节省大量时间,并在加载超过等待时间时防止错误。 只有在页面重新加载之后才使用它(意思是在导航之后或任何导致页面重新加载的东西,尤其是在HTML元素上点击。

使用早期绑定,比创build对象快一点。 它可以提高几个百分点的性能,基于页面加载速度,更快的页面加载,更大的增加。

 Set IE = New InternetExplorer 

最后,你可以切换加载图片,取决于你是否需要从网站上下载图片。

 Public Sub ShowPictures(ByVal EnabledStatus As Boolean) Public ScrapingCancelled as Boolean Dim obj_Shell Dim v_Result As Variant Set obj_Shell = CreateObject("WScript.Shell") 'Reads the registry key that determines whether 'Show pictures' Internet Explorer advanced setting is enabled v_Result = obj_Shell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Display Inline Images") Select Case v_Result Case "yes" 'Pictures are displayed If EnabledStatus = False Then _ obj_Shell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Display Inline Images", "no", "REG_SZ" Case "no" 'Pictures are not displayed If EnabledStatus = True Then _ obj_Shell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Display Inline Images", "yes", "REG_SZ" Case Else ScrapingCancelled = True End Select End Sub 

没有加载图片:

 ShowPictures (0) 

加载的图像:

 ShowPictures (1) 

一个好的做法是在macros的末尾将值设置为1。