Khi mã dài và macro VBA chạy trong vài giây, Excel có thể bị treo hoặc không phản hồi. Ngay cả khi mã hoạt động bình thường, người dùng có thể cho rằng sổ làm việc đã bị treo vì dường như không có gì xảy ra trên màn hình. Cách đơn giản để tránh sự cố này là hiển thị thông báo trực tiếp trên thanh trạng thái của Excel trong khi macro chạy.
Trong hướng dẫn này, chúng tôi sẽ trình bày cách hiển thị thông báo tiến trình trong khi chạy VBA. Bạn không cần UserForm hoặc thanh tiến trình đồ họa. Trong nhiều trường hợp, Application.StatusBar là đủ.
Tại sao nên sử dụng Application.StatusBar?
Excel có thanh trạng thái tích hợp ở cuối cửa sổ ứng dụng. VBA có thể tạm thời thay thế văn bản bình thường trong khu vực đó bằng một thông báo tùy chỉnh.
Điều này có nghĩa là macro của bạn có thể hiển thị các cập nhật như:
- Đang xử lý hàng 10 trên 100
- Đang nhập dữ liệu…
- Viết công thức…
- Hoàn thành 65%
Điều này hữu ích khi bạn muốn người dùng biết macro vẫn đang chạy nhưng không muốn phải tốn thêm công sức xây dựng thanh tiến trình trực quan đầy đủ. Bạn vẫn có thể làm cho tin nhắn có nhiều thông tin hơn bằng cách hiển thị số lượng hàng hoặc tỷ lệ phần trăm, nhưng đây vẫn là giải pháp dựa trên văn bản.
Cú pháp cơ bản:
Để hiển thị thông báo trên thanh trạng thái Excel, hãy sử dụng:
Application.StatusBar = "Processing..."
Khi macro của bạn kết thúc, hãy đặt lại thanh trạng thái bằng:
Application.StatusBar = False
Đặt Application.StatusBar =False khôi phục quyền kiểm soát thanh trạng thái cho Excel, cho phép nó hiển thị lại các thông báo mặc định. Đừng bao giờ bỏ qua bước này.
Ví dụ cơ bản:Thông báo tiến trình đơn giản
Đây là phiên bản cơ bản nhất với thông báo tiến trình đơn giản. Trên thanh trạng thái sẽ hiển thị “Báo cáo đang chạy… vui lòng đợi”.
Sub SimpleStatusBar() Application.StatusBar = "Running report... please wait" ' Simulate work Dim i As Long For i = 1 To 50000 ' Your processing here Next i Application.StatusBar = False ' Restore the status bar MsgBox "Done!" End Sub
Điều này hoạt động nhưng nó chỉ hiển thị một thông báo cố định. Nó cho người dùng biết macro đang chạy nhưng không hiển thị bất kỳ tiến trình thực sự nào.
Hiển thị tiến trình trực tiếp trong vòng lặp
Trong hầu hết các macro thực, bạn xử lý từng hàng, ô, tệp hoặc bản ghi. Điều đó giúp bạn dễ dàng cập nhật thanh trạng thái khi vòng lặp diễn ra.
Sub ShowLoopProgress() Dim i As Long Dim lastRow As Long lastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To lastRow ' Simple action Cells(i, "K").Value = "Processed" ' Update progress message Application.StatusBar = "Processing row " & (i - 1) & " of " & lastRow DoEvents Next i Application.StatusBar = False MsgBox "Task completed!" End Sub
- DoEvents cho phép Excel làm mới màn hình và phản hồi trong khi macro đang chạy
- Không có nó, thanh trạng thái có thể không cập nhật rõ ràng cho đến khi macro kết thúc, đặc biệt là trong các vòng lặp dài
- Đừng lạm dụng nó trong các vòng lặp cực lớn trừ khi cần thiết, vì nó có thể làm chậm quá trình thực thi một chút
Ở dưới cùng, thanh trạng thái hiển thị “Đang xử lý hàng 90 trên 101” .

Thêm thông báo phần trăm
Bạn có thể tùy chỉnh thông báo tiến trình để bao gồm tỷ lệ phần trăm. Bạn chỉ cần tính tỷ lệ phần trăm và đưa nó vào văn bản trên thanh trạng thái.
Sub ShowPercentageProgress()
Dim i As Long
Dim lastRow As Long
Dim percentDone As Double
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
' Simple action
Cells(i, "K").Value = "Processed"
' Update progress message
percentDone = (i - 1) / (lastRow - 1)
Application.StatusBar = "Processing row " & (i - 1) & " of " & (lastRow - 1) & _
" (" & Format(percentDone, "0%") & ")"
DoEvents
Next i
Application.StatusBar = False
MsgBox "Task completed!"
End Sub
Mã này tạo cập nhật trạng thái rõ ràng cho người dùng, hiển thị “Đang xử lý hàng 14 trên 100 (14%)” .

Ví dụ về tác vụ công thức đơn giản
Hãy cùng khám phá một ví dụ thực tế thực hiện một hành động trong bảng tính. Phiên bản này viết công thức số tiền bán hàng đơn giản vào một cột.
Sub ShowProgressWithFormula()
Dim i As Long
Dim lastRow As Long
Dim percentDone As Double
lastRow = Cells(Rows.Count, "H").End(xlUp).Row
For i = 2 To lastRow
' Simple action
Cells(i, "K").Formula = "=H" & i & "*I" & i
' Update progress message
percentDone = (i - 1) / (lastRow - 1)
Application.StatusBar = "Writing formulas... " & _
"Row " & (i - 1) & " of " & (lastRow - 1) & _
" (" & Format(percentDone, "0%") & ")"
DoEvents
Next i
Application.StatusBar = False
MsgBox "Formulas added in column K!"
End Sub
Đây là một ví dụ đơn giản nhưng nó phản ánh chặt chẽ loại nhiệm vụ trong bảng tính mà nhiều người dùng thực hiện.
“Thanh tiến trình giả” dựa trên văn bản
Application.StatusBar không thể tạo thanh tiến trình đồ họa thực. Tuy nhiên, bạn có thể mô phỏng nó bằng cách xây dựng một thanh sử dụng các ký tự.
Sub StatusBarWithTextProgressBar() Dim i As Long Dim lastRow As Long Dim percentDone As Double Dim barLength As Integer Dim filledBars As Integer Dim progressBar As String lastRow = Cells(Rows.Count, "A").End(xlUp).Row barLength = 20 For i = 2 To lastRow Cells(i, "K").Value = "Processed" percentDone = (i - 1) / (lastRow - 1) filledBars = Int(percentDone * barLength) progressBar = String(filledBars, "|") & String(barLength - filledBars, ".") Application.StatusBar = "Progress: [" & progressBar & "] " & _ Format(percentDone, "0%") DoEvents Next i Application.StatusBar = False MsgBox "Completed!" End Sub
Bất cứ khi nào bạn chạy VBA, thanh trạng thái sẽ hiển thị như sau:
Tiến độ:[||||||||||……….] 67%
Đây vẫn chỉ là văn bản nhưng nó mang lại cảm giác tiến bộ rõ ràng hơn bằng hình ảnh.

Phương pháp hay nhất:Luôn đặt lại thanh trạng thái
Một trong những lỗi thường gặp nhất là quên khôi phục thanh trạng thái ở cuối macro. Nếu bạn không sử dụng Application.StatusBar =False , Excel có thể tiếp tục hiển thị văn bản tùy chỉnh của bạn ngay cả sau khi macro kết thúc. Phiên bản an toàn hơn sử dụng cách xử lý lỗi đơn giản để thanh trạng thái được đặt lại ngay cả khi có sự cố.
Sub SafeStatusMessage()
Dim i As Long
Dim lastRow As Long
Dim percentDone As Double
On Error GoTo CleanUp
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
Cells(i, "K").Value = "Processed"
percentDone = (i - 1) / (lastRow - 1)
Application.StatusBar = "Processing row " & (i - 1) & " of " & (lastRow - 1) & _
" (" & Format(percentDone, "0%") & ")"
DoEvents
Next i
MsgBox "Task completed!"
CleanUp:
Application.StatusBar = False
If Err.Number <> 0 Then
MsgBox "Error: " & Err.Description
End If
End Sub
Mẫu này phù hợp hơn để sử dụng trong thế giới thực.
Mẹo để có thông báo trạng thái tốt hơn
Một thông báo trên thanh trạng thái tốt phải ngắn gọn và cụ thể. Giữ tin nhắn của bạn ngắn gọn và hữu ích. Những ví dụ điển hình bao gồm:
- Đang nhập dữ liệu bán hàng…
- Đang kiểm tra các bản sao…
- Đang định dạng bảng tính…
- Đang xử lý bản ghi 45 trên 200…
- Đang hoàn thiện báo cáo…
Cố gắng kết nối thông điệp với nhiệm vụ thực tế đang được thực hiện. Điều này làm cho macro có cảm giác chuyên nghiệp hơn và dễ tin cậy hơn.
Mẫu có thể tái sử dụng sẵn sàng để sử dụng
Bạn có thể sử dụng lại mẫu này trong hầu hết mọi macro. Chỉ cần sao chép mã này và chèn logic của bạn vào nơi cần thiết.
Sub MyMacro() On Error GoTo CleanUp Dim i As Long Dim total As Long total = 100 For i = 1 To total Application.StatusBar = "Processing item " & i & " of " & total DoEvents ' Your code here Next i CleanUp: Application.StatusBar = False End Sub
Kết luận
Bằng cách làm theo hướng dẫn này, bạn có thể dễ dàng hiển thị thông báo tiến trình trong khi chạy VBA. Nếu bạn muốn cho người dùng thấy rằng macro VBA vẫn đang hoạt động, Application.StatusBar là một trong những công cụ đơn giản nhất hiện có. Nó không phải là một thanh tiến trình đầy đủ nhưng nó thường là quá đủ. Cách tiếp cận này dễ thực hiện, đáng tin cậy, yêu cầu mã tối thiểu và cải thiện đáng kể trải nghiệm người dùng trong các quy trình VBA chạy dài. Kiểm tra nó trong macro của riêng bạn bằng cách đặt các cập nhật trạng thái bên trong các vòng lặp chính của bạn—chỉ mất một vài dòng mã.
Nhận MIỄN PHÍ Bài tập Excel nâng cao có Giải pháp!