VBA打开网页然后提交数据



我对vba控制的IE很陌生,但是无意中编写了以下代码,这些代码是使用各种在线搜索拼凑在一起的。

我的问题是,虽然这段代码的工作,如果在"点击/提交"之前添加一个断点被点击(然后去IE窗口),它似乎不更新网页时,它运行没有断点。

如果我打破代码,看看光标在网页上的位置,然后恢复代码,它会保存和更新,但我似乎不能让它正常工作。

任何帮助都非常感谢。

Sub test()
url = "Sharepoint - hidden"
Set IE = New InternetExplorerMedium
IE.Visible = True
IE.Navigate url


Dim HTMLDOC As HTMLDocument
Dim MyHTML_Element As IHTMLElement
Do
Loop Until IE.ReadyState = READYSTATE_COMPLETE
Set HTMLDOC = IE.Document

HTMLDOC.all.Item("ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_T5").innerText = "New Employee - Test:" & Now()   '[Request Type]
HTMLDOC.all.Item("ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_T5").Focus
HTMLDOC.all.Item("ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_B3").Click
End sub

几天之后,我尝试了各种各样的解决方案,我找到了一个有效的方法,它就像添加更多的焦点行一样简单,如下所示:

HTMLDOC.all.Item("ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_T5").Focus
HTMLDOC.all.Item("ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_T5").innerText = "New Employee - Test:" & Now()   '[Request Type]
HTMLDOC.all.Item("ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_T5").Focus
HTMLDOC.all.Item("ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_B3").Focus
HTMLDOC.all.Item("ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_B3").Click

您应该能够使用:

IE.document.getElementById("ID_Of_Your_Element").Click

如果你的情况,你可以使用:

HTMLDOC.getElementById("ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_B3").Click

对不起,我还没有足够的声誉来发表评论。在进行自动化操作时,你需要放慢速度。尝试在与HTMLDOC交互的每一行之后使用我的Pause()子例程。从2秒开始,在测试可靠性时逐渐减少。如下内容(未测试):

使用VBA实现浏览器自动化的更好方法是使用Selenium。我推荐观看Gove Allen的这个优秀的教程。

Sub test()
Const SPEED = 2.0 'reduce 
url = "Sharepoint - hidden"
Set IE = New InternetExplorerMedium
IE.Visible = True: Pause SPEED
IE.Navigate url: Pause 5


Dim HTMLDOC As HTMLDocument
Dim MyHTML_Element As IHTMLElement
Do
Loop Until IE.ReadyState = READYSTATE_COMPLETE
Set HTMLDOC = IE.Document
Dim sCntrl1 as string: sCntrl1 = "ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_T5"
Dim sCntrl2 as string: sCntrl2 = "ctl00_ctl40_g_07433f93_b974_4a29_9e53_cc3a087aa20a_FormControl0_V1_I1_B3"
HTMLDOC.all.Item(sCntrl1).innerText = "New Employee - Test:" & Now() : Pause SPEED
HTMLDOC.all.Item(sCntrl1).Focus : Pause SPEED
HTMLDOC.all.Item(sCntrl2).Click : Pause SPEED
End sub

最新更新