Bỏ qua thời gian chờ của VBA

Liên hệ QC

quockhanhzz

Thành viên mới
Tham gia
29/7/19
Bài viết
23
Được thích
2
Chào mọi người, em đang có 1 vấn đề là trong đoạn code của em, em sẽ đặt 1 câu lệnh cho thời gian chờ là 50s, vấn đề là e đặt đoạn code chờ đó ở trong vòng lặp, và nhiều lúc e thấy thời gian chờ đó quá lâu, và e muốn bỏ qa nó, dang như chạy được 20s, 30s là e xong 1 vòng lặp rồi mà thời gian chờ của e là 50s, em thấy như v không tối ưu, Vậy em muốn hỏi mấy anh chị là có cách nào khi e hoàn thành vòng lặp đó mà thời gian chờ của nó vẫn còn thì e có thể bỏ qa thời gian đó để băt đầu vòng lặp mới không ạ
 
Chào mọi người, em đang có 1 vấn đề là trong đoạn code của em, em sẽ đặt 1 câu lệnh cho thời gian chờ là 50s, vấn đề là e đặt đoạn code chờ đó ở trong vòng lặp, và nhiều lúc e thấy thời gian chờ đó quá lâu, và e muốn bỏ qa nó, dang như chạy được 20s, 30s là e xong 1 vòng lặp rồi mà thời gian chờ của e là 50s, em thấy như v không tối ưu, Vậy em muốn hỏi mấy anh chị là có cách nào khi e hoàn thành vòng lặp đó mà thời gian chờ của nó vẫn còn thì e có thể bỏ qa thời gian đó để băt đầu vòng lặp mới không ạ
Vòng lặp gì mà chạy tận 50s ta nhiều nhỉ.
 
Upvote 0
Chỉ có cách này mà thôi

PHP:
#If VBA7 Then
Public Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
Public Declare Function GetTickCount Lib "kernel32" () As Long
#End If
Public WaitTimeForNext As Date
Public ExitWaitTime As Boolean
'Đợi 50 giây'
Private Sub test_DelayMSec()
  DelayMSec 50000, True
End Sub
'Không đợi nữa'
Private Sub Exit_DelayMSec()
  ExitWaitTime = True
End Sub
'Hoặc'
'Gọi một Macro sau 50 giây'
Sub CallMacroByTime()
    WaitTimeForNext = Now + Timeserial(0,0,50)
    Application.Ontime WaitTimeForNext, "tên Macro",,True
End Sub
'Kết thúc gọi Macro giữa chừng'
Sub UnCallMacroByTime()
  On Error Resume Next
  Application.Ontime WaitTimeForNext, "tên Macro",,False
  WaitTimeForNext = 0
End Sub
Sub DelayMSec(Optional ByVal MiliSecond% = 1000, _
              Optional ByVal IsDoEvent As Boolean = True)
    Dim Start&, Check&
    Start = GetTickCount&()
    ExitWaitTime = False
    Do
      If IsDoEvent Then DoEvents
      Check = GetTickCount&()
      If Check < Start Or Check > Start + MiliSecond Or ExitWaitTime Then Exit Do
    Loop
    ExitWaitTime = False
  End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chào mọi người, em đang có 1 vấn đề là trong đoạn code của em, em sẽ đặt 1 câu lệnh cho thời gian chờ là 50s, vấn đề là e đặt đoạn code chờ đó ở trong vòng lặp, và nhiều lúc e thấy thời gian chờ đó quá lâu, và e muốn bỏ qa nó, dang như chạy được 20s, 30s là e xong 1 vòng lặp rồi mà thời gian chờ của e là 50s, em thấy như v không tối ưu, Vậy em muốn hỏi mấy anh chị là có cách nào khi e hoàn thành vòng lặp đó mà thời gian chờ của nó vẫn còn thì e có thể bỏ qa thời gian đó để băt đầu vòng lặp mới không ạ
Cái này có lẽ giống như chạy 2 luồng cùng lúc trong VBA. Bạn đưa tạm 1 ví dụ lên thử xem
 
Upvote 0
Tậu quá, can các bác đó. Bản thân VBA lúc được code, xây dựng lên không support multithread nhé. Muốn mutithread được với nó thì không không dễ đâu, mình khuyên các bạn không nên thử, tốn công vô ích.
Lập trình multithread, multiprocessor với các ngôn ngữ khác sát ở dưới như C đã rất, rất khó rồi, nói chi code VBA chạy trên tầng của VBA nữa.
Hì hì, nhưng thư viện Microsoft Scripting Runtime scrrun.dll lại được viết cho multithread nhé, các bác dùng nó trong ngôn ngữ khác thì an tâm.
 
Upvote 0
Sinh, create thread thì VB vẫn dùng được, nói chung là tạm được. Nhưng trong thực tế còn read/write data, trao đổi dữ liệu giữa các thread, tránh deadlock, synchronize giửa các thread thì VB không làm được đâu. Chết, văng luôn là chuyện thường. Hiễu rõ nó (VB và VBA, multithread) mà còn bị nó hành cho nãn, phải bỏ luôn, viết = ngôn ngữ khác là chính mình đã gặp rồi.
Nên mình mới khuyên là không nên đụng tới multithread với VBA.
Và mình đã nói rồi, VB/VBA có những giới hạn mà không thể vượt qua.
 
Lần chỉnh sửa cuối:
Upvote 0
Chỉ có cách này mà thôi

PHP:
#If VBA7 Then
Public Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
Public Declare Function GetTickCount Lib "kernel32" () As Long
#End If
Public WaitTimeForNext As Date
Public ExitWaitTime As Boolean
'Đợi 50 giây'
Private Sub test_DelayMSec()
  DelayMSec 50000, True
End Sub
'Không đợi nữa'
Private Sub Exit_DelayMSec()
  ExitDoEvent = True
End Sub
'Hoặc'
'Gọi một Macro sau 50 giây'
Sub CallMacroByTime()
    WaitTimeForNext = Now + Timeserial(0,0,50)
    Application.Ontime WaitTimeForNext, "tên Macro",,True
End Sub
'Kết thúc gọi Macro giữa chừng'
Sub UnCallMacroByTime()
  On Error Resume Next
  Application.Ontime WaitTimeForNext, "tên Macro",,False
  WaitTimeForNext = 0
End Sub
Sub DelayMSec(Optional ByVal MiliSecond% = 1000, _
              Optional ByVal IsDoEvent As Boolean = True)
    Dim Start&, Check&
    Start = GetTickCount&()
    ExitWaitTime = False
    Do
      If IsDoEvent Then DoEvents
      Check = GetTickCount&()
      If Check < Start Or Check > Start + MiliSecond Or ExitWaitTime Then Exit Do
    Loop
    ExitWaitTime = False
  End Sub
dạ em cám ơn
Bài đã được tự động gộp:

Cái này có lẽ giống như chạy 2 luồng cùng lúc trong VBA. Bạn đưa tạm 1 ví dụ lên thử xem
Mã:
Mã:
Sub auto()
                
Dim i As Integer
                
For i = 1 To 3

Dim obj As New WebDriver
obj.Start "chrome", ""
obj.Get "https://docs.google.com/forms/d/e/1FAIpQLSeW6l0BbGA4pO4skVAWKFUo3cjA0UVa0rrjfEeT6hY3s_YBCg/viewform?usp=sf_link"

Application.Wait (Now + TimeValue("0:00:50"))

obj.FindElementByClass("quantumWizButtonPaperbuttonLabel").Click

obj.Close

Next i
                
End Sub
ví dụ đây a ạ
 
Upvote 0
Bạn thử:
obj.WaitUntil (obj.FindElementByClass("quantumWizButtonPaperbuttonLabel"))

Hoặc:
PHP:
Dim t As Date, Cls As Object
t = Timer
Do
    DoEvents
    On Error Resume Next
    Set Cls = obj.FindElementByClass("quantumWizButtonPaperbuttonLabel")
    On Error GoTo 0
    If Timer - t >= 10 Then Exit Do
Loop While Cls Is Nothing
'-------
Set Cls = Nothing
 
Upvote 0
Cho phép góp ý nhiều bạn chút, Vba kế thừa từ vb, vb kế thừa từ basic hồi xưa của bác Bill. Thời bác Bill còn ngồi code, ct nó chạy trên dĩa mềm, băng từ. . . nên người ta mới nghĩ ra vụ dùng $, % . . . để tiết kiệm vài byte khai báo biến cho lưu trữ ct trên băng từ, đĩa mềm.
Giờ thì vài GB lưu trữ phim xvideos, thiên địa các bác còn kg tiếc, ở đó mà vài byte khai báo biến ? Hay các bác muốn chứng tỏ ta đây code siêu, khó hiểu biến, goto gosub lung tung.
Nhảm. . .
 
Upvote 0
Bạn thử:
obj.WaitUntil (obj.FindElementByClass("quantumWizButtonPaperbuttonLabel"))

Hoặc:
PHP:
Dim t As Date, Cls As Object
t = Timer
Do
    DoEvents
    On Error Resume Next
    Set Cls = obj.FindElementByClass("quantumWizButtonPaperbuttonLabel")
    On Error GoTo 0
    If Timer - t >= 10 Then Exit Do
Loop While Cls Is Nothing
'-------
Set Cls = Nothing
dạ em cám ơn để e thử
Bài đã được tự động gộp:

Cho phép góp ý nhiều bạn chút, Vba kế thừa từ vb, vb kế thừa từ basic hồi xưa của bác Bill. Thời bác Bill còn ngồi code, ct nó chạy trên dĩa mềm, băng từ. . . nên người ta mới nghĩ ra vụ dùng $, % . . . để tiết kiệm vài byte khai báo biến cho lưu trữ ct trên băng từ, đĩa mềm.
Giờ thì vài GB lưu trữ phim xvideos, thiên địa các bác còn kg tiếc, ở đó mà vài byte khai báo biến ? Hay các bác muốn chứng tỏ ta đây code siêu, khó hiểu biến, goto gosub lung tung.
Nhảm. . .
dạ em xin lỗi, e mới tìm hiểu nên chưa biết code thế nào.
 
Upvote 0
Bạn thử:
obj.WaitUntil (obj.FindElementByClass("quantumWizButtonPaperbuttonLabel"))

Hoặc:
PHP:
Dim t As Date, Cls As Object
t = Timer
Do
    DoEvents
    On Error Resume Next
    Set Cls = obj.FindElementByClass("quantumWizButtonPaperbuttonLabel")
    On Error GoTo 0
    If Timer - t >= 10 Then Exit Do
Loop While Cls Is Nothing
'-------
Set Cls = Nothing
a ơi, đoạn trên thì nó báo đối tượng không được hỗ trợ, còn đoạn dưới thì e kb gắn vô code e ntn
 
Upvote 0
Bạn muốn học SeleniumBasic thì vào Path, tìm file ví dụ mà học. Có tất cả trong đấy
"C:\Users\<UserProfile>\AppData\Local\SeleniumBasic\Examples\Excel"
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom