使用 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
.
的定义
我正在使用 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
.