我希望有人可以提供帮助。我试图加快填充webform的过程,这个过程必须使用excel中存储的信息完成数十次或数百次。
要做到这一点,我需要一个按钮来打开IE窗口并导航到某个网站的登录页面(我已经弄明白了这一点)。然后,用户可以登录并导航到需要填写的表单。然后,我希望用户能够返回到Excel页面,单击另一个按钮,这将自动填充多个下拉菜单和文本框。
在Excel中,我已经有一些代码允许用户搜索需要转到表单的特定信息集,因此他们所要做的就是单击按钮将其转移。代码的第一位就是这样:
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窗口带回前台,所以我试图找到合适的线来做到这一点。当我尝试运行代码时,我得到一个" Object Required"错误在:
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="">
答案 0 :(得分:1)
为什么不自动化日志记录过程呢?登录可以存储在Excel中,其值由单元格中的宏读取。
正如Tim Williams建议的那样,如果网站上有iframe,请使用(对我而言,它仅适用于包含contentwindow):
IE.document.getElementById("iFrameIdHere").contentwindow.document.getElementById("idec").Value = "John"
而不是Application.Wait
使用:
Do Until IE.ReadyState = 4 And IE.Busy = False
DoEvents
Loop
当页面加载速度快时,它将为您节省大量时间,并在加载超过等待时间时防止错误。仅在页面重新加载后使用它(意味着导航后或导致页面重新加载的任何内容,尤其是HTML元素上的.click
。
使用早期绑定,它比创建对象快一点。根据页面加载速度,页面加载速度越快,增加的幅度越大,它可以将性能提高几个百分点。
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)
一个好的做法是在宏的末尾将值设置为1.