Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> Office

รักษาการตอบสนองของ Excel:แสดงข้อความความคืบหน้าขณะทำงาน VBA

รักษาการตอบสนองของ Excel:แสดงข้อความความคืบหน้าขณะทำงาน VBA

 

เมื่อโค้ดยาวและแมโคร 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” .

รักษาการตอบสนองของ Excel:แสดงข้อความความคืบหน้าขณะทำงาน VBA

เพิ่มข้อความเปอร์เซ็นต์

คุณสามารถปรับแต่งข้อความความคืบหน้าเพื่อรวมเปอร์เซ็นต์ได้ คุณเพียงแค่ต้องคำนวณเปอร์เซ็นต์และรวมไว้ในข้อความบนแถบสถานะ

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%)” .

รักษาการตอบสนองของ Excel:แสดงข้อความความคืบหน้าขณะทำงาน VBA

ตัวอย่างงานสูตรอย่างง่าย

เรามาสำรวจตัวอย่างเชิงปฏิบัติที่ดำเนินการในเวิร์กชีทกัน เวอร์ชันนี้เขียนสูตรยอดขายอย่างง่ายในคอลัมน์

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%

นี่ยังเป็นเพียงข้อความ แต่ให้ความรู้สึกถึงความคืบหน้าที่ชัดเจนยิ่งขึ้น

รักษาการตอบสนองของ Excel:แสดงข้อความความคืบหน้าขณะทำงาน VBA

แนวทางปฏิบัติที่ดีที่สุด:รีเซ็ตแถบสถานะเสมอ

ข้อผิดพลาดที่พบบ่อยที่สุดประการหนึ่งคือการลืมคืนค่าแถบสถานะที่ส่วนท้ายของมาโคร หากคุณไม่ได้ใช้ 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 ขั้นสูงพร้อมโซลูชันฟรี!