If row 11 was not empty then Range("A12").CurrentRegion would start below the first blank row above row 12 (or row 1 if none) so the code would be working on the wrong row. I could improve the code so that was not an issue.
You are correct about having to remove the ClearOutline from one of the procedures if wanting to run both in sequence.
lStart is the column (or row) number of the start of the next group.
lColumn is the column number of the one we are currently looking at.
If it does not start with 3 numeric characters then it is the column after the end of the group.
So, if there are columns to be grouped, lColumn will exceed lStart
So, If lColumn>lStart Then we want to form a group starting with column lStart and ending at the column before lColumn
The number of columns in the group will be lColumn - lStart.
So
.Columns(lStart) is the lStart'th column of the region
.Columns(lStart).Resize(,lColumn-lStart) is that lStart'th column extened to the right to be the correct number of columns
.Columns(lStart).Resize(,lColumn-lStart).EntireColumn are the entire columns that are to be grouped (as I think you can only group entire columns )
and
.Columns(lStart).Resize(,lColumn-lStart).EntireColumn.Group applies the Group method to those columns, forming them into a group.
lStart = lColumn + 1 is noting that the next group will start at the earliest after the non-numeric item we have just considered, in column lColumn
Hope this helps.
Bill Manville. Excel MVP, Oxford, England. www.manville.org.uk