0

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

设计

代码下方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 名称是 ( ufProgress ),UserForm 左上角的标签,将用于显示指示状态名称的文本 ( LabelCaption ) ...以及 UserForm 名称上的框架 ( FrameProgress ).. Finlay,另一个标签, 即将增长的进度指标名称 ( LabelProgress ) ..

任何建议...

亲切的问候

4

1 回答 1

1

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

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

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

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

通常最好做最后一个,但在您的特殊情况下,您可以继续使用默认实例 - 因为表单仅用于显示(如果您将数据输入用户表单并想要对其执行某些操作,请使用默认实例可能会导致一些意想不到的问题)。


仍然考虑到您的表单名为“Form1”,您可以通过以下方式解决问题

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


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

在此处输入图像描述

于 2020-08-18T08:27:45.643 回答