If b And it.Count > 1 And it.Count < 5 Then
b is false at that time
Where is b use for anything other than setting b?
b = it.Count > 1 And it.Count < 5
Ignores the edge case wherein it.count = 5 and doesn't even effect the next line.
If b And it.Count > 1 And it.Count < 5 Then
b = False
Else
b = it.Count > 1 And it.Count < 5
If IsArray(sn) Then Cells(Rows.Count, 4).End(xlUp).Offset(1).Resize(, UBound(sn)) = sn
End If
Can be refactored to
If IsArray(sn) Then Cells(Rows.Count, 4).End(xlUp).Offset(1).Resize(, UBound(sn)) = sn
Your entire code can be refactored to
Sub M_snb()
For Each it In Columns(1).SpecialCells(2).Areas
Cells(Rows.Count, 4).End(xlUp).Offset(1).Resize(, 6) = Application.Transpose(it.Resize(6))
Next
End Sub
Basically, the same three lines as in my example, with the advantage of yours being that no Filter Unique is needed for cleanup.
But will still have spurious returns when the "Email" line is the only empty line in any 6 line Data block
To combine the best of yours with mine would be to edit my 3 code lines to read
For Rw = 1 to LR Step 7
Cells(Rows.Count, "D").End(xlUp).Offset(1).Resize(, 6) = WSF.Transpose(Cells(Rw, "A").Resize(6))
Next Rw
I recognize that my offering is based on the assumption that the actual raw Data is exactly 6 Rows of Data followed by 1 empty Row
And I did have another error:
Set WSF = WorksheetFunction
Should read
Set WSF = Application.WorksheetFunction