我有一个带有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
答案 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代码:
编写好的代码,不使用Select
,Activate
,ActiveCell
,Selection
等 - How to avoid using Select in Excel VBA
请参阅代码开头和结尾的这些例程:
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中处理大量数据时,将数据复制到数组(如有必要,复制整个工作表),处理数组中的数据然后回写总是总是要快得多。如有必要,请转到工作表。将数据从工作表复制到数组是一个非常快的单行命令。与工作表数组相同。相对而言,与引用数组元素相比,引用单元格是一个非常耗时的过程。