Getting error Procedure too large in VBA Macros (Excel) Getting error Procedure too large in VBA Macros (Excel) vba vba

Getting error Procedure too large in VBA Macros (Excel)


You will get that error if your procedure is more than 64kb. These are some of the things that you can to compact your code

1) Get rid of repetitive code. See this example

Sub Sample()    Range("A1") = "Blah Blah"    Range("A2") = "Blah Blah"    Range("A3") = "Blah Blah"    Range("A4") = "Blah Blah"    Range("A5") = "Blah Blah"    Range("A6") = "Blah Blah"    Range("A7") = "Blah Blah"End Sub

This code can be written as

Sub Sample()    For i = 1 To 7        Range("A" & i) = "Blah Blah"    Next iEnd Sub

Another example

Sub Sample()    Range("A1") = (Range("A1") * 10) + (Range("A1") + 30) + (Range("A1") / 30)    Range("A5") = (Range("A5") * 10) + (Range("A5") + 30) + (Range("A5") / 30)    Range("A11") = (Range("A11") * 10) + (Range("A11") + 30) + (Range("A11") / 30)    Range("A6") = (Range("A6") * 10) + (Range("A6") + 30) + (Range("A6") / 30)    Range("A8") = (Range("A8") * 10) + (Range("A8") + 30) + (Range("A8") / 30)    Range("A56") = (Range("A56") * 10) + (Range("A56") + 30) + (Range("A56") / 30)End Sub

This code can be written as

Sub Sample()    Range("A1") = GetVal(Range("A1"))    Range("A5") = GetVal(Range("A5"))    Range("A11") = GetVal(Range("A11"))    Range("A6") = GetVal(Range("A6"))    Range("A8") = GetVal(Range("A8"))    Range("A56") = GetVal(Range("A56"))End SubFunction GetVal(rng As Range) As Variant    GetVal = (rng.Value * 10) + (rng.Value + 30) + (rng.Value / 30)End Function

This will ensure that you cut down on space and do not write repetitive code.

2) If you generated the code via the macro then you may get something like this. Get rid of the useless code like ActiveWindow.ScrollRow = 8968

Option Explicit'~~> This procedure fills Excel's 10000 cells with random values and then removes the duplicatesSub FillExcelCells()    Dim rowCount As Long    '~~> Activate the necesary Sheet    Sheets("Sheet1").Activate    '~~> Loop through all the cells and store random numbers    For rowCount = 1 To 10000        Sheets("Sheet1").Range("A" & rowCount).Select        Sheets("Sheet1").Range("A" & rowCount).Value = Int((10000 - 1) * Rnd() + 1)    Next rowCount    '~~> Sort the Range    Sheets("Sheet1").Range("A1").Select    Sheets("Sheet1").Range(Selection, Selection.End(xlDown)).Select    Application.CutCopyMode = False    Range(Selection, Selection.End(xlDown)).Select    ActiveWindow.SmallScroll Down:=-39    ActiveWindow.ScrollRow = 9838    ActiveWindow.ScrollRow = 9709    ActiveWindow.ScrollRow = 9449    ActiveWindow.ScrollRow = 8968    ActiveWindow.ScrollRow = 8319    ActiveWindow.ScrollRow = 7245    ActiveWindow.ScrollRow = 6003    ActiveWindow.ScrollRow = 4818    ActiveWindow.ScrollRow = 4040    ActiveWindow.ScrollRow = 3317    ActiveWindow.ScrollRow = 3076    ActiveWindow.ScrollRow = 2521    ActiveWindow.ScrollRow = 2298    ActiveWindow.ScrollRow = 2113    ActiveWindow.ScrollRow = 1724    ActiveWindow.ScrollRow = 1372    ActiveWindow.ScrollRow = 1038    ActiveWindow.ScrollRow = 872    ActiveWindow.ScrollRow = 668    ActiveWindow.ScrollRow = 538    ActiveWindow.ScrollRow = 464    ActiveWindow.ScrollRow = 446    ActiveWindow.ScrollRow = 427    ActiveWindow.ScrollRow = 409    ActiveWindow.ScrollRow = 390    ActiveWindow.ScrollRow = 353    ActiveWindow.ScrollRow = 334    ActiveWindow.ScrollRow = 297    ActiveWindow.ScrollRow = 279    ActiveWindow.ScrollRow = 242    ActiveWindow.ScrollRow = 223    ActiveWindow.ScrollRow = 205    ActiveWindow.ScrollRow = 168    ActiveWindow.ScrollRow = 149    ActiveWindow.ScrollRow = 112    ActiveWindow.ScrollRow = 94    ActiveWindow.ScrollRow = 57    ActiveWindow.ScrollRow = 20    ActiveWindow.ScrollRow = 1    Selection.Sort Key1:=Sheets("Sheet1").Range("A1"), Order1:=xlAscending, Header:=xlGuess, _    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _    DataOption1:=xlSortNormal    '~~> Delete duplicates    For rowCount = 10000 To 2 Step -1        Sheets("Sheet1").Range("A" & rowCount).Select        If Range("A" & rowCount).Value = Range("A" & rowCount - 1).Value Then            Sheets("Sheet1").Rows(rowCount).Delete shift:=xlUp        End If    Next rowCountEnd Sub

The above can be written as

'~~> This procedure fills Excel's 10000 cells with random values and then removes the duplicatesSub FillExcelCells()    Dim rowCount As Long    With Sheets("Sheet1")        '~~> Loop through all the cells and store random numbers        For rowCount = 1 To 10000            .Range("A" & rowCount).Value = Int((10000 - 1) * Rnd() + 1)        Next rowCount        '~~> Sort Range        .Range("A1:A10000").Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlGuess, _        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal        '~~> Delete duplicates        For rowCount = 10000 To 2 Step -1            If .Range("A" & rowCount).Value = .Range("A" & rowCount - 1).Value Then                .Rows(rowCount).Delete shift:=xlUp            End If        Next rowCount    End WithEnd Sub

3) Declare you Objects so that you don't have to keep on repeating them. See this example

Sub Sample()    Range("A1").Select    ActiveCell.FormulaR1C1 = "sdasds"    Range("A1").Select    With Selection.Interior        .Pattern = xlSolid        .PatternColorIndex = xlAutomatic        .Color = 65535        .TintAndShade = 0        .PatternTintAndShade = 0    End With    Selection.Font.Bold = True    Selection.Font.Italic = True    Selection.Font.Underline = xlUnderlineStyleSingle    With Selection        .HorizontalAlignment = xlGeneral        .VerticalAlignment = xlBottom        .WrapText = True        .Orientation = 0        .AddIndent = False        .IndentLevel = 0        .ShrinkToFit = False        .ReadingOrder = xlContext        .MergeCells = False    End WithEnd Sub

This can be written as

Sub Sample()    Dim ws As Worksheet, rng As Range    Set ws = Sheet1    Set rng = ws.Range("A1")    With rng        .FormulaR1C1 = "sdasds"        With .Interior            .Pattern = xlSolid            .PatternColorIndex = xlAutomatic            .Color = 65535            .TintAndShade = 0            .PatternTintAndShade = 0        End With        .Font.Bold = True        .Font.Italic = True        .Font.Underline = xlUnderlineStyleSingle        .HorizontalAlignment = xlGeneral        .VerticalAlignment = xlBottom        .WrapText = True        .Orientation = 0        .AddIndent = False        .IndentLevel = 0        .ShrinkToFit = False        .ReadingOrder = xlContext        .MergeCells = False    End WithEnd Sub

4) Break Up your procedure if need be. and call the 2nd procedure from the 1st

5) Avoid using .Select and .Activate They not only make your code slow but also take a lot of space in your code if used extensively. How to avoid using Select in Excel VBA macros


Macros size is limited to 64kb, after which you will get an error message from Excel.

I ran into an issue, for which there is no explanation or error message from Excel, where Excel was unable to fully calculate a workbook for want of resources when I wrote a macro that calls multiple other macros.

I am presuming that the sum of the length of all macros in the chain would need to be considered.