如何加速VBA代码

时间:2017-11-03 06:29:51

标签: excel vba excel-vba

我有一个带有VBA代码的excel文件(不是我写的) 该代码如何工作是用户在用户表单中输入一个6位数字,然后VBA检查另一张表格以及工作表上是否有这个6位数字。 如果是,它会改变阶段,但如果它没有,则将这个6位数字添加到工作表中

它过去工作得很好,但现在因为excel文件的行数增加了近6000行,这段代码变得非常慢,最多需要20秒来更新工作表

有人可以帮助我加快这段代码的速度,或建议另一种方法来实现它吗

代码在

之下
Private Sub cmdPSDUdate_Click()
Dim x
If (Me.PSDUDateRow = "") + (Me.PSDStageCB.ListIndex = -1) Then Exit Sub
With Sheets("psdata stage cals").ListObjects("PSDataStageCals")
    x = Application.Match(Val(Me.PSDUDateRow), .ListColumns(1).DataBodyRange, 0)
    If IsNumeric(x) Then
        .ListRows(x).Range(2) = Me.PSDStageCB.Value
    Else
        .ListRows.Add.Range = Array(Val(Me.PSDUDateRow), Me.PSDStageCB)
    End If
End With
Me.PSDUDateRow.Value = ""
Me.PSDStageCB.Value = ""
Me.PSDUDateRow.SetFocus
End Sub

提前致谢

的Rahul

5 个答案:

答案 0 :(得分:4)

您可以关闭屏幕更新,自动计算等

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False

‘Place your macro code here

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True

答案 1 :(得分:3)

除了Storax建议的调整之外,您的代码很慢,因为您将逐个单元格地引入Excel / VBA分区。

此外,您可以通过使用它的二进制版本从根本上加速您的MATCH功能。阅读http://dailydoseofexcel.com/archives/2015/04/23/how-much-faster-is-the-double-vlookup-trick/并尝试通过完全在Excel工作表中执行查找(通过使用VBA在工作表中编写公式并执行)来尽量减少您在Excel / VBA划分中所做的单个传输量在那里)或者通过使用变量数组将所有数据一次性带入VBA,执行逻辑,然后一次性将其转储回来。 Google"在Excel和VBA之间传输数据的有效方式"或类似的东西。另请查看Charles Williams关于此主题的任何文章。

答案 2 :(得分:1)

我认为您的代码没有任何问题。也许工作簿本身就是罪魁祸首。开放变得巨大而缓慢? 如果是,请尝试搜索'cleanup excel file' 我找到了一些结果:
https://excelfilecleaner.codeplex.com/
https://support.microsoft.com/en-us/help/3070372/how-to-clean-up-an-excel-workbook-so-that-it-uses-less-memory

答案 3 :(得分:1)

通常,有两种方法可以加速VBA代码:

  1. 编写好的代码,不使用SelectActivateActiveCellSelection等 - How to avoid using Select in Excel VBA

  2. 请参阅代码开头和结尾的这些例程:

  3. 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
    

    (有关改进的想法,kindly make PullRequest

    • 我认为Calculation应始终设置为xlAutomatic,只要您需要xlCalculationManual加速,重构代码是个好主意。此外,手动计算风险太大。
    • Date1904同样如此 - 它始终设置为False

答案 4 :(得分:0)

在需要频繁引用单元格的Excel中处理大量数据时,将数据复制到数组(如有必要,复制整个工作表),处理数组中的数据然后回写总是总是要快得多。如有必要,请转到工作表。将数据从工作表复制到数组是一个非常快的单行命令。与工作表数组相同。相对而言,与引用数组元素相比,引用单元格是一个非常耗时的过程。