【问题标题】:Userform VBA Progress Bar Associated with Workbook Completion与工作簿完成相关的用户窗体 VBA 进度条
【发布时间】:2017-12-27 19:30:30
【问题描述】:

我有一个非常大的电子表格,目前有 129 个标签。简而言之,下面的宏消除了每个工作表的所有数组公式错误(#NUM)。这大约需要 15-20 分钟,但我想知道宏距离完成有多近。

我设计了一个没有问题的用户窗体进度条,并且我的代码正确引用了宏。除了更新用户窗体中的实际标签的部分外,一切正常。如何添加代码来定义宏的完成百分比是多少?我假设我需要使用“当前已完成的工作表/总工作表”,但我对 Userforms 非常陌生。

Sub DelNUM()
  Dim LR As Long
  Dim i As Long
  Dim sh As Worksheet

  For Each sh In Worksheets
    LR = sh.Range("B" & sh.Rows.Count).End(xlUp).Row
    For i = LR To 1 Step -1
        If IsError(sh.Range("B" & i)) Then sh.Rows(i).Delete
    Next i
  Next
End Sub

我已经查看了以下链接,但它适用于比我更有经验的人,所以我在关注它时遇到了麻烦:https://support.microsoft.com/en-us/help/211736/how-to-display-a-progress-bar-with-a-user-form-in-excel

我们将不胜感激。

谢谢,

肖恩

【问题讨论】:

  • 您需要在表单更新进度的地方使用Me.Repaint。您可以在 If 声明之后立即尝试 UserForm1.Repaint,但我不确定这是否会更新它
  • 等待 - 运行需要 20 分钟?我知道您有很多工作表,但可能有更快的方法...也许过滤掉范围,删除剩下的那些行?如果可行的话,也许把它交给CodeReview。添加百分比条是次要的,IMO,为了提高效率而进行调整。正如您所注意到的,目前逐个单元格将需要很长时间。

标签: vba excel


【解决方案1】:

为了支持@BruceWayne 的评论,请尝试这种方法,看看您的运行时间是否显着减少:

此代码中用于节省时间的三个重要功能是:

  1. 关闭计算(每行删除语句都会触发重新计算工作簿)
  2. 使用 SpecialCells 一次性找到所有可能的错误单元格!
  3. 每张纸删除行 1 次。每个删除调用都会占用处理时间。

代码如下:

Option Explicit

Sub DelNUM()

    Dim LR As Long
    Dim i As Long
    Dim sh As Worksheet

    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With

    For Each sh In Worksheets

        With sh

            LR = .Range("B" & sh.Rows.Count).End(xlUp).Row

            Dim formulaErrors As Range
            On Error Resume Next 'bc there may not be any error cells
            Set formulaErrors = .Range("B1:B" & LR).SpecialCells(xlCellTypeFormulas, xlErrors)
            On Error GoTo 0 'turn error catch back on

            If Not formulaErrors Is Nothing Then

                formulaErrors.EntireRow.Delete 'now we delete all error rows at once
                Set formulaErrors = Nothing 'reset for next loop

            End If

        End With

    Next

    Application.Calculation = xlCalculationAutomatic

End Sub

这样你可能不需要进度条:)

【讨论】:

  • 伟大的斯科特蝙蝠侠.....谢谢你们。所以只用了不到 30 秒。没有比这更令人谦卑的了。
  • 我确实对此进行了快速跟进 - 最后一个工作表使用 vlookup 从其他工作表中查找总计。作为数组公式的结果,最后一张表会拉出#NUM 错误,并且使用此升级后的代码,它们会被删除。有没有办法让上面跳过工作簿中的最后一个工作表?
  • @SeanPakulski - 在For 循环内,在With sh 语句之前创建一个IF sh.Name <> "LastSheetName" (replace with actual name) Then 并在适当的位置以End If 结束。
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2021-10-19
相关资源
最近更新 更多