有没有更好的方法来完成这个循环?
Is there a better way to accomplish this loop?
我是 VBA 的新手,但我一直在为我的团队制作一个程序。
这段代码大部分时间都有效,但有时会挂起。我不明白为什么它有时会挂起,但大多数时候都能完美运行,所以我现在正试图找出一种更好的方法来完成这个循环。我知道这种循环方法不是做事的最佳方式,但不确定如何完成任务。
我的网页在 PEGA Web 应用程序中运行,本机 IE 就绪状态指示器始终 'ready' 因此我必须使用 Web 应用程序的就绪状态标记。
谁能帮帮我?
Public Sub WaitingForRS()
' FIND THE C360 WINDOW
Marker = 0
Set objShell = CreateObject("Shell.Application")
IE_count = objShell.Windows.Count
For x = 0 To (IE_count - 1)
On Error Resume Next
my_url = objShell.Windows(x).Document.Location
my_title = objShell.Windows(x).Document.title
If my_title Like "Coverage User" & "*" Then
Set C360Window = objShell.Windows(x)
Marker = 1
Exit For
Else
End If
Next
If Marker = 0 Then
MsgBox ("C360 window is not found. Please ensure C360 is open in Internet Explorer and try again")
Else
End If
'FIND THE READY STATE INDICATOR
RSIndicatorDocMarker = 0
RSIndicatorDataMarker = 0
Set RSIndicatorPage = C360Window.Document
Set RSIndicatorClass = RSIndicatorPage.getelementsbyclassname("document-statetracker")(0)
RSIndicatorCheck:
'CHECK THE READY STATE DOC STATUS
If RSIndicatorClass.getattribute("data-state-doc-status") = "ready" Then
RSIndicatorDocMarker = 1
Else: RSIndicatorDocMarker = 0
End If
'CHECK THE READY STATE
If RSIndicatorClass.getattribute("data-state-busy-status") = "none" Then
RSIndicatorDataMarker = 1
Else: RSIndicatorDataMarker = 0
End If
'Compare the RSIndicators
If RSIndicatorDataMarker = 1 And RSIndicatorDocMarker = 1 Then
Else: GoTo RSIndicatorCheck
End If
End Sub
查看我对此的回答 post Excel VBA Submitting data via IE on an online MS Forms not working
@想法 5 副标题。 WaitForLoadSETx() 函数有一个手动时间 over-ride 和双循环来帮助捕捉状态。
这是我在 VBA 使用 IE object 时所能做的最好的事情。理想情况下,您想学习 Selenium、PhantomJS 或 Puppeteer 以进行实际的浏览器操作。当然有很酷的应用程序,人们已经在这些库之上构建以提供帮助(puppeteer recorder chrome 添加)
或者将事情保留在 Excel 中,使用简单的 XMLHTTPRequest object 将浏览器排除在等式之外,并单独处理来自网页的请求/响应。这是一个很好的选择,因为它可以让您专注于抓取 html 内容,以没有 Javascript 的文本形式或等待页面加载。
也许可以尝试使用 OnTime 而不是您当前拥有的紧密循环:
Public Sub WaitingForRS()
Dim win As Object
Dim w As Object, el, ready As Boolean, idle As Boolean
For Each w In CreateObject("Shell.Application").Windows
If w.Name Like "*Internet*" Then
If w.Title Like "Coverage user*" Then
Set win = w
Exit For
End If
End If
Next
If Not win Is Nothing Then
Set el = win.document.getelementsbyclassname("document-statetracker")(0)
ready = (el.getattribute("data-state-doc-status") = "ready")
idle = (el.getattribute("data-state-busy-status") = "none")
If ready And idle Then
ProceedWithNextSteps win 'do whatever comes next: pass in the window
Else
'wait for a while then try again
Application.OnTime Now + TimeSerial(0, 0, 1), "WaitingForRS"
End If
Else
MsgBox "Window not found!"
End If
End Sub
可能想要添加一个时间限制,这样如果页面不是 "ready",它就不会永远循环播放。
我是 VBA 的新手,但我一直在为我的团队制作一个程序。 这段代码大部分时间都有效,但有时会挂起。我不明白为什么它有时会挂起,但大多数时候都能完美运行,所以我现在正试图找出一种更好的方法来完成这个循环。我知道这种循环方法不是做事的最佳方式,但不确定如何完成任务。
我的网页在 PEGA Web 应用程序中运行,本机 IE 就绪状态指示器始终 'ready' 因此我必须使用 Web 应用程序的就绪状态标记。
谁能帮帮我?
Public Sub WaitingForRS()
' FIND THE C360 WINDOW
Marker = 0
Set objShell = CreateObject("Shell.Application")
IE_count = objShell.Windows.Count
For x = 0 To (IE_count - 1)
On Error Resume Next
my_url = objShell.Windows(x).Document.Location
my_title = objShell.Windows(x).Document.title
If my_title Like "Coverage User" & "*" Then
Set C360Window = objShell.Windows(x)
Marker = 1
Exit For
Else
End If
Next
If Marker = 0 Then
MsgBox ("C360 window is not found. Please ensure C360 is open in Internet Explorer and try again")
Else
End If
'FIND THE READY STATE INDICATOR
RSIndicatorDocMarker = 0
RSIndicatorDataMarker = 0
Set RSIndicatorPage = C360Window.Document
Set RSIndicatorClass = RSIndicatorPage.getelementsbyclassname("document-statetracker")(0)
RSIndicatorCheck:
'CHECK THE READY STATE DOC STATUS
If RSIndicatorClass.getattribute("data-state-doc-status") = "ready" Then
RSIndicatorDocMarker = 1
Else: RSIndicatorDocMarker = 0
End If
'CHECK THE READY STATE
If RSIndicatorClass.getattribute("data-state-busy-status") = "none" Then
RSIndicatorDataMarker = 1
Else: RSIndicatorDataMarker = 0
End If
'Compare the RSIndicators
If RSIndicatorDataMarker = 1 And RSIndicatorDocMarker = 1 Then
Else: GoTo RSIndicatorCheck
End If
End Sub
查看我对此的回答 post Excel VBA Submitting data via IE on an online MS Forms not working
@想法 5 副标题。 WaitForLoadSETx() 函数有一个手动时间 over-ride 和双循环来帮助捕捉状态。
这是我在 VBA 使用 IE object 时所能做的最好的事情。理想情况下,您想学习 Selenium、PhantomJS 或 Puppeteer 以进行实际的浏览器操作。当然有很酷的应用程序,人们已经在这些库之上构建以提供帮助(puppeteer recorder chrome 添加)
或者将事情保留在 Excel 中,使用简单的 XMLHTTPRequest object 将浏览器排除在等式之外,并单独处理来自网页的请求/响应。这是一个很好的选择,因为它可以让您专注于抓取 html 内容,以没有 Javascript 的文本形式或等待页面加载。
也许可以尝试使用 OnTime 而不是您当前拥有的紧密循环:
Public Sub WaitingForRS()
Dim win As Object
Dim w As Object, el, ready As Boolean, idle As Boolean
For Each w In CreateObject("Shell.Application").Windows
If w.Name Like "*Internet*" Then
If w.Title Like "Coverage user*" Then
Set win = w
Exit For
End If
End If
Next
If Not win Is Nothing Then
Set el = win.document.getelementsbyclassname("document-statetracker")(0)
ready = (el.getattribute("data-state-doc-status") = "ready")
idle = (el.getattribute("data-state-busy-status") = "none")
If ready And idle Then
ProceedWithNextSteps win 'do whatever comes next: pass in the window
Else
'wait for a while then try again
Application.OnTime Now + TimeSerial(0, 0, 1), "WaitingForRS"
End If
Else
MsgBox "Window not found!"
End If
End Sub
可能想要添加一个时间限制,这样如果页面不是 "ready",它就不会永远循环播放。