Okay.
Here's the part of code, with code lines numbered for reference.
1. If Not cel = "" Then
2. Set c = Source.Range("A1")
3. Set Rng = Nothing
4. Do While c.Row < Source.Range("A" & Source.Rows.Count).End(xlUp).Row
5. If c = cel Then
6. If Rng Is Nothing Then Set Rng = c.Offset(1)
7. Set Rng = Union(Rng, Range(c.Offset(1), c.Offset(1).End(xlDown)))
8. Set c = c.Offset(1).End(xlDown).Offset(1)
9. Else
10. Set c = c.Offset(1)
11. End If
12. Loop
13. End If
Line #1 and #13 bracket a core code that runs only if value of cel is not an empty string.
The objective of the core code (Lines #2 through #12) is to scan Column A of Source sheet. It loops through (almost) all cells in Column A, looking for occurences of cel.Value (i.e. Staff 001, Staff 002, etc.) Looping is done by lines #4 and #12.
Now, if the current cell's value is of interest, I mean, it is Staff 001, or Staff 002, etc., then I pick the range of data below it
Range(c.Offset(1), c.Offset(1).End(xlDown)
and join this range to the previous range, that belonged to the same staff number. This joining is done by code line #7.
Example:
After finding the 1st occurence of Staff 001, the range will be "A4:A17".
After finding the 2nd occurence of Staff 001, the range will be "A4:A17,A42:A50".
After the current cell has been processed, whether it was Staff 001 or something else, the focus of attention moves to the next cell.
Line #10 just moves down by one cell. Purpose of line #8 is to skip those cells that belong to the data range of Staff 001.
The loop is finished when the current cell's rowindex (c.Row) becomes equal with the last cell's rowindex. (See line #2 for the looping condition.)
c.Row = Source.Range("A" & Source.Rows.Count).End(xlUp).Row
Code lines #2 and 3 are starting values.
Code line #6 is necessary because Union method gives an error, if one of it's arguments is Nothing, and Rng, in the beginning, is Nothing.
Of course, this problem could have been solved by using FindNext, as well. Probably it would have been more elegant. I personally don't like FindNext very much, so I try to work around.
I hope this helped you to understand.
Jimmy