VBA Excel:在IE窗口中填写表单
我希望有人能帮忙。我正在尝试加快填写网络表单的过程,该表单必须使用excel中存储的信息填写几十次或数百次 要做到这一点,我需要一个按钮来打开一个IE窗口并导航到某个网站的登录页面(我已经猜出了这一点)。然后,用户可以登录并导航到需要填写的表单。然后,我希望用户能够返回excel页面,单击另一个按钮,它将自动填充几个下拉列表和文本框 在Excel中,我已经有了一些代码,允许用户搜索需要转到表单的特定信息集,因此他们所要做的就是单击按钮将其传递过来。代码的第一位是:VBA Excel:在IE窗口中填写表单,vba,excel,internet-explorer,Vba,Excel,Internet Explorer,我希望有人能帮忙。我正在尝试加快填写网络表单的过程,该表单必须使用excel中存储的信息填写几十次或数百次 要做到这一点,我需要一个按钮来打开一个IE窗口并导航到某个网站的登录页面(我已经猜出了这一点)。然后,用户可以登录并导航到需要填写的表单。然后,我希望用户能够返回excel页面,单击另一个按钮,它将自动填充几个下拉列表和文本框 在Excel中,我已经有了一些代码,允许用户搜索需要转到表单的特定信息集,因此他们所要做的就是单击按钮将其传递过来。代码的第一位是: Public IE As Ob
Public IE As Object
Public Sub OpenIE()
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate "loginpage url"
End Sub
然而,我遇到的问题是,一旦用户登录并导航到表单,就会有不同的函数访问同一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
我从这个论坛上的其他帖子中得到的大部分信息,虽然我在这方面有点新手,但问题似乎是出于某种原因VBA找不到id为LastName或FirstName的文本框。更重要的是,IE.Visible=True不会将IE窗口带回前台,因此我正在尝试找到合适的行来实现这一点。当我尝试运行代码时,在以下位置出现“需要对象”错误:
IE.document.getElementById("idec").Value = "John"
我已经尝试搜索这个网站,并将继续寻找,但在此期间任何帮助将不胜感激
在Internet Explorer页面上,以下是我尝试填充的第一个文本框的行:
<input name="componentListPanel:componentListView:1:component:patientLastNameContainer:patientLastName" class="input300" id="idec" type="text" maxlength="60" value="">
为什么不同时自动化日志记录过程?登录名可以存储在Excel中,其值可以通过宏从单元格中读取 正如Tim Williams所建议的,如果网站上有Iframe,请使用(对我来说,它只适用于包含contentwindow的内容): 不要使用
应用程序。等待使用:
Do Until IE.ReadyState = 4 And IE.Busy = False
DoEvents
Loop
当页面快速加载时,它将为您节省大量时间,并防止加载超过等待时间时出错。仅在页面重新加载后使用它(指在导航或任何导致页面重新加载的因素之后,尤其是。单击HTML元素上的)
使用早期绑定,它比创建对象快一点。它可以根据页面加载速度将性能提高几个百分点,页面加载速度越快,增加的幅度就越大
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)
加载的图像:
ShowPictures (0)
ShowPictures (1)
一个好的做法是在宏的末尾将值设置为1。该页面上有任何框架/iframe吗?您可以提供一个实际的Web表单URL吗?您也可以尝试使用XHR而不是IE automation,您只需在手动表单提交后在IE developer tools network选项卡中检查请求,并复制它。表单实际上位于iframe中。如至于URL,您必须登录才能查看表单,因此我不确定是否可以,也不确定如何IE.document.getElementById(“iFrameIdHere”).document.getElementById(“idec”).Value=“John”
谢谢!包括contentwindow也为我做到了这一点。就自动登录而言,没有理由不包括它,因此我补充说,现在我已经成功地完成了主要部分的工作。