- Tham gia
- 12/8/06
- Bài viết
- 1,875
- Được thích
- 2,480
Cái này quả thật nhìn rất hay! Có điều kỹ thuật tạo ra nó thật mới lạ (nhìn vào không hiểu gì cả)...Mình sưu tầm được một file progress bar này rất hay, không sử dụng userform gửi lên mọi người tham khảo.
Cái này quả thật nhìn rất hay! Có điều kỹ thuật tạo ra nó thật mới lạ (nhìn vào không hiểu gì cả)...
Bạn yeudoi có thể hướng dẩn đôi chút được không, chẳng hạn: Cái progress bar thực chất là cái gì? Picture? Shape? hay là.... ???
Hèn nào nhìn lòi mắt cũng không biết file này đang "giở trò" gì...Cái này tác giả sử dụng các hàm Windows API để tạo, tất cả không sử dụng đối tượng nào của Excel cả
Có xem rồi (hiểu được mới lạ đó)... Hy vọng vài năm nữa sẽ HIỂU... Ẹc... Ẹc...Để tìm hiểu, anh vào môi trường VBE để xem code, tác giả đã giải thích rất rõ.
Mạn phép mượn file của anh sealand để chế tác thêm (dùng hàm API)Mình tham gia thêm là tận dụng thanh StatusBar vừa nhanh, gọn không phải tạo form
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub tbao()
Dim ch As String, I As Long
ch = ""
For I = 1 To 100
ch = String(I, Chr(187))
Application.StatusBar = I & "%" & ch
Sleep 20
Next
Application.StatusBar = "Done"
End Sub
Em chỉ biết nó dùng để "TẠM DỪNG"... còn số 20 = bao nhiêu đơn vị thời gian thì em không rõ (chỉ thí nghiệm, gia giãm rồi tìm ra số vừa ý nhất mà thôi)To NDU:
Trời cái mình cần không ngờ nó lại ở đây. Cho hỏi thêm lệnh sleep 20 có phải tạm dừng chương trình trong 20 dv thời gian không.
Hôm trước mình có giới thiệu cách tạo Progress bar theo kiểu "củ chuối". Hôm nay tình cờ phát hiện được Control Progress (Microsoft Progress Bar Control 6.0). Dùng Control này tạo Progress bar rất nhanh, dễ hiểu.
Xin chia sẻ cùng các bạn.
TDN
Nhờ các bạn làm giúp 1 code Progress Bar theo thời gian chạy 1 hay nhiều code nào đó.Mình tải vẫn bình thường. Bạn thử tải File này xem sao
TDN
Dim R As Long
Sub Test()
R = 3000
Application.ScreenUpdating = False
Load Remove
Application.OnTime Now + TimeValue("00:00:01"), "DeleteRow"
Remove.Show
Application.ScreenUpdating = True
MsgBox "Da xoa thanh cong " & R & " dong !", , "Tedaynui"
End Sub
Private Sub VPercent(ByVal Num%, ByVal Row%)
Dim i%, S$
S = " "
S = S & WorksheetFunction.Round(Str(Num / Row * 100), 1) & "%"
Remove.P3.Caption = S
Remove.P2.Caption = S
Remove.Label.Caption = "Dang xoa dong : " & Num
Remove.P2.Width = Remove.P3.Width / Row * Num
Remove.VFrame.Repaint
End Sub
Sub DeleteRow()
For i = 1 To R
Sheet1.Rows(R - i + 1).Delete
VPercent i, R
Next
Unload Remove
End Sub
Sub ChayThu()
Dim iR&, eR&, k&
Dim Arr
Dim t
t = Timer
eR = 50000
ReDim Arr(1 To eR, 1 To 1)
For iR = 1 To eR
Arr(iR, 1) = iR / eR * 1000
Next iR
For k = 1 To 100
Cells(1, k).Resize(eR, 1) = Arr
Next k
MsgBox Timer - t
End Sub
Sub ChayThu()
Dim iR&, eR&, k&
Dim Arr
Dim t
t = Timer
eR = 50000
ReDim Arr(1 To eR, 1 To 1)
For iR = 1 To eR
Arr(iR, 1) = iR / eR * 1000
Next iR
For k = 1 To 100
Cells(1, k).Resize(eR, 1) = Arr
Next k
MsgBox Timer - t
End Sub
ThuNghi thử cái Progess Bar tự chế của tôi xem thế nào nhé:Sub ChayThu trên tôi chạy xong khoảng 4 s, nhờ các bạn viết cho 1 code chạy progress bar khi bắt đầu chạy code ChayThu và chấm dứt khi hoàn thành code chayThu với mỗi bước là 1/10 s hay 1/100 s để có thể vận dụng với những sub nhanh hơn.PHP:Sub ChayThu() Dim iR&, eR&, k& Dim Arr Dim t t = Timer eR = 50000 ReDim Arr(1 To eR, 1 To 1) For iR = 1 To eR Arr(iR, 1) = iR / eR * 1000 Next iR For k = 1 To 100 Cells(1, k).Resize(eR, 1) = Arr Next k MsgBox Timer - t End Sub
Cám ơn.
NDU làm giúp cụ thể Progress Bar cho code trên giúp luôn đi.
Xem file mà chưa chế biến ra được. Cũng tựa như vậy nhưng chưa biết quy % hoàn thành code sang % chạy progress.
Chỉ cần progress có chạy là OK, kg cần hiển thị phần trăm hay msgbox gì cả.
Cám ơn rất nhiều.
For iR = 1 To eR
Arr(iR, 1) = iR / eR * 1000
Next iR
For k = 1 To 100
Cells(1, k).Resize(eR, 1) = Arr
Next k
Private Sub cmdSrch_Click()
Dim lR&, lC&, eR&, eC&, k&, lCount&, n&
Dim dW As Double, Item As Double, lblW As Double, t As Double
Dim Arr
t = Timer
eR = 5000
eC = 100
dW = lblProg1.Width
lCount = eR * eC
ReDim Arr(1 To eR, 1 To eC)
For lR = 1 To eR
For lC = 1 To eC
n = n + 1
Item = n / lCount * 1000
Arr(lR, lC) = Item
lblW = n * dW / lCount
lblProg2.Width = lblW
lblProg3.Caption = Format(n / lCount * 100, "#") & " %"
DoEvents
Next
Next
Range("A1").Resize(eR, eC) = Arr
MsgBox Timer - t, , n
End Sub
Code ChayThu trên chỉ là 1 code vd để chạy thôi, thực tế kg phải vậy.Code của ThuNghi được chia làm 2 công đoạn
Công đoạn 1
...
Vậy nên ngoài việc thiết kế Progress bar, ta cũng phải sửa lại code với mục đích CHIA ĐỀU CÔNG VIỆC. Như vậy thì progress bar mới hiển thị 1 cách chính xác được
Lấy ví dụ thế này
----------------------
Lưu ý quan trọng: Việc thiết kế màu mè gì đó luôn là nguyên nhân gây chậm tiến trình. Code trên nếu chạy bình thường mất chừng 3s, nhưng nếu có ProgressBar vào thì sẽ mất 25s
lblProg2.Width = lblW
lblProg3.Caption = Format(n / lCount * 100, "#") & " %"
DoEvents
Không được đâu!Code ChayThu trên chỉ là 1 code vd để chạy thôi, thực tế kg phải vậy.
Muốn là khi bắt đầu chạy code thì ta biết được thời gian bắt đầu.
t=Timer
Khi hoàn thành 1 code nào đó, chưa hẳn là for i hay làm gì thì
Ta có thời gian chạy là timer - t
Vậy chia cái khoản thời gián timer - t thành những khoảng nhỏ (i) để xác định được mà DoEvents.
Yếu cầu là tạo progress theo thời gian thực hiện code.PHP:lblProg2.Width = lblW lblProg3.Caption = Format(n / lCount * 100, "#") & " %" DoEvents
Nó giống như mấy cái progress cài đặt chương trình vậy.
Cám ơn NDU nhiều.