是什么导致我的计时循环在延长计时器时中断
What is causing my timing loop to break when extending timer
我正在开发的宏旨在通过按钮启动。该按钮触发一个循环子进程,该子进程仅触发子进程完成大部分工作。
子进程在 IE 中加载 URL,然后导航到报告屏幕。之后它等待指定的时间(在流程中,该值为 X。当超过 X 时,IE 将关闭并且控制权交还给父级,父级在重新启动子之前等待 10 秒。
当 X 从我的 10 秒测试计时器更改为一小时时,问题就出现了。我怀疑 VBA Excel 中有些东西会衰减,所以大约五分钟后我收到错误消息(这对我来说意义不大)。
有兴趣了解时间更改会如何解决这个问题,看看是否有人知道解决该问题的方法。
下面的代码...提前致谢!
Private Sub OpenReport()
Dim text As String
Dim x As Integer
Dim IE
Set IE = New InternetExplorerMedium
text = "PCode"
'Load link
IE.Visible = True
IE.Navigate "http://~~~~~~~~~~~~.net/reports/views/result/reportResult.faces"
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'fill in the pcode
IE.Document.getelementbyid("Pcode").Value = text
'Click Submit
IE.Document.getElementsByClassName("btn btn-lg btn-primary btn-block")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on Favorites
IE.Document.getElementsByClassName("myMRSFavoritesLink")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on report
IE.Document.getElementsByName("myFavoritesForm:treeTable_tableId:6:infoButton98772406j_id__v_55")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
IE.Document.getElementsByName("setParametersForm:startReportButton")(0).Click
'Wait for a period of time contained in TimeValue
Application.Wait (Now + TimeValue("00:01:00")) ' This is X
'Close IE
IE.Quit
End Sub
Private Sub CommandButton1_Click()
Dim Looper As Long
Looper = 0
Do While Looper < 1
Application.Wait Now + TimeValue("00:00:10")
Call OpenReport
Loop
End Sub
这个项目的最终解决方案已经 运行 24/7 三天了,所以我认为可以安全地向您提供所有非常有用的讨论和建议。
成功的关键变化:
- 关注IE的元素,引导登录到报表。
- 添加 'On Error Resume Next' 语句。
实现此功能的网络是无线的,并且会定期出现短暂的信号中断。一旦所有的时间循环和元素控制都有效地使会话进入报告并再次退出,我们就会看到代码轰炸的间歇性问题。 'Resume Next' 确保当我们遇到这些中断时,宏会逐步关闭 IE 会话,从而重新启动新会话。
这样做提供了稳定性。
完整的解决方案如下。请注意,第一个子项是在上面的工作流程中启动的子项。它会短暂等待让系统稳定下来,然后触发调用和导航 IE 会话的子程序。
第二个子部分包括计时循环(59 分钟)和克服网络问题的关键 'On Error' 语句。
Private Sub CommandButton1_Click()
Dim Looper As Long
Looper = 0
Do While Looper < 1
Application.Wait Now + TimeValue("00:00:10")
Call OpenReport
Loop
End Sub
Private Sub OpenReport()
Dim text As String
Dim Looper As Long
Dim x As Integer
Dim IE
Set IE = New InternetExplorerMedium
text = "PCode"
'Load link
IE.Visible = True
On Error Resume Next '<<<--- Final resolution'
IE.Navigate "http://~~~~~~~~.net/reports/views/result/reportResult.faces"
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'fill in the pcode
IE.Document.getelementbyid("PCode").Value = text
'Click Submit
IE.Document.getElementsByClassName("btn btn-lg btn-primary btn-block")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on Favorites
IE.Document.getElementsByClassName("myMRSFavoritesLink")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on report
IE.Document.getElementsByName("myFavoritesForm:treeTable_tableId:6:infoButton98772406j_id__v_55")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on execute report
IE.Document.getElementsByName("setParametersForm:startReportButton")(0).Click
'Wait for a period of time contained in TimeValue
Application.Wait (Now + TimeValue("00:59:00"))
'Close IE
CloseIE:
IE.Quit
End Sub
我正在开发的宏旨在通过按钮启动。该按钮触发一个循环子进程,该子进程仅触发子进程完成大部分工作。
子进程在 IE 中加载 URL,然后导航到报告屏幕。之后它等待指定的时间(在流程中,该值为 X。当超过 X 时,IE 将关闭并且控制权交还给父级,父级在重新启动子之前等待 10 秒。
当 X 从我的 10 秒测试计时器更改为一小时时,问题就出现了。我怀疑 VBA Excel 中有些东西会衰减,所以大约五分钟后我收到错误消息(这对我来说意义不大)。
有兴趣了解时间更改会如何解决这个问题,看看是否有人知道解决该问题的方法。
下面的代码...提前致谢!
Private Sub OpenReport()
Dim text As String
Dim x As Integer
Dim IE
Set IE = New InternetExplorerMedium
text = "PCode"
'Load link
IE.Visible = True
IE.Navigate "http://~~~~~~~~~~~~.net/reports/views/result/reportResult.faces"
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'fill in the pcode
IE.Document.getelementbyid("Pcode").Value = text
'Click Submit
IE.Document.getElementsByClassName("btn btn-lg btn-primary btn-block")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on Favorites
IE.Document.getElementsByClassName("myMRSFavoritesLink")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on report
IE.Document.getElementsByName("myFavoritesForm:treeTable_tableId:6:infoButton98772406j_id__v_55")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
IE.Document.getElementsByName("setParametersForm:startReportButton")(0).Click
'Wait for a period of time contained in TimeValue
Application.Wait (Now + TimeValue("00:01:00")) ' This is X
'Close IE
IE.Quit
End Sub
Private Sub CommandButton1_Click()
Dim Looper As Long
Looper = 0
Do While Looper < 1
Application.Wait Now + TimeValue("00:00:10")
Call OpenReport
Loop
End Sub
这个项目的最终解决方案已经 运行 24/7 三天了,所以我认为可以安全地向您提供所有非常有用的讨论和建议。
成功的关键变化:
- 关注IE的元素,引导登录到报表。
- 添加 'On Error Resume Next' 语句。
实现此功能的网络是无线的,并且会定期出现短暂的信号中断。一旦所有的时间循环和元素控制都有效地使会话进入报告并再次退出,我们就会看到代码轰炸的间歇性问题。 'Resume Next' 确保当我们遇到这些中断时,宏会逐步关闭 IE 会话,从而重新启动新会话。
这样做提供了稳定性。
完整的解决方案如下。请注意,第一个子项是在上面的工作流程中启动的子项。它会短暂等待让系统稳定下来,然后触发调用和导航 IE 会话的子程序。
第二个子部分包括计时循环(59 分钟)和克服网络问题的关键 'On Error' 语句。
Private Sub CommandButton1_Click()
Dim Looper As Long
Looper = 0
Do While Looper < 1
Application.Wait Now + TimeValue("00:00:10")
Call OpenReport
Loop
End Sub
Private Sub OpenReport()
Dim text As String
Dim Looper As Long
Dim x As Integer
Dim IE
Set IE = New InternetExplorerMedium
text = "PCode"
'Load link
IE.Visible = True
On Error Resume Next '<<<--- Final resolution'
IE.Navigate "http://~~~~~~~~.net/reports/views/result/reportResult.faces"
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'fill in the pcode
IE.Document.getelementbyid("PCode").Value = text
'Click Submit
IE.Document.getElementsByClassName("btn btn-lg btn-primary btn-block")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on Favorites
IE.Document.getElementsByClassName("myMRSFavoritesLink")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on report
IE.Document.getElementsByName("myFavoritesForm:treeTable_tableId:6:infoButton98772406j_id__v_55")(0).Click
'Wait for page to load
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
'Click on execute report
IE.Document.getElementsByName("setParametersForm:startReportButton")(0).Click
'Wait for a period of time contained in TimeValue
Application.Wait (Now + TimeValue("00:59:00"))
'Close IE
CloseIE:
IE.Quit
End Sub