如何加快VBA代码

rah*_*s76 4 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
Run Code Online (Sandbox Code Playgroud)

提前致谢

拉胡尔

Vit*_*ata 7

一般来说,有两种方法可以加速 VBA 代码:

  1. 写出好的代码,不使用SelectActivateActiveCellSelection等-如何避免在Excel中使用VBA选择

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


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
Run Code Online (Sandbox Code Playgroud)

(对于改进的想法,请提出 PullRequest

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


Sto*_*rax 6

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

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
Run Code Online (Sandbox Code Playgroud)


jef*_*eir 5

除了 Storax 建议的调整之外,您的代码很慢,因为您将数据逐个单元格地带到 Excel/VBA 鸿沟上。

此外,您可以通过使用它的二进制版本从根本上加速您的 MATCH 函数。阅读http://dailydoseofexcel.com/archives/2015/04/23/how-much-faster-is-the-double-vlookup-trick/并尽量减少您在整个过程中进行的个人转移的数量Excel/VBA 通过完全在 Excel 工作表中执行查找(通过使用 VBA 在工作表中编写公式并在那里执行)或使用变体数组一次性将所有数据导入 VBA,执行您的逻辑,以及然后一次性倾倒它。谷歌“在 Excel 和 VBA 之间传输数据的有效方法”或类似的东西。还可以查看查尔斯·威廉姆斯 (Charles Williams) 有关该主题的任何文章。