Search code examples
vbaexcelloops

Another way instead of do-until loop to make code execute faster


I need help on how to make my code execute faster. I have a very large volume of data and my 'Do Until loop' causes the slow execution. I wonder if there's a way to make my code run faster. I only used do until loop because I'm comfortable with it. Thanks

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

Solution

  • There are many possible way how to improve the performance of Excel's VBA code. At best you read some articles about that:


    Edit: As suggested by Bond I here is what I do in my VBA code to improve the execution performance:

    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
    

    Call freezeSystem() at the beginning or your code to improve the performance during execution. Call defreezeSystem()at the end of your code and while cleaning up during exception handling if necessary.

    I do it in this way:

    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