根據哈佛商學院企業管理副教授 Ryan Buell 發現,進度條能夠產生”勞動幻覺”,使用者可以感受到”工作正在確實的進行”,減少等待焦慮,優化使用者體驗。Excel VBA 最重要就是處理重複工作,因此程式碼會有很多迴圈,可能又會搭配大量的判斷式,很容易造成程式運作時間拉長,進而出現類似當機的畫面。
因此,如果程式需要大量運行時間,建議製作進度條,讓使用者知道程式正在運行,降低等待的焦慮。本文說明如何自製簡易的進度條,大體上為 2 步驟,第 1 為製作進度條的圖示,第 2 為撰寫進度條程式碼。
內容目錄
製作進度條圖示
進度條基底 | 建立表單 UserForm1
建立表單 UserForm1,製作進度條的基底
顯示進度 | 插入標籤 Label1
插入標籤 Label1,顯示進度百分比
進度條圖示框架 | 插入框架 Frame1
插入框架 Frame1,製作進度圖示的框架
進度條顯示圖示 | 插入標籤 Label2
插入標籤 Label2,利用 Label2的寬度變化,做為進度的顯示圖示
外觀調整
前述幾個步驟,已經完成 VBA 進度條的基本設定。接下來我們進行微調設定,讓外觀更接近進度條
調整 UserForm1 至適當大小
調整 UserFrom1 至適當大小
修改 UserFrom1 名稱
刪除 Frame1 及 Label2 名稱
調整 Fram1 外觀
調整 Frame1 的 SpecialEffect,選擇第 2 項 “fmSpecialSunken”,呈現出進度條的外觀
調整 Label2 顏色
調整 Label2 顏色,作為進度條背景顏色,本範例選擇藍色
撰寫進度條程式碼
進度條主要目的是顯示迴圈的執行進度,因此需要將進度條程式碼撰寫在迴圈裡。以下為迴圈 10,000 次範例,進度條顯示執行進度。迴圈結束後,呼叫 MsgBox 函數顯示程式執行完成,最後關閉進度條
Sub progress_bar()
Dim i, j As Long
j = 10000
UserForm1.Show 0
For i = 1 To j
With UserForm1
.Label1.Caption = CByte((i / j) * 100) & "%"
.Label2.Width = (i / j) * .Frame1.Width
End With
DoEvents
Next i
MsgBox "Done"
Unload UserForm1
End Sub
行數 | 說明 |
---|---|
5 | 啟動 UserForm1,顯示進度條。注意一定要輸入引數 0,進度條才能正常運作 |
7 | 使用 With End With 語法,簡化程式碼 |
8 | 1. 計算完成百分比,分子為目前處理數,分母為總處理數 2. 呼叫 CByte 函數,轉換為 Byte 資料型態 3. 利用 Label1.Caption 顯示完成進度 |
9 | 利用完成百分比乘上 Frame1 的總長度,計算出 Label2 寬度。Label2 寬度會隨著進度不斷增加,呈現出進度條增加的圖示 |
11 | 一定要加上 DoEvents,要暫時釋出 Excel 對系統的控制權,進度條才能正常顯示 |
13 | 呼叫 MsgBox 函數,顯示程式完成 |
14 | 結束進度條,關閉 UserForm1 |
如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝