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
 
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 ạ.
1/ Chạy xong 10 sub mất khoảng vài phút, nếu Sử dụng ProgressBar sẽ làm cho File chậm thêm, nhất là cái vụ này "Chạy hết thanh sau đó chạy lặp lại bao giờ xong 10 công việc" thì càng làm cho File chậm chạp thêm.
2/ Tốt nhất là Sử dụng MsgBox, khi chạy xong 10 code thì hiện thông báo "Hoàn Thành Code" để người dùng nhận biết.
 
Upvote 0
1/ Chạy xong 10 sub mất khoảng vài phút, nếu Sử dụng ProgressBar sẽ làm cho File chậm thêm, nhất là cái vụ này "Chạy hết thanh sau đó chạy lặp lại bao giờ xong 10 công việc" thì càng làm cho File chậm chạp thêm.
2/ Tốt nhất là Sử dụng MsgBox, khi chạy xong 10 code thì hiện thông báo "Hoàn Thành Code" để người dùng nhận biết.

Cảm ơn chú be09 đã góp ý,
OT đã làm như bước 2 nhưng để chờ đến lúc kết thúc Msgbox hiện đã xong người dùng không biết đến bao giờ code mới chạy xong, do đó OT muốn sử dụng form hiện thị trong quá trình chạy code để người dùng biết được là code đang chạy, không được thao tác gì thêm...
Nếu Sử dụng ProgressBar sẽ làm cho File chậm thêm 1 chút so với thời gian chờ dài thì cũng có thể chấp nhận được chú ạ.
 
Upvote 0
Cảm ơn chú be09 đã góp ý,
OT đã làm như bước 2 nhưng để chờ đến lúc kết thúc Msgbox hiện đã xong người dùng không biết đến bao giờ code mới chạy xong, do đó OT muốn sử dụng form hiện thị trong quá trình chạy code để người dùng biết được là code đang chạy, không được thao tác gì thêm...
Nếu Sử dụng ProgressBar sẽ làm cho File chậm thêm 1 chút so với thời gian chờ dài thì cũng có thể chấp nhận được chú ạ.
Thì cho MsgBox vào cuối mỗi đoạn code CongViec_1, CongViec_2.........rồi chịu khó nhấn nút OK cho mỗi lần hiện MsgBox.
Lúc code đang chạy thì đâu có thao tác gì được nữa và phải chờ cho code chạy xong mới thao tác được.
Con là OT à?
 
Upvote 0
@NHN_Phương có thể tham khảo code của tôi. Đơn giản và dễ sử dụng


Lời khuyên sử dụng ProcessBar khi:
+ Số lượng xử lý ít, số lượng xử lý lớn có vòng lặp sẽ làm chậm ứng dụng gấp nhiều lần. Vì vấn đề nằm ở DoEvents, Lệnh này sẽ làm trì trệ tiến trình VBA
+ ProcessBar được lập trình hoạt động ngoài tiến trình chính. Là một Add-in hoạt động đơn lẻ
 

File đính kèm

  • ProgressBar.xlsm
    27 KB · Đọc: 68
Upvote 0
Cảm ơn chú be09 đã góp ý,
OT đã làm như bước 2 nhưng để chờ đến lúc kết thúc Msgbox hiện đã xong người dùng không biết đến bao giờ code mới chạy xong, do đó OT muốn sử dụng form hiện thị trong quá trình chạy code để người dùng biết được là code đang chạy, không được thao tác gì thêm...
Nếu Sử dụng ProgressBar sẽ làm cho File chậm thêm 1 chút so với thời gian chờ dài thì cũng có thể chấp nhận được chú ạ.
Nếu muốn lặp thế, kiểu giống của Windows, thì thường người ta dùng kiểu giống Flash - tức là cứ chạy đi chạy lại cho vui
 
Upvote 0
Chạy mấy chương trình kiểu giết thời gian mà chèn mấy cái Msgbox thì thế nào cũng xẩy ra những tình huống cười ra nước mắt. Chẳng hạn bạn áng chừng là nó sẽ xong trong 15 phút nên tranh thủ đi toilet, ai dè nó bung ra 1 cái Msgbox chờ bạn xác nhận rồi mới tiếp tục làm tiếp. Trút bầu tâm sự xong rồi và tưởng quay lại là tận hưởng thành quả nhưng hỡi ôi "Yes to do... No to do..." :rolleyes: . Tôi lúc trước gặp mấy tình huống này hoài nên rất hiểu cái cảm giác cực thốn mà nó đem lại --=0 .

Chẳng có mấy ai mà ngồi nhìn chăm chăm vô cái màn hình đến ngu cả người để chờ nhấn Msgbox đâu trừ những phần mềm có xuất thông tin (đồ thị, thông tin...) hoặc đang debug theo thời gian. Muốn tránh bị treo thì cứ làm cái biến thời gian, sau mỗi bao nhiêu thời gian thì cập nhật tiến độ. Sau đây là ngu ý của tôi:
PHP:
Sub Main
    Dim t As Date

    For i=1 To 100000000
        '........^%$FDS435r.................
        'Trên đây là code làm việc của bạn
        If t<Now Then
            t=Now+0.000694444444444
            'Cập nhật progress
        End If
    Next
    Msgbox "xong"
End Sub
Theo ví dụ này cứ sau mỗi ít nhất 01 phút thì cái này nó sẽ cho phép làm cái gì đó. Lưu ý vòng lặp là minh họa một tiến trình lâu lắc nào đó của bạn chứ đừng dại đưa vô nhé. Cái này tôi thử nghiệm trên LibreOffice với ngôn ngữ Basic nên VBA mà sao thì tôi cũng pó phép.
 
Lần chỉnh sửa cuối:
Upvote 0
Thì cho MsgBox vào cuối mỗi đoạn code CongViec_1, CongViec_2.........rồi chịu khó nhấn nút OK cho mỗi lần hiện MsgBox.
Lúc code đang chạy thì đâu có thao tác gì được nữa và phải chờ cho code chạy xong mới thao tác được.
Dạ cách này không ổn chú be09 ạ, mục đích của con muốn gom 10 công việc vào làm một để cho người dùng làm một thao tác rồi làm gì đó hoặc là đi uống nước chẳng hạn :D
Giờ mà bắt ngồi xác nhận từng công việc một thì cải lùi rồi chú.
Dạ vâng con là Oanh Thơ (OT) ạ, con cảm ơn chú đã quan tâm.

@NHN_Phương có thể tham khảo code của tôi. Đơn giản và dễ sử dụng
Lời khuyên sử dụng ProcessBar khi:
+ Số lượng xử lý ít, số lượng xử lý lớn có vòng lặp sẽ làm chậm ứng dụng gấp nhiều lần. Vì vấn đề nằm ở DoEvents, Lệnh này sẽ làm trì trệ tiến trình VBA
+ ProcessBar được lập trình hoạt động ngoài tiến trình chính. Là một Add-in hoạt động đơn lẻ
Xin chào HeSanbi
Cảm ơn Bạn đã giúp đỡ, OT chưa hiểu cách ứng dụng phương pháp của bạn.
Mong muốn của OT khi bắt đầu chạy thì hiện form hiển thị gì đó để người dùng biết là code đang quá trình chạy, và chạy xong thì form tự đóng.
OT thử với tập tin của bạn thì chưa đúng ý OT lắm, rất mong được bạn và mọi người chỉ dẫn thêm.

Nếu muốn lặp thế, kiểu giống của Windows, thì thường người ta dùng kiểu giống Flash - tức là cứ chạy đi chạy lại cho vui
Cảm ơn bạn đã quan tâm , hình như là vậy bạn ạ.
Nếu có thể mong bạn giúp đỡ thêm.
Bài đã được tự động gộp:

Chạy mấy chương trình kiểu giết thời gian mà chèn mấy cái Msgbox thì thế nào cũng xẩy ra những tình huống cười ra nước mắt. Chẳng hạn bạn áng chừng là nó sẽ xong trong 15 phút nên tranh thủ đi toilet, ai dè nó bung ra 1 cái Msgbox chờ bạn xác nhận rồi mới tiếp tục làm tiếp. Trút bầu tâm sự xong rồi và tưởng quay lại là tận hưởng thành quả nhưng hỡi ôi "Yes to do... No to do..." :rolleyes: . Tôi lúc trước gặp mấy tình huống này hoài nên rất hiểu cái cảm giác cực thốn mà nó đem lại --=0 .
..
Cảm ơn Bạn đã quan tâm, một câu chuyện vui nhưng trong thực tế là vậy.

Sau đây là ngu ý của tôi:
PHP:
Sub Main
    Dim t As Date

    For i=1 To 100000000
        If t<Now Then
            t=Now+0.000694444444444
            'Cập nhật progress
        End If
    Next
    Msgbox "xong"
End Sub
Theo ví dụ này cứ sau mỗi ít nhất 01 phút thì cái này nó sẽ cho phép làm cái gì đó. Lưu ý vòng lặp là minh họa một tiến trình lâu lắc nào đó của bạn chứ đừng dại đưa vô nhé. Cái này tôi thử nghiệm trên LibreOffice với ngôn ngữ Basic nên VBA mà sao thì tôi cũng pó phép.
Cái này OT chưa hiểu lắm.
Nếu có thể mong bạn chỉ dẫn cụ thể chi tiết hơn , nếu có tập tinh đính kèm thì tốt quá ạ.
Cảm ơn bạn nhiều.
 
Upvote 0
Tải lại và click vào Kiểm thử xem đúng không OT
Vì code tôi vừa mới viết, có thể chưa hoàn thiện.


Ví dụ thêm:
JavaScript:
Sub Works()
  ProgressBar.Start
  ProgressBar.Working 0, , "Work1"
  Call Work1
  ProgressBar.Working 10, , "Work2"
  Call Work2
  ProgressBar.Working 20, , "Work3"
  Call Work3
  ProgressBar.Working 30, , "Work4"
  Call Work4
  ProgressBar.Working 40, , "Work5"
  Call Work5
  ProgressBar.Working 50, , "Work6"
  Call Work6
  ProgressBar.Working 60, , "Work7"
  Call Work7
  ProgressBar.Working 70, , "Work8"
  Call Work8
  ProgressBar.Working 80, , "Work9"
  Call Work9
  ProgressBar.Working 90, , "Work10"
  Call Work10
  ProgressBar.Finish
End Sub


Ví dụ vòng lặp:
JavaScript:
Sub Works()
  ''Có 2 công việc thì đặt là 2
  ProgressBar.Start 2
  Call Work1
  Call Work2
  ProgressBar.Finish
End Sub

Sub Work1()
  Dim i, j, t, l
  Const WorkName = "Work1"
  ProgressBar.Working 0, , WorkName
  ''
  'Your Code
  ''
  ProgressBar.Working 5
  ''
  'Your Code
  ''
  '' Ví du vong lap:
  l = 1500
  For i = 1 To l
    ''
    'Your Code
    ''
    ProgressBar.Working i, l
    DoEvents
  Next
  ''
  'Your Code
  ''
  ProgressBar.Working 100
End Sub

Sub Work2()
  Dim i, j, t, l
  Const WorkName = "Work2"
  ProgressBar.Working 0, , WorkName
  ''
  'Your Code
  ''
  ProgressBar.Working 5
  ''
  'Your Code
  ''
  '' Ví du vong lap:
  l = 1500
  For i = 1 To l
    ''
    'Your Code
    ''
    ProgressBar.Working i, l
    DoEvents
  Next
  ''
  'Your Code
  ''
  ProgressBar.Working 100
End Sub
 

File đính kèm

  • ProgressBar2.xlsm
    26.2 KB · Đọc: 30
Lần chỉnh sửa cuối:
Upvote 0
Xin chào HeSanbi
Cảm ơn Bạn đã giúp đỡ, OT chưa hiểu cách ứng dụng phương pháp của bạn.
Mong muốn của OT khi bắt đầu chạy thì hiện form hiển thị gì đó để người dùng biết là code đang quá trình chạy, và chạy xong thì form tự đóng.
OT thử với tập tin của bạn thì chưa đúng ý OT lắm, rất mong được bạn và mọi người chỉ dẫn thêm.

Em làm theo code cua HeSanbi là phù hợp nhất rồi đó.
Cách làm hiểu theo cách đơn giản là:
Có bao nhiêu thủ tục (Sub) cần chạy thì sẽ chia đều tổng tiến trình cho số lượng sub đó.
Ví dụ: chạy 10 cái Sub thì tổng thanh tiến trình là 100% chia cho 10 => mỗi Sub chạy hoàn thành sẽ chiếm 10% thanh tiến trình, chạy hết 10 Sub là đủ 100% thanh tiến trình.
Cách này không cần chạy lại thanh tiến trình cho đến khi hết Sub.
Với cách làm này thì có Sub chạy mất thời gian hơn Sub khác nhưng vẫn chỉ chiếm 10% của thanh tiến trình, thấy không hơp lý nhưng khi chạy trong ứng dụng , người dùng sẽ không để ý kỹ đến vấn đề này lắm nên áp dụng vẫn ok.
 
Upvote 0
Tải lại và click vào Kiểm thử xem đúng không OT
Vì code tôi vừa mới viết, có thể chưa hoàn thiện.


Ví dụ thêm:
JavaScript:
Sub Works_1()
  ProgressBar.Start
  ProgressBar.Working 0, , "Work1"
  Call Work1
  ProgressBar.Working 10, , "Work2"
  Call Work2
  ProgressBar.Working 20, , "Work3"
  Call Work3
  ProgressBar.Working 30, , "Work4"
  Call Work4
  ProgressBar.Working 40, , "Work5"
  Call Work5
  ProgressBar.Working 50, , "Work6"
  Call Work6
  ProgressBar.Working 60, , "Work7"
  Call Work7
  ProgressBar.Working 70, , "Work8"
  Call Work8
  ProgressBar.Working 80, , "Work9"
  Call Work9
  ProgressBar.Working 90, , "Work10"
  Call Work10
  ProgressBar.Finish
End Sub


Ví dụ vòng lặp:
JavaScript:
Sub Works()
  ''Có 2 công việc thì đặt là 2
  ProgressBar.Start 2
  Call Work1
  Call Work2
  ProgressBar.Finish
End Sub

Sub Work1()
  Dim i, j, t, l
  Const WorkName = "Work1"
  ProgressBar.Working 0, , WorkName
  ''
  'Your Code
  ''
  ProgressBar.Working 5
  ''
  'Your Code
  ''
  '' Ví du vong lap:
  l = 1500
  For i = 1 To l
    ''
    'Your Code
    ''
    ProgressBar.Working i, l
    DoEvents
  Next
  ''
  'Your Code
  ''
  ProgressBar.Working 100
End Sub

Sub Work2()
  Dim i, j, t, l
  Const WorkName = "Work2"
  ProgressBar.Working 0, , WorkName
  ''
  'Your Code
  ''
  ProgressBar.Working 5
  ''
  'Your Code
  ''
  '' Ví du vong lap:
  l = 1500
  For i = 1 To l
    ''
    'Your Code
    ''
    ProgressBar.Working i, l
    DoEvents
  Next
  ''
  'Your Code
  ''
  ProgressBar.Working 100
End Sub
End Sub

Cảm ơn bạn nhiều,
Nghĩa là trong mỗi thủ tục nhỏ đều phải thêm các dòng lệnh :
Mã:
...
Const WorkName = "Work1"
  ProgressBar.Working
....
Vào phải không bạn? Nghĩa là vẫn phải sửa hay thêm gì đó vào các thủ tục con (CongViec1,CongViec2,...,CongViec10)?
Có thể khai báo và giải quyết các vấn đề trong một thủ tục mẹ "Tong_CongViec" được không ạ?

Em làm theo code cua HeSanbi là phù hợp nhất rồi đó.
Cách làm hiểu theo cách đơn giản là:
Có bao nhiêu thủ tục (Sub) cần chạy thì sẽ chia đều tổng tiến trình cho số lượng sub đó.
Ví dụ: chạy 10 cái Sub thì tổng thanh tiến trình là 100% chia cho 10 => mỗi Sub chạy hoàn thành sẽ chiếm 10% thanh tiến trình, chạy hết 10 Sub là đủ 100% thanh tiến trình.
Cách này không cần chạy lại thanh tiến trình cho đến khi hết Sub.
Với cách làm này thì có Sub chạy mất thời gian hơn Sub khác nhưng vẫn chỉ chiếm 10% của thanh tiến trình, thấy không hơp lý nhưng khi chạy trong ứng dụng , người dùng sẽ không để ý kỹ đến vấn đề này lắm nên áp dụng vẫn ok.
Xin chào ongke0711,
Cảm ơn Anh đã quan tâm tham gia và góp ý cho OT ạ.
 
Upvote 0
Xin chào HeSanbi
Cảm ơn Bạn đã giúp đỡ, OT chưa hiểu cách ứng dụng phương pháp của bạn.
Mong muốn của OT khi bắt đầu chạy thì hiện form hiển thị gì đó để người dùng biết là code đang quá trình chạy, và chạy xong thì form tự đóng.
OT thử với tập tin của bạn thì chưa đúng ý OT lắm, rất mong được bạn và mọi người chỉ dẫn thêm.
Có hai ví dụ NHN_Phương hiểu thế nào thì làm như vậy
 
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
1598776834936.png

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ả,

1598777029789.png
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 ạ.
 

File đính kèm

  • tb_chaydangchaycode.xlsm
    20.5 KB · Đọc: 26
Upvote 0
Thử xem
Mã:
Sub Tong_congviec()
    UserForm1.Show
    DoEvents
    Call congviec_1
    Call congviec_2
    UserForm1.Hide
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then Cancel = True
End Sub
 
Upvote 0
Thử xem
Mã:
Sub Tong_congviec()
    UserForm1.Show
    DoEvents
    Call congviec_1
    Call congviec_2
    UserForm1.Hide
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then Cancel = True
End Sub
Con cảm ơn bác Siwtom nhiều ạ,
Bác tham gia thì con cảm thấy yên tâm lắm ạ.
---
Bác ơi với cách làm này của con, Bác thấy có vấn đề gì không ạ, nếu Bác có phương pháp nào khác Bác chỉ cho con với.
Chúc Bác nhiều sức khỏe ạ.
 
Upvote 0
1598777029789.png
Nếu vậy vì sao không thông báo lên ngay trên cái nút Button1 kia, Mà phải sử dụng Form.
JavaScript:
Sub Works()
On Error Goto E
Sheets("Sheet1").CommandButton1.Caption = "Vui lòng đợi"
Work1
Work2
Workxxxx
E:
Sheets("Sheet1").CommandButton1.Caption = "Thực hiện"
End Sub
 
Upvote 0
Nếu vậy vì sao không thông báo lên ngay trên cái nút Button1 kia, Mà phải sử dụng Form.
JavaScript:
Sub Works()
On Error Goto E
Sheets("Sheet1").CommandButton1.Caption = "Vui lòng đợi"
Work1
Work2
Workxxxx
E:
Sheets("Sheet1").CommandButton1.Caption = "Thực hiện"
End Sub
Cảm ơn HeSanbi đã gợi ý,
Cũng là một ý tưởng hay nhưng cái nút "CommandButton" không phải lúc nào nó cũng đủ nội dung để chưá hết tất cả nội dung thông báo được phải không bạn, hơn nữa nó không đập vào mắt người dùng một cách rõ rệt hơn phải không ạ?
Tạm thời tới thời điểm này OT thấy cách làm ở #15 và cách xử lý như #16 của bác Siwtom là có vẻ ổn nhất và dễ áp dụng.
 
Upvote 0
Bác ơi với cách làm này của con, Bác thấy có vấn đề gì không ạ, nếu Bác có phương pháp nào khác Bác chỉ cho con với.
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.

Nếu vậy vì sao không thông báo lên ngay trên cái nút Button1 kia, Mà phải sử dụng Form.
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.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom