เมื่อโค้ดยาวและแมโคร VBA ทำงานเป็นเวลาหลายวินาที Excel อาจปรากฏค้างหรือไม่ตอบสนอง แม้ว่ารหัสจะทำงานอย่างถูกต้อง ผู้ใช้อาจถือว่าเวิร์กบุ๊กหยุดทำงานเนื่องจากดูเหมือนว่าจะไม่มีอะไรเกิดขึ้นบนหน้าจอ วิธีง่ายๆ ในการหลีกเลี่ยงปัญหานี้คือการแสดงข้อความสดในแถบสถานะของ Excel ในขณะที่แมโครทำงาน
ในบทช่วยสอนนี้ เราจะแสดงวิธีแสดงข้อความความคืบหน้าในขณะที่ VBA ทำงาน คุณไม่จำเป็นต้องมี UserForm หรือแถบความคืบหน้าแบบกราฟิก ในหลายกรณี Application.StatusBar ก็เพียงพอแล้ว
เหตุใดจึงต้องใช้ Application.StatusBar
Excel มีแถบสถานะในตัวที่ด้านล่างของหน้าต่างแอปพลิเคชัน VBA สามารถแทนที่ข้อความปกติในพื้นที่นั้นชั่วคราวด้วยข้อความที่กำหนดเองได้
ซึ่งหมายความว่ามาโครของคุณสามารถแสดงการอัปเดตเช่น:
- กำลังประมวลผลแถว 10 จาก 100
- กำลังนำเข้าข้อมูล…
- การเขียนสูตร…
- เสร็จสมบูรณ์ 65%
สิ่งนี้มีประโยชน์เมื่อคุณต้องการให้ผู้ใช้รู้ว่าแมโครยังคงทำงานอยู่ แต่ไม่ต้องการให้มีงานพิเศษในการสร้างแถบความคืบหน้าแบบเห็นภาพทั้งหมด คุณยังคงสามารถทำให้ข้อความมีข้อมูลมากขึ้นได้โดยการแสดงจำนวนแถวหรือเปอร์เซ็นต์ แต่ยังคงเป็นวิธีแก้ปัญหาแบบข้อความ
ไวยากรณ์พื้นฐาน: ป>
หากต้องการแสดงข้อความในแถบสถานะของ Excel ให้ใช้:
Application.StatusBar = "Processing..."
เมื่อมาโครของคุณเสร็จสิ้น ให้รีเซ็ตแถบสถานะด้วย:
Application.StatusBar = False
การตั้งค่า Application.StatusBar =False จะคืนค่าการควบคุมแถบสถานะไปยัง Excel ทำให้สามารถแสดงข้อความเริ่มต้นได้อีกครั้ง อย่าข้ามขั้นตอนนี้
ตัวอย่างพื้นฐาน:ข้อความความคืบหน้าอย่างง่าย
นี่เป็นเวอร์ชันพื้นฐานที่สุดพร้อมข้อความแสดงความคืบหน้าอย่างง่าย ในแถบสถานะจะแสดง “กำลังรายงาน… โปรดรอสักครู่”
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
ใช้งานได้ แต่จะแสดงข้อความคงที่เพียงข้อความเดียวเท่านั้น โดยจะแจ้งให้ผู้ใช้ทราบว่ามาโครกำลังทำงานอยู่ แต่จะไม่แสดงความคืบหน้าใดๆ ที่แท้จริง
แสดงความคืบหน้าสดระหว่างการวนซ้ำ
ในแมโครจริงส่วนใหญ่ คุณจะประมวลผลแถว เซลล์ ไฟล์ หรือบันทึกทีละรายการ ทำให้ง่ายต่อการอัปเดตแถบสถานะในขณะที่การวนซ้ำดำเนินไป
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 อนุญาตให้ Excel รีเฟรชหน้าจอและตอบสนองในขณะที่แมโครกำลังทำงาน
- หากไม่มีแถบสถานะอาจไม่อัปเดตอย่างเห็นได้ชัดจนกว่ามาโครจะสิ้นสุด โดยเฉพาะอย่างยิ่งในการวนซ้ำแบบยาว
- อย่าใช้มากเกินไปในการวนซ้ำที่มีขนาดใหญ่มากเว้นแต่จำเป็น เนื่องจากอาจทำให้การดำเนินการช้าลงเล็กน้อย
ที่ด้านล่าง แถบสถานะจะแสดง “กำลังประมวลผลแถว 90 จาก 101” .

เพิ่มข้อความเปอร์เซ็นต์
คุณสามารถปรับแต่งข้อความความคืบหน้าเพื่อรวมเปอร์เซ็นต์ได้ คุณเพียงแค่ต้องคำนวณเปอร์เซ็นต์และรวมไว้ในข้อความบนแถบสถานะ
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
รหัสนี้สร้างการอัปเดตสถานะที่ชัดเจนสำหรับผู้ใช้ โดยแสดง “กำลังประมวลผลแถว 14 จาก 100 (14%)” .

ตัวอย่างงานสูตรอย่างง่าย
เรามาสำรวจตัวอย่างเชิงปฏิบัติที่ดำเนินการในเวิร์กชีทกัน เวอร์ชันนี้เขียนสูตรยอดขายอย่างง่ายในคอลัมน์
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
นี่เป็นตัวอย่างง่ายๆ แต่สะท้อนถึงประเภทของงานในเวิร์กชีตที่ผู้ใช้จำนวนมากทำอย่างใกล้ชิด
แถบความคืบหน้าปลอมที่ใช้ข้อความ
Application.StatusBar ไม่สามารถสร้างแถบความคืบหน้าแบบกราฟิกจริงได้ อย่างไรก็ตาม คุณสามารถจำลองได้โดยการสร้างแถบโดยใช้อักขระ
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
เมื่อใดก็ตามที่คุณเรียกใช้ VBA แถบสถานะจะแสดงดังนี้:
ความคืบหน้า:[||||||||||……….] 67% ป>
นี่ยังเป็นเพียงข้อความ แต่ให้ความรู้สึกถึงความคืบหน้าที่ชัดเจนยิ่งขึ้น

แนวทางปฏิบัติที่ดีที่สุด:รีเซ็ตแถบสถานะเสมอ
ข้อผิดพลาดที่พบบ่อยที่สุดประการหนึ่งคือการลืมคืนค่าแถบสถานะที่ส่วนท้ายของมาโคร หากคุณไม่ได้ใช้ Application.StatusBar =False Excel อาจแสดงข้อความแบบกำหนดเองของคุณต่อไปแม้ว่าแมโครจะเสร็จสิ้นแล้วก็ตาม เวอร์ชันที่ปลอดภัยกว่าใช้การจัดการข้อผิดพลาดแบบง่ายๆ ดังนั้นแถบสถานะจึงถูกรีเซ็ตแม้ว่าจะมีข้อผิดพลาดเกิดขึ้นก็ตาม
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
รูปแบบนี้เหมาะสำหรับการใช้งานจริงมากกว่า
เคล็ดลับสำหรับข้อความสถานะที่ดีขึ้น
ข้อความบนแถบสถานะที่ดีควรสั้นและเฉพาะเจาะจง ทำให้ข้อความของคุณกระชับและมีประโยชน์ ตัวอย่างที่ดี ได้แก่:
- กำลังนำเข้าข้อมูลการขาย…
- กำลังตรวจสอบรายการซ้ำ…
- กำลังจัดรูปแบบแผ่นงาน…
- กำลังประมวลผลบันทึก 45 จาก 200…
- กำลังสรุปรายงาน…
พยายามจับคู่ข้อความกับงานจริงที่กำลังดำเนินการ ซึ่งจะทำให้มาโครรู้สึกเป็นมืออาชีพมากขึ้นและน่าเชื่อถือได้ง่ายขึ้น
รูปแบบนำกลับมาใช้ใหม่พร้อมใช้งาน
คุณสามารถใช้รูปแบบนี้ซ้ำได้ในเกือบทุกแมโคร เพียงคัดลอกโค้ดนี้และใส่ตรรกะของคุณตามที่จำเป็น
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
บทสรุป
เมื่อทำตามบทช่วยสอนนี้ คุณสามารถแสดงข้อความความคืบหน้าในขณะที่ VBA ทำงานได้อย่างง่ายดาย ถ้าคุณต้องการแสดงให้ผู้ใช้เห็นว่าแมโคร VBA ยังคงใช้งานได้ Application.StatusBar เป็นหนึ่งในเครื่องมือที่ง่ายที่สุดที่มีอยู่ มันไม่ใช่แถบความคืบหน้าทั้งหมด แต่มักจะมากเกินพอ แนวทางนี้ใช้งานง่าย เชื่อถือได้ ต้องใช้โค้ดเพียงเล็กน้อย และปรับปรุงประสบการณ์ผู้ใช้อย่างมากในระหว่างขั้นตอน VBA ที่ใช้เวลานาน ทดสอบในมาโครของคุณเองโดยวางการอัปเดตสถานะไว้ในลูปหลักของคุณ โดยใช้โค้ดเพียงไม่กี่บรรทัด
รับแบบฝึกหัด Excel ขั้นสูงพร้อมโซลูชันฟรี!