【问题标题】:VBA: Make simple macro run fasterVBA:让简单的宏运行得更快
【发布时间】:2017-05-09 14:41:25
【问题描述】:

我需要在两个每天变化的表格中搜索某些值,然后以灰色突出显示相应的单元格并在每个表格的第一列中写下阈值。

为此,我正在使用以下按预期工作的方法。
不幸的是,宏需要超过一分钟才能完成,在我看来,这样的操作似乎很长(而且这个宏只是一个更大的宏的一部分)。

两个表都比较小,只包含大约。 500 分别。 100 条记录。

有人可以告诉我怎样才能让它运行得更快或更高效地编写这段代码

我的代码:

Sub PrepareRankRecords(varMode As String)
    Call RankRecords(varMode, 10000)
    Call RankRecords(varMode, 5000)
    Call RankRecords(varMode, 2000)
    Call RankRecords(varMode, 1500)
    Call RankRecords(varMode, 1000)
    Call RankRecords(varMode, 500)
End Sub

Sub RankRecords(varMode As String, varRank As Integer)
    Dim cell As Range, varRange As Range

    If varMode = "DSP" Then
         ' table AE:AJ
        Application.StatusBar = "90 % - Ranking table AE:AJ"
        DoEvents
        Set varRange = Range("$AI$3", Cells(Rows.Count, "AI").End(xlUp)).Cells
    Else
         ' table X:AC
        Application.StatusBar = "60 % - Ranking table X:AC"
        DoEvents
        Set varRange = Range("$AB$3", Cells(Rows.Count, "AB").End(xlUp)).Cells
    End If
    With Worksheets(4)
        For Each cell In varRange
            If cell.Offset(0, -3).Value <> "" Then
                If cell.Value < varRank Then
                    cell.Offset(0, -4).Value = "< " & Format(varRank, "#,##0")
                    .Range(Cells(cell.Row, cell.Column - 4), Cells(cell.Row, cell.Column + 1)). _
Interior.Color = RGB(217, 217, 217)
                    .Range(Cells(cell.Row, cell.Column - 4), Cells(cell.Row, cell.Column + 1)). _
Font.Bold = True
                    Exit For
                End If
            Else
                Exit For
            End If
        Next
    End With
End Sub

非常感谢您在此提供的任何帮助, 迈克

【问题讨论】:

  • 把你的数据放到一个数组里,在那里做所有繁重的 lfting 然后写回电子表格。

标签: vba excel


【解决方案1】:

通常我会做以下事情:

Sub PrepareRankRecords(varMode As String)
    call Onstart
    Call RankRecords(varMode, 10000)
    Call RankRecords(varMode, 5000)
    'other code
    call OnEnd
End Sub

Public Sub OnEnd()

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.AskToUpdateLinks = True
    Application.DisplayAlerts = True
    Application.Calculation = xlAutomatic
    ThisWorkbook.Date1904 = False

    Application.StatusBar = False

End Sub

Public Sub OnStart()

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.AskToUpdateLinks = False
    Application.DisplayAlerts = False
    Application.Calculation = xlAutomatic
    ThisWorkbook.Date1904 = False

    ActiveWindow.View = xlNormalView

End Sub

您可以检查 OnStart/OnEnd 并删除您认为无用的部分。

【讨论】:

  • 谢谢,Vityata。我喜欢这种方法(其中一些我已经有了,只是没有在这里复制)。 :)
  • 我对此进行了测试,效果很好(我假设第一次需要将计算更改为手动。;))。只有一个问题:当我关闭屏幕更新时,我不能再在状态栏上显示进度了,对吧?
  • @keewee279 - Manual 非常危险,我从不使用它。但它会稍微快一些。
  • 谢谢,但是您在开始和结束时都将其设置为自动?
  • @keewee279 - 只是为了确保......永远不会100%确定。例如,在代码中间的某个地方,您可以将其更改为 Manual,如果您不将其更改回来,则会遭受很多损失。
【解决方案2】:

我会将Cells(cell.Row, cell.Column - 4) 替换为cell(1, -3)

另外,我将在主循环中使用 Select Case 替换连续调用 RankRecords 以一次性完成所有操作。

【讨论】:

  • 谢谢,avb。这不是我需要的,因为我的行会动态变化,我需要所有情况,而不仅仅是其中一种。 :)
  • 但是,如果我明白这一点,就可以不丢失任何东西并一次完成
  • 我很乐意,但没有找到解决办法,而且案例在这里不起作用,因为所有案例都会一直适用,我不想重复代码。
猜你喜欢
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 2011-05-10
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
相关资源
最近更新 更多