Tạo "ProgressBar" khi chạy nhiều thủ tục ?

Liên hệ QC

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,894
Được thích
1,213
Xin chào các bạn,

Giả sử tôi có có 10 sub macro ứng với mỗi sub là một công việc.
Khi tôi thực hiện toàn bộ 10 công việc cùng một lúc tôi đưa cả 10 sub công việc này vào trong 1 sub Tổng công việc:

Mã:
Sub Tong_CongViec()
    Call CongViec_1
    Call CongViec_2
    Call CongViec_3
    ...
    Call CongViec_10
End Sub

Để chạy xong 10 sub này thì thời gian cũng mất khoảng vài phút do đó tôi muốn có 1 form (như hình ảnh bên dưới) hiển thị lên khi bắt đầu thực hiện chạy code cho người dùng biết là code vẫn đang thực hiện trong quá tình thực hiện và đến khi nào kết thúc thì form tự thoát.
Có thể form này không biết được tiến độ % là bao nhiêu do chạy nhiều sub nội dung công việc khác nhau do đó tôi muốn cái "ProgressBar" chạy hết thanh sau đó chạy lại cứ như vậy bao giờ xong 10 công việc thì nó tự đóng ạ.

Nhờ các bạn giúp đỡ tôi xử lý trường hợp trên với ạ.

1598716301036.png
 
Thực ra làm ProgressBar cho trường hợp tổng quát không dễ. Dễ nhất là trong 1 sub chạy vd. 100 000 vòng FOR. Lúc này code trong vòng FOR cứ "i chia hết cho 1000" thì tăng ProgressBar 1%.

Bạn đã từng xem ProgressBar chưa? Thậm chí của bác Bill nhiều khi tôi thấy tăng tăng tăng, rồi sau đó lùi chút ít, rồi lại tăng. Cái quan trọng là phải có được những thời điểm mà khi đó ta tăng ProgressBar, và ta xác định được lượng tăng. Như ở trên tăng 100 cho i = 100 000, có nghĩa là cứ 1000 thì tăng 1. Còn trong trường hợp của bạn thì lâu là do gì? Nếu có vòng lặp thì dễ rồi. Ngoài ra có 10 sub nhưng các sub có thể không như nhau, chắc gì kẻ tám lạng người nửa cân. Code 5 phút đeo huy hiệu "sub", nhưng code 5 giây cũng đeo huy hiệu "sub". Nếu có 9 sub thực hiện trong 1s và 1 sub đầu tiên thực hiện trong 10 phút thì sẽ thế nào? Nếu làm theo kiểu sau mỗi sub tăng ProgressBar thêm 10 thì hơi kỳ. ProgressBar đóng băng 10 phút rồi hiện 10, sau đó 1 chớp mắt thì đã là 100. Nếu làm kiểu sau sub 1 tăng 91 còn sau mỗi sub sau tăng 1 thì cũng thế: ProgressBar đóng băng 10 phút sau đó phụt từ "không có gì" tới 91 để sau tích tắc thay đổi chóng mặt 92, 93, ..., 99, 100.

Tóm lại bạn phải biết lượng việc (gần đúng, vd. 100 000), và bao nhiêu lượng việc (gần đúng, vd. 1000) thì là 1%. Rồi còn phải xác định các thời điểm tăng ProgressBar để biết ở các thời điểm đó phải tăng bao nhiêu (gần đúng). Làm trong mỗi trường hợp cụ thể thôi. Làm gì có chuyện 1 code tổng quát được. Chỉ có nguyên tắc tổng quát như tôi đã viết. Thế thôi.


Cũng có thể Button chỉ là ví dụ. Trên thực tế có thể người ta dùng phím tắt. Hoặc chạy code khi thỏa mãn điêu kiện gì đó, vd. khi có sự thay đổi trong F10 thỏa đk XYZ chẳng hạn.
Cảm ơn bác Siwtom đã phân tích cho con hiểu rõ hơn.
Vâng đúng là mỗi sub của con là một công việc khác nhau, như: kiểm tra trước khi chạy code, xóa dữ liệu cũ, lấy dữ liệu từ nhiều công việc (nhiều file) về, xử lý dữ liệu, định dạng,... Mỗi cái đều có sự nhanh chậm khác nhau do đó việc sử dụng "ProgressBar" trong trường hợp này là rất khó và không khả thi.

Và con cũng đã tìm ra một cách như đã nêu ở bài 15,16 cách này cũng rất ổn.

Tuy nhiên để trang trí thêm có thể thiết kế được thêm cái thanh màu sắc gì đó trên form cho nó chuyển động để thể hiện là máy tính vẫn đang làm việc tốt không bị treo được không Bác?
Con ví dụ là thêm cái đồng hồ thể hiện số thời gian hiện tại của máy tính nhảy theo số giây, hoặc đồng hồ đo thời gian chạy code bắt đầu từ 0 đến lúc đóng form, hoặc thanh màu sắc chạy qua lại ạ.
Nếu Bác có hứng thú và thời gian Bác thiết kế giúp con ạ.
Con cảm ơn bác Siwtom
 
Upvote 0
Cảm ơn bác Siwtom đã phân tích cho con hiểu rõ hơn.
Vâng đúng là mỗi sub của con là một công việc khác nhau, như: kiểm tra trước khi chạy code, xóa dữ liệu cũ, lấy dữ liệu từ nhiều công việc (nhiều file) về, xử lý dữ liệu, định dạng,... Mỗi cái đều có sự nhanh chậm khác nhau do đó việc sử dụng "ProgressBar" trong trường hợp này là rất khó và không khả thi.

Và con cũng đã tìm ra một cách như đã nêu ở bài 15,16 cách này cũng rất ổn.

Tuy nhiên để trang trí thêm có thể thiết kế được thêm cái thanh màu sắc gì đó trên form cho nó chuyển động để thể hiện là máy tính vẫn đang làm việc tốt không bị treo được không Bác?
Con ví dụ là thêm cái đồng hồ thể hiện số thời gian hiện tại của máy tính nhảy theo số giây, hoặc đồng hồ đo thời gian chạy code bắt đầu từ 0 đến lúc đóng form, hoặc thanh màu sắc chạy qua lại ạ.
Nếu Bác có hứng thú và thời gian Bác thiết kế giúp con ạ.
Con cảm ơn bác Siwtom
Bạn chạy thử, ước lượng thời gián rồi chia progress bar 100% cho từng sub nhỏ , rồi ttong các sub nhỏ cũng chí thành từng công đoạn % , ví dụ 3 công đoạn đọc , tính toán, trả kết quả của cấc subs này...

Bạn nên upload file mẫu lên , còn không chỉ nhận được lời tư vấn chung chung thôi

Mà công việc gì mà chạy mấy tiếng vậy
Tôi có thấy các bài toán mô phỏng chạy nhiều tiếng , họ cũng có kiểu tiên trình vậy kèm các dòng labels chay đến đâu.
 
Upvote 0
Đối với OT chắc việc sư dụng "ProgressBar" là sẽ rất khó, do vậy OT làm như sau chođơn giản, OT vẽ một form & code như sau:

View attachment 244475

Với lại OT cũng muốn vô hiệu hóa nút close trong quá trình hiện form , nghĩa là vẫn hiển thị nút close nhưng khi kích vào không tác dụng:
OT thử đoạn code sau nhưng form vẫn đóng:

Demo cho em cách làm Progress bar đơn giản, không dùng ActivieX. Tất nhiên là việc hiển thị % sẽ không chính xác cho từng Sub vì muốn phân bổ chính xác thời gian chạy cho từng Sub (kiểu dùng vòng lặp) sẽ làm nặng nề thêm code khi chạy mà người thì dùng không thích điểm này. Do đó làm cách đơn giản nhưng cũng giảm được tâm lý chờ đợi cho người dùng, biết mình đang xử lý đến đâu cũng tạm chấp nhận được.
File đính kèm.


 

File đính kèm

  • Progressbar_demo.xlsm
    37.5 KB · Đọc: 68
Lần chỉnh sửa cuối:
Upvote 0
...
Bạn nên upload file mẫu lên , còn không chỉ nhận được lời tư vấn chung chung thôi
Mà công việc gì mà chạy mấy tiếng vậy
..
Cảm ơn bạn đã quan tâm
OT muốn trường hợp tổng quát bạn ah vì OT muốn áp dụng chung cho rất nhiều trường hợp, ở bài 1 OT có nói code chạy mất vài phút thôi ạ nhưng vẫn cần sự hiển thị thông báo cho người dùng biết..

Demo cho em cách làm Progress bar đơn giản, không dùng ActivieX. Tất nhiên là việc hiển thị % sẽ không chính xác cho từng Sub vì muốn phân bổ chính xác thời gian chạy cho từng Sub (kiểu dùng vòng lặp) sẽ làm nặng nề thêm code khi chạy mà người thì dùng không thích điểm này. Do đó làm cách đơn giản nhưng cũng giảm được tâm lý chờ đợi cho người dùng, biết mình đang xử lý đến đâu cũng tạm chấp nhận được.
File đính kèm.

Xin chào ongke0711,
Cảm ơn anh đã quan tâm & gợi ý cho OT một cách làm cũng khá dễ áp dụng ạ.
Chúc anh tuần mới vui khỏe.
OT
 
Upvote 0
Quánh dấu cái này thôi... cái tìm bữa giờ ... Cám ơn GPE
 
Upvote 0
Xin chào các bạn,
Đối với OT chắc việc sư dụng "ProgressBar" là sẽ rất khó, do vậy OT làm như sau chođơn giản, OT vẽ một form & code như sau:
Mã:
Private Sub UserForm_Initialize()
    Dim sThongbao As String
    sThongbao = "Xin vui long cho doi trong it phut... !"
    Me.Label1.Caption = sThongbao
End Sub
View attachment 244475

Khi show form lên trong cửa sổ vba thì hiển thị đúng ý OT như trên không vấn đề gì, nhưng khi OT ghép thủ tục hiện form vào code sau :
Mã:
Sub Tong_congviec()
    UserForm1.Show
    Call congviec_1
    Call congviec_2
    UserForm1.Hide
End Sub

Sub congviec_1()
    Dim i As Long
    For i = 1 To 100000
        Cells(i, 1) = "dong " & i
    Next i
End Sub

Sub congviec_2()
    Dim i As Long
    For i = 1 To 1000
        Cells(i, 2) = "dong " & i
    Next i
End Sub

Sau đó chạy "Tong_congviec" thì label trong form không hiển thị nội dung gì cả,

View attachment 244476
Với lại OT cũng muốn vô hiệu hóa nút close trong quá trình hiện form , nghĩa là vẫn hiển thị nút close nhưng khi kích vào không tác dụng:
OT thử đoạn code sau nhưng form vẫn đóng:
Mã:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then exit sub
End Sub
Nhờ các bạn xem & giúp đỡ OT xử lý các vấn đề trên với ạ.

Con chào bác @batman1 ,
Bác ơi bài này của con có thể thêm bạn Vẹt đang bay trong chủ bài viết (link bên dưới ) của Bác vào được không Bác.
Con muốn form nó động hơn thể hiện trạng thái đang chờ , chứ không phải máy tính đang bị treo ạ.
Khi nào Bác có hứng thú, Bác xem & giúp con giúp con với ạ.
Cảm ơn Bác Siwtom

 
Upvote 0
Web KT
Back
Top Bottom