Use "With" statement - danielep71/VBA-PERFORMANCE GitHub Wiki

[Home]] ](/danielep71/VBA-PERFORMANCE/wiki/[[Tips-and-Tricks)


If you reference the same objects multiple times (ex. Ranges, Worksheets, Workbooks), consider using the "With" statement rather than referencing them individually.

1. Description

2. How to use

With statement example:

Sub Faster_Example()
    With Sheets("Sheet2")
        .Range("D9").FormulaR1C1 = "example"
        .Range("D12").FormulaR1C1 = "demo"
        .Range("D9").Font.Bold = True
        .Range("D12").Font.Bold = True
    End With
End Sub

no "With" statement:

Sub Slow_Example()
    Sheets("Sheet2").Range("D9").FormulaR1C1 = "example"
    Sheets("Sheet2").Range("D12").FormulaR1C1 = "demo"
    Sheets("Sheet2").Range("D9").Font.Bold = True
    Sheets("Sheet2").Range("D12").Font.Bold = True
End Sub

3. Performance Test

I have performed the following test

Sub Test_WithStatement()
'------------------------------------------------------------------------------
'Declare
    Dim i               As Long                     'Loop counter
    Dim MaxIter         As Long                     'Max # of iterations
    Dim iMethod         As Integer                  'Performance method
    Dim cPM             As cPerformanceMonitor      'Performance tracker
'------------------------------------------------------------------------------
'Initialize
    MaxIter = 1000
    iMethod = 5
    Set cPM = New cPerformanceMonitor
'------------------------------------------------------------------------------
'Test1        
    cPM.StartTimer (iMethod)
    For i = 1 To MaxIter
        Sheets("Sheet2").Range("D9").FormulaR1C1 = "example"
        Sheets("Sheet2").Range("D12").FormulaR1C1 = "demo"
        Sheets("Sheet2").Range("D9").Font.Bold = True
        Sheets("Sheet2").Range("D12").Font.Bold = True
    Next i
    Debug.Print cPM.ElapsedTime(iMethod) & " - " & "Without statement"
'------------------------------------------------------------------------------
'Test2
    cPM.StartTimer (iMethod)
    For i = 1 To MaxIter
        With Sheets("Sheet2")
            .Range("D9").FormulaR1C1 = "example"
            .Range("D12").FormulaR1C1 = "demo"
            .Range("D9").Font.Bold = True
            .Range("D12").Font.Bold = True
        End With
    Next i
    Debug.Print cPM.ElapsedTime(iMethod) & " - " & "With statement 1"
'------------------------------------------------------------------------------
'Test3
    cPM.StartTimer (iMethod)
    For i = 1 To MaxIter
        With Sheets("Sheet2").Range("D9")
            .FormulaR1C1 = "example"
            .Font.Bold = True
        End With
        With Sheets("Sheet2").Range("D12")
            .FormulaR1C1 = "demo"
            .Font.Bold = True
        End With
    Next i
    Debug.Print cPM.ElapsedTime(iMethod) & " - " & "With statement 2"
'------------------------------------------------------------------------------
'Exit
    Set cPM = Nothing
End Sub

4. Results

The results are the following:

  • 00:00:07 - 143 ms - 595 µs - 200 ns - Without statement
  • 00:00:07 - 421 ms - 972 µs - 200 ns - With statement 1
  • 00:00:07 - 516 ms - 359 µs - 500 ns - With statement 2

5. Conclusions

Using the "With" statement is slightly slower to process but makes your code easier to read and simplifies.


[Home]] ](/danielep71/VBA-PERFORMANCE/wiki/[[Tips-and-Tricks)