Tạo Progress bar bằng Control

Liên hệ QC

tedaynui

(*_*)
Thành viên danh dự
Tham gia
12/8/06
Bài viết
1,875
Được thích
2,480
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
 

File đính kèm

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.
 

File đính kèm

Upvote 0
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à.... ???
 
Upvote 0
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à.... ???

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ả. File này nếu được sửa lại để hỗ trợ chuỗi Unicode thì sẽ tốt hơn. Để tìm hiểu, anh vào môi trường VBE để xem code, tác giả đã giải thích rất rõ.
 
Upvote 0
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ả
Hèn nào nhìn lòi mắt cũng không biết file này đang "giở trò" gì...
Hic...
Để tìm hiểu, anh vào môi trường VBE để xem code, tác giả đã giải thích rất rõ.
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ôi từng nói tôi là dân ngoại đạo với VBA nên không hiểu cũng là chuyện thường (đừng nói là API gì gì đó <--- càng "điếc" nặng luôn)... Nhưng tôi tin chắc cũng rất nhiều bạn dù rành VBA vẩn không hiểu giống tôi (???)
Vậy bạn TuanVNUNI có thể làm thêm 1 vài ví dụ nho nhỏ về ứng dụng API trong Excel được không?
Rất mong sự trợ giúp của bạn!
 
Upvote 0
Có mấy bài em đã viết khá lâu ở dưới đây:

MsgBoxUni hiển thị font tiếng Việt/Unicode

Lập trình WINDOWS API trên VB/VBA

"HookExcelMessageA"- Thay thế những cảnh báo của Excel bằng nhiều ngôn ngữ

Các bài trên em không giải thích kỹ nên có thể sẽ hơi khó hiểu. Hy vọng có một dịp khác em sẽ viết bài bản từ căn bản hơn một chút :).

Lập trình VBA can thiệp các đối tượng của Excel đã linh động động cho ứng dụng rồi, nếu áp dụng kỹ thuật lập trình Windows API trong VBA nữa thì sức mạnh vô bờ bến.
 
Upvote 0
Ngày xưa có chú khunglongbeo viết từ A-->Z về APIs rồi (bằng tiếng mẹ đẻ). Lặp lại làm gì nữa bà con. Tìm kiếm thôi, google: khunglongbeo + Tuyệt chiêu + api. :)
 
Lần chỉnh sửa cuối:
Upvote 0
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
 

File đính kèm

Upvote 0
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
Mạn phép mượn file của anh sealand để chế tác thêm (dùng hàm API)
PHP:
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
Mới vừa học được 1 chút <--- Nếu code có quá buồn cười xin các cao thủ chỉ giáo thêm
 

File đính kèm

Upvote 0
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.
 
Upvote 0
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.
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)
Em thí nghiệm thấy số 1000 ~ 1 giây ---> Không biết đúng không
 
Upvote 0
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

Microsoft Progress Bar Control 6.0 nó nằm ở đâu nhỉ ? tôi đã tìm trong References - VBAProject nhưng không thấy.
 
Upvote 0
ProgressBar không chạy trên Excell 2010

Chào gia đình GPE!
Mình đã tải ProgressBar này và chạy tốt trên Excel 2003, 2007 nhưng không chạy trên Excel 2010 được. Nhờ các anh chị cho nguyên nhân vì sao vậy? Xin cảm ơn rất nhiều!
 
Upvote 0
Cho mình hỏi sao cái ProgressBar Control(SP6) này chạy trên Excel 2003, 2007 thì rất Tốt nhưng với Excel 2010 thì nó báo không có thư viện?! Cảm ơn nhiều!
 
Upvote 0
Mình tải vẫn bình thường. Bạn thử tải File này xem sao
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 đó.
Trong file của Tedaynui là thực thi xóa dòng theo i và i này cũng chính là để chạy progress
PHP:
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
Muốn thay Sub DeleteRow trên thành Sub khác mà chả liên quan đến i cả.
Cám ơn.
Cụ thể như
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
Hy vọng code này chạy # 5 giây.
 
Lần chỉnh sửa cuối:
Upvote 0
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
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.
Cám ơn.
 
Upvote 0
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
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.
Cám ơn.
ThuNghi thử cái Progess Bar tự chế của tôi xem thế nào nhé:

Untitled.jpg
 

File đính kèm

Upvote 0
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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.

Code của ThuNghi được chia làm 2 công đoạn
Công đoạn 1
Mã:
For iR = 1 To eR
  Arr(iR, 1) = iR / eR * 1000
Next iR
Công đoạn 2:
Mã:
For k = 1 To 100
  Cells(1, k).Resize(eR, 1) = Arr
Next k
Dễ dàng nhận thấy rằng công đoạn 1 rất "nhẹ nhàng" so với công đoạn 2. Vì thế nếu đưa vào Progress bar để hiển thị thì sẽ thiếu chính xác
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
PHP:
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
----------------------
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
 

File đính kèm

Upvote 0
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
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.
PHP:
lblProg2.Width = lblW
      lblProg3.Caption = Format(n / lCount * 100, "#") & " %"
      DoEvents
Yếu cầu là tạo progress theo thời gian thực hiện code.
Nó giống như mấy cái progress cài đặt chương trình vậy.
Cám ơn NDU nhiều.
 
Upvote 0
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.
PHP:
lblProg2.Width = lblW
      lblProg3.Caption = Format(n / lCount * 100, "#") & " %"
      DoEvents
Yếu cầu là tạo progress theo thời gian thực hiện code.
Nó giống như mấy cái progress cài đặt chương trình vậy.
Cám ơn NDU nhiều.
Không được đâu!
Nguyên tắc thiết kế Progress Bar là phải ƯỚC LƯỢNG TRƯỚC TỔNG KHỐI LƯỢNG CÔNG VIỆC
Lấy từng đơn vị công việc chia cho tổng khối lượng để có được tỉ lệ phần trăm hoàn thành
Vì tổng thời gian chạy code ta đâu có biết trước nên yêu cầu của ThuNghi là bất khả thi
Các phần mềm cài đặt cũng làm vậy thôi! Nếu không biết trước tổng khối lượng công việc thì lấy cái gì chia với cái gì đây?
 
Upvote 0
Web KT

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

Back
Top Bottom