EP03. “Progress Indicator 进度条表单”
🔒 登录后可标记已读- 延续 02_Basics/01_Ribbon/EP05 状态栏的进度提示概念,改用 Userform 做一个更美观的可视化进度条
- 让使用者看到宏跑到百分之几,而不是只有状态栏一行文字
- 核心技巧是靠改变 Label 宽度呈现进度,再用
DoEvents强制刷新画面 - 前置知识:Frame、Label 控件的基本使用,以及
DoEvents的作用
重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。
表单组成
用一个 Frame(当进度条外框背景)+ 一个叫 "Bar" 的 Label(代表已完成的部分,靠改变宽度呈现进度)+ 一个显示百分比的文字 Label。
打开表单
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
表单显示后自动开始跑
Private Sub UserForm_Activate()
code
End Sub
主要处理逻辑
Sub code()
Dim i As Integer, j As Integer, pctCompl As Single
Sheet1.Cells.Clear
For i = 1 To 100
For j = 1 To 1000
Cells(i, 1).Value = j
Next j
pctCompl = i
progress pctCompl
Next i
End Sub
更新进度条
Sub progress(pctCompl As Single)
UserForm1.Text.Caption = pctCompl & "% Completed"
UserForm1.Bar.Width = pctCompl * 2
DoEvents
End Sub
逻辑说明
- 每跑完外层循环一轮(i 从 1 到 100),就把目前的百分比传给
progress子程序 progress子程序把百分比文字更新到 Label,同时把 "Bar" 这个 Label 的宽度按比例放大(pctCompl * 2),画面上看起来就像进度条在往右填满DoEvents让 Excel 暂停手上的运算,先把界面刷新显示出来,不然进度条画面会卡住不动,直到整个循环跑完才一次显示
[截图:运行中的表单,长条形 Bar 填到一半左右,旁边文字显示 "50% Completed" 这类进度提示]
状态栏 vs Userform 进度条怎么选
| 方式 | 效果 | 适合场景 |
|---|---|---|
| StatusBar(02_Basics/01_Ribbon/EP05) | 文字显示在窗口底部状态栏 | 简单场景,不想额外设计界面 |
| Userform 进度条(本篇) | 弹窗里的可视化长条 | 想要更明显、更美观的进度提示 |
学完你会
- ✅ 用 Label 的 Width 属性模拟进度条视觉效果
- ✅ 用
UserForm_Activate事件让表单一显示就自动开始跑处理逻辑 - ✅ 知道耗时循环要加
DoEvents,界面才不会卡住不刷新
常见错误
- 忘记加
DoEvents,进度条数值虽然在变,但画面完全不更新,直到最后一次性跳到 100% - Bar 的宽度换算比例跟 Frame 的实际宽度不成比例,进度条看起来跑到一半就顶到底或还没填满
- 把这段耗时的循环直接放在按钮点击事件里而不是透过表单的 Activate 事件触发,表单弹出的时机跟预期不一样
Sources
Blog / Website: