另一种方式,而不是直到循环,使代码执行更快

我需要帮助如何使我的代码更快地执行。 我有一个非常大量的数据,我的“ Do Until loop ”导致执行缓慢。 我想知道是否有办法让我的代码运行得更快。 我只用了,直到循环,因为我很舒服。 谢谢

 Dim WB1 As Workbook Dim ws1 As Worksheet Dim last As Long Dim i As Integer Dim x As String, y As String Set WB1 = ThisWorkbook Set ws1 = WB1.Worksheets("Source") last = ws1.Cells(Rows.Count, "X").End(xlUp).Row i = 2 Do Until Sheets("Source").Cells(i, 1) = "" x = Left(Sheets("Source").Cells(i, 6), 3) y = Left(Sheets("Source").Cells(i, 23), 7) If x = "611" Or y = "INITIAL" Then Sheets("Source").Cells(i, 25) = "INITIAL" Else ws1.Range("Y2:Y" & last).Formula = "=VLOOKUP(A:A,'Assignment Reference'!$C:$E,3,FALSE)" End If i = i + 1 Loop 

如何提高Excel的VBA代码的性能有很多可能的方法。 最好你读一些关于这方面的文章:

  • Excel VBA性能编码的最佳实践
  • 优化VBA

编辑:如债券我build议这里是我在我的VBA代码来提高执行性能:

 Option Explicit Dim screenUpdating As Boolean Dim calculation As XlCalculation Dim enableEvents As Boolean Dim displayPageBreaks As Boolean ' Freezes Excel into its current state to improve ' performance during executing macro code. Be sure ' to call DoEvents occasionally during execution to ' prevent completly freezing the Excel window. ' Call this routine before all other code but after ' setting up proper exception handling. Public Sub freezeSystem() 'Save Excel configuration to reset later screenUpdating = Application.screenUpdating calculation = Application.calculation enableEvents = Application.enableEvents displayPageBreaks = ActiveSheet.displayPageBreaks 'Turn off some Excel functionality so your code runs faster Application.screenUpdating = False Application.calculation = xlCalculationManual Application.enableEvents = False ActiveSheet.displayPageBreaks = False 'Note this is a sheet-level setting, but only necessary for ActiveSheet if code do not change the ActiveSheet End Sub ' Unfreezes Excel and resets it into the configuration it had ' before the freezeSystem() was executed. ' Call this routine at the end of the macro code and also during ' the cleanup of exception handling. Public Sub defreezeSystem() ' Reset Excel configuration into previous state Application.screenUpdating = screenUpdating Application.calculation = calculation Application.enableEvents = enableEvents ActiveSheet.displayPageBreaks = displayPageBreaks 'Note this is a sheet-level setting, but only necessary for ActiveSheet if code do not change the ActiveSheet ' Perform recalculation of all formulas Application.CalculateFullRebuild End Sub ' This routine is intended to update the Excel window ' while executing macro code in controlled manner if ' necessary. Be aware that calling this function too ' often will drastically reduce the execution performance. Public Sub updateSystem() If Application.screenUpdating = False Then Application.screenUpdating = True Application.CalculateFullRebuild Application.screenUpdating = False Else Application.CalculateFullRebuild End If End Sub 

在开始时调用freezeSystem()或您的代码来提高执行期间的性能。 在代码末尾调用defreezeSystem() ,并在需要时在exception处理期间清理。

我这样做:

 Sub entryPoint() On Error GoTo entryPointErrorHandler ' set up exception handling freezeSystem [your regular code goes here] entryPointCleanUp: ' clean up from exception and normal operation [your cleanup code goes here] defreezeSystem Exit Sub entryPointErrorHandler: ' exception handling [your exception handling code goes here] GoTo entryPointCleanUp ' jump to clean up code End Sub 

加快速度的一种方法是告诉Excel不要更新屏幕或计算单元格。 在循环之前closures它们,然后打开它们:

 '***** Before loop Application.ScreenUpdating = False Application.Calculation = xlCalculationManual '***** After loop Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic 

尝试使用已经设置的参考。 例如:而不是

 Do Until Sheets("Source").Cells(i, 1) = "" x = Left(Sheets("Source").Cells(i, 6), 3) y = Left(Sheets("Source").Cells(i, 23), 7) 

使用

 Do Until Sheets("Source").Cells(i, 1) = "" x = Left(ws1.Cells(i, 6), 3) y = Left(ws1.Cells(i, 23), 7) 

我也会尽量避免VLOOKUP ,这很慢。 如果你只需要检查一个范围内的值是否存在,则COUNTIF要快得多。