返回列表 上一主題 發帖

詢問 .WebBrowser1的幾個問題

速度太快,WebBrowser沒反應過來。
WebBrowser是異步的加載的,最好是在每一個命令之后等待WebBrowser完全加載完成再繼續下一個命令。
世界那麼大,可我想去哪?

TOP

回復 3# mark15jill
你的代碼中有一句:
  1.                          Do
  2.                             DoEvents
  3.                         Loop
複製代碼
第一次執行后程式將進入永久死循環,建議去掉。
世界那麼大,可我想去哪?

TOP

本帖最後由 Joforn 於 2020-11-27 11:47 編輯

回復 5# mark15jill
很久都不用WebBrowser控件了。只能跟你大致說下處理流程。
在發送命令后,一般用
  1. IsBusy=True   '這個是全局變量,由WebBrowser的加載完成事件去將其值改變。
  2. Times=0
  3. Do While IsBusy And (Times<100)       '檢測Times是否小于100,大于100判斷為程序出問題了,加載時間過長,強行中止程式運行。100次循環與后面的Sleep 200組合,表示最長等待20秒(Sleep參數以毫秒為單位)。
  4.      Sleep 200             '這個是API函數,使用前要先聲明。加入這條語句是為了釋放CPU控制權,沒有這條,VBA的CPU使用率一直占99%
  5.      DoEvents             '釋放程序控制權,防止WebBrower出問題后無法退出,也是為了讓WebBrower有相應的CPU運行權去繼續加載頁面。
  6.      Times=Times + 1
  7. Loop
複製代碼
然后還要再引用WebBrower控件的DocumentComplete
  1. Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  2.    IsBusy = False
  3. End Sub
複製代碼
上面兩組代碼相結合,那么就可以完成一個等待頁面加載完成后,程式才繼續執行后續代碼過程。

但是,要注意:在WebBrower加載頁面開始后,并不一定只激活一次DocumentComplete,所以還要在WebBrowser1的DocumentComplete事件處理過程中進行一定的判斷來是否是真正的最后一次頁面加載完成事件。可以對比URL是否是當前頁面的URL來判斷:
  1. Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  2.     If IsBusy Then IsBusy = URL<>DocumentURL '注意,這里的DocumentURL需要你自己根據你當前的頁面去獲取或是設置。
  3. End Sub
複製代碼
最后是你可能需要用到的函數和變量聲明:
  1. #If VBA7 Then
  2.     Private Declare PtrSafe Sub Sleep Lib "Kernel32.dll" (ByVal dwMilliseconds As Long)
  3. #Else
  4.     Private Declare Sub Sleep Lib "Kernel32.dll" (ByVal dwMilliseconds As Long)
  5. #End If
  6. Private IsBusy As Boolean
複製代碼
世界那麼大,可我想去哪?

TOP

        靜思自在 : 站在半路,比走到目標更辛苦。
返回列表 上一主題