Microsoft Lab
全部软件
Excel用户窗体(Userform)约 5 分钟

Progress Indicator 进度条表单

重点内容


适用版本

桌面版通用(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 进度条(本篇)弹窗里的可视化长条想要更明显、更美观的进度提示

学完你会

常见错误

  • 忘记加 DoEvents,进度条数值虽然在变,但画面完全不更新,直到最后一次性跳到 100%
  • Bar 的宽度换算比例跟 Frame 的实际宽度不成比例,进度条看起来跑到一半就顶到底或还没填满
  • 把这段耗时的循环直接放在按钮点击事件里而不是透过表单的 Activate 事件触发,表单弹出的时机跟预期不一样

Sources

Blog / Website:

  1. Progress Indicator
只记在你的浏览器里,换设备不会同步。