使用 VBA 的进度条

Progress bar using VBA

我正在使用 VBA excel sheet:我正在尝试测试进度条。我已经完成了设计,如下图:

userForm代码下方:

'PLACE IN YOUR USERFORM CODE
Private Sub UserForm_Initialize()
#If IsMac = False Then
    'hide the title bar if you're working on a windows machine. Otherwise, just display it as you normally would
    Me.Height = Me.Height - 10
    HideTitleBar.HideTitleBar Me
#End If
End Sub

Module代码下方:

'PLACE IN A STANDARD MODULE
Sub LoopThroughRows()
Dim i As Long, lastrow As Long
Dim pctdone As Single
lastrow = Range("A" & Rows.Count).End(xlUp).Row

'(Step 1) Display your Progress Bar
ufProgress.LabelProgress.Width = 0
ufProgress.Show
For i = 1 To lastrow
'(Step 2) Periodically update progress bar
    pctdone = i / lastrow
    With ufProgress
        .LabelCaption.Caption = "Processing Row " & i & " of " & lastrow
        .LabelProgress.Width = pctdone * (.FrameProgress.Width)
    End With
    DoEvents
        '--------------------------------------
        'the rest of your macro goes below here
        '
        '
        '--------------------------------------
'(Step 3) Close the progress bar when you're done
    If i = lastrow Then Unload ufProgress
Next i
End Sub

当我 运行 代码时,我得到这个错误:

当我按下 Debug 时,它会突出显示:

ufProgress.LabelProgress.Width = 0

更多信息

UserForm name is (ufProgress) ,用户窗体左上角的标签将用于显示指示状态名称的文本 (LabelCaption ) ... 以及用户窗体名称上的框架 (FrameProgress ) .. Finlay ,另一个标签,将增长进度指标名称 (LabelProgress ) ..

任何建议...

亲切的问候

VBA 中的用户窗体是一个 object,您需要先创建一个 object 的实例才能使用它。但是这个事实被 VBA 的行为很好地隐藏了,如果您通过它的 class 名称(表单名称)访问它,则创建用户表单的默认实例。

假设您有一个名为 Form1 的表单,您编写 Form1.Show:VBA 将创建该表单的一个实例并显示它。

另一种方法是声明一个表单类型的变量,手动创建它,然后使用该变量:

Dim ufProgress as Form1
set ufProgress = new Form1
ufProgress.Show

通常做最后一个更好,但在你的特殊情况下,你可以继续使用默认实例 - 因为表单只是用于显示(如果你在用户表单中输入数据并想做与它有关的东西,使用默认实例可能会导致一些意想不到的问题。


仍然考虑到您的表单名为“Form1”,您可以通过

解决问题

a) 将表单重命名为 ufProgress
b) 在你的代码
中用Form1替换ufProgress (在这两种情况下,您都将访问自动生成的表单实例)
c) 使用上面的代码片段。


更新 - 获得更多信息后:
在调试器中显示的行具有误导性,有罪声明(很可能)在表单的 UserForm_Initialize 代码中,但调试器不会停在那里,直到您告诉它这样做:在 VBA 编辑器,打开选项 Window(工具 -> 选项),选择常规选项卡和 select“打入 Class 模块”。我猜测命令 HideTitleBar.HideTitleBar Me 会抛出该错误。要么删除该行(并接受表单显示其标题的事实),要么找到 HideTitleBar.

的定义