該賞金到期的明天。此問題的答案有資格獲得 100聲望獎勵。 FreeSoftwareServers想引起更多關注這個問題:
尋找可靠且概括的答案。
我有可以加載 HTMLTable 的代碼,但我最近有一個很大的串列,并意識到它只是拉到串列的頂部。當我在瀏覽器中向下滾動表格時,進一步調查觀察開發控制臺顯示多個“發布”請求。我正在討論構建代碼(如果我什至可以)嘗試找到表中的最后一項,然后再次運行查詢,但我想看看我是否可以“正確”解決根本問題而不是繞過它。
我怎樣才能模擬滾動和監控發布請求或任何其他建議?
這是一些示例代碼,但我不能不幸地將鏈接共享為僅用于 LAN 訪問。注意:不需要登錄,但如果不使用 IE 物件生成伴隨請求的 cookie(無法通過 CLI 發布),我無法弄清楚如何做到這一點。
Do Until InStr(1, IEObj.document.getElementById("gbox_tbl").innerHTML, "WAREHOUSE") > 0
DoEvents
Loop
Dim table As MSHTML.HTMLTable, HTMLCollection As IHTMLElementCollection
Set table = IEObj.document.getElementById("gbox_tbl")
Set ClipBoard = New MSForms.DataObject
Application.Wait (Now() TimeValue("00:00:01"))
ClipBoard.SetText table.outerHTML
ClipBoard.PutInClipboard
Dim TempWS As Worksheet
Call WorksheetCreateDelIfExists("TempSheet")
Set TempWS = Worksheets("TempSheet")
TempWS.Activate
Range("A1").Select
ActiveSheet.Paste
'Stop
Dim UsedRng As Range
Set UsedRng = GetUsedRange(TempWS)
UsedRng.Copy
Dim FindSMPDestWS As Worksheet, wss As Worksheet, SearchTerm As String, i As Integer
i = 0
SearchTerm = "FindWSR"
For Each wss In ActiveWorkbook.Worksheets
If Left(wss.Name, Len(SearchTerm)) = SearchTerm Then
i = i 1
End If
Next wss
If i = 0 Then
Call WorksheetCreate("FindWSR")
Else
Call WorksheetCreate("FindWSR(" & i & ")")
End If
Set FindSMPDestWS = ActiveSheet
FindSMPDestWS.Activate
Range("A1").Select
FindSMPDestWS.Paste
If Range("A1") <> "Loading..." Then
Application.Wait (Now() TimeValue("00:00:01"))
ClipBoard.SetText table.outerHTML
ClipBoard.PutInClipboard
Range("A1").Select
FindSMPDestWS.Paste
End If
uj5u.com熱心網友回復:
更新:我遇到了另一個表,我下面的 Sub 無法正常作業,所以我想再次解決這個問題以找到更強大的解決方案。@Qharr 關于術語“延遲加載”網頁的提示與他評論中的 URL 一起提供了幫助。以下是我所擁有的,它適用于我測驗的兩個表,但它們都是由同一家公司撰寫的內部頁面,所以 YMMV 但我很樂意一如既往地接受建議/反饋。
代碼:
Sub Testing()
'Scroll Entire HTML Table
Dim ScrollBarDivInt As Integer, StepLng As Long, ScrollElmIDStr As String, LoadingElmIDStr As String, LoadingTrueCheckStr As String, LoadingFalseCheckStr As String
ScrollBarDivInt = 0
StepLng = 1000
ScrollElmIDStr = "ui-jqgrid-bdiv"
LoadingElmIDStr = "load_grdDisposition"
LoadingTrueCheckStr = "block"
LoadingFalseCheckStr = "none"
Call Scroll_HTMLTable(ScrollBarDivInt, StepLng, ScrollElmIDStr, LoadingElmIDStr, LoadingTrueCheckStr, LoadingFalseCheckStr)
End Sub
Public Sub Scroll_HTMLTable(ByVal ScrollBarDivInt As Integer, ByVal StepLng As Long, ByVal ScrollElmIDStr As String, ByVal LoadingElmIDStr As String, ByVal LoadingTrueCheckStr As String, ByVal LoadingFalseCheckStr As String)
Dim HLng As Long
HLng = IEObj.document.getElementsByClassName(ScrollElmIDStr)(ScrollBarDivInt).ScrollHeight
For i = 1 To HLng Step StepLng
IEObj.document.getElementsByClassName(ScrollElmIDStr)(ScrollBarDivInt).ScrollTop = i
Application.Wait (Now() TimeValue("00:00:1"))
If InStr(IEObj.document.getElementById(LoadingElmIDStr).outerHTML, LoadingTrueCheckStr) > 0 Then UILoading_Bool = True
If InStr(IEObj.document.getElementById(LoadingElmIDStr).outerHTML, LoadingFalseCheckStr) > 0 Then UILoading_Bool = False
Debug.Print "UILoading_Bool = " & UILoading_Bool
Do While UILoading_Bool = True
Application.Wait (Now() TimeValue("00:00:1"))
If InStr(IEObj.document.getElementById(LoadingElmIDStr).outerHTML, LoadingTrueCheckStr) > 0 Then UILoading_Bool = True
If InStr(IEObj.document.getElementById(LoadingElmIDStr).outerHTML, LoadingFalseCheckStr) > 0 Then UILoading_Bool = False
Loop
Next
End Sub
注意:我可以使用下面的內容直接滾動到底部,但是我的網頁真的很懶惰,除非我在滾動時暫停,否則它不會加載表格的“中間”,因此是“等待”。
IEObj.document.getElementsByClassName(ScrollElmIDStr)(ScrollBarDivInt).ScrollTop = IEObj.document.getElementsByClassName(ScrollElmIDStr)(ScrollBarDivInt).ScrollHeight
結束更新
這并不完全干凈,但它現在確實有效,不幸的是,在重新設定表格以檢查長度之前,我似乎無法找到一種方法來“檢查”頁面是否已加載。我正在使用“application.wait”,它在我的測驗中運行良好,但稍后我會嘗試改進回圈。我也愿意就解決這個問題的更好方法提出建議。
Public Sub ScrollTable(table As MSHTML.HTMLTable)
Dim tcell As Object, tcells As Object, ltablerow As Long, c As Long
Set tcells = table.getElementsByTagName("tr")
Do
c = 0
ltablerow = tcells.Length
'Stop
For Each tcell In tcells
c = c 1
If c > ltablerow - 5 Then
tcell.Click
tcell.Focus
SendKeys "{DOWN}"
SendKeys "{DOWN}"
End If
Next
Application.Wait (Now() TimeValue("00:00:05"))
Set tcells = table.getElementsByTagName("tr")
Loop Until tcells.Length = ltablerow
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380291.html
標籤:擅长 vba IE浏览器 html-table
下一篇:默認鏡像倉庫
