Public Sub Filter_Rows_To_New_Workbooks()
Dim newWb As Workbook
Dim dataSheet As Worksheet
Dim criteriaSheet As Worksheet
Dim filteredSheet As Worksheet
Dim criteriaCell As Range
Dim lr As Long
Dim mainFolder As String, saveName As String
'Main folder in which results of each filtered name will be saved in a subfolder, named after the column D value
'with invalid characters removed. The subfolder is created if it doesn't exist
mainFolder = "C:\Path\To\Folder\"
If Right(mainFolder, 1) <> "\" Then mainFolder = mainFolder & "\"
'Sheet containing the data to be filtered
Set dataSheet = ThisWorkbook.Worksheets("0100_Member_Tracker")
'Create a temporary sheet to hold the filter criteria
Set criteriaSheet = ThisWorkbook.Worksheets.Add
lr = dataSheet.Range("D" & Rows.Count).End(xlUp).Row
'Put column D unique values in the temporary sheet
dataSheet.Range("D1:D" & lr).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=criteriaSheet.Range("A1"), Unique:=True
'Create a temporary sheet to hold each set of filtered data
Set filteredSheet = Worksheets.Add
Application.DisplayAlerts = False
Set criteriaCell = criteriaSheet.Range("A2")
While criteriaCell.Value <> ""
filteredSheet.Cells.Clear
dataSheet.Range("A1:Z" & lr).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=criteriaCell.Offset(-1).Resize(2), CopyToRange:=filteredSheet.Range("A1"), Unique:=True
filteredSheet.Name = criteriaCell.Value
filteredSheet.Copy
Set newWb = ActiveWorkbook
saveName = sCleanFileName(criteriaCell.Value)
If Dir(mainFolder & saveName, vbDirectory) = "" Then MkDir mainFolder & saveName
newWb.SaveAs mainFolder & saveName & "\" & saveName
newWb.Close SaveChanges:=True
criteriaCell.EntireRow.Delete
Set criteriaCell = criteriaSheet.Range("A2")
Wend
'Delete the temporary sheets
filteredSheet.Delete
criteriaSheet.Delete
Application.DisplayAlerts = True
End Sub
Private Function sCleanFileName(sText As String) As String
'--replaces any characters in input string that are not allowed
' in filenames
Dim lIdx As Long
Dim vNotAllowed As Variant
vNotAllowed = Split("<,>,?,[,],:,"",*,/,\", ",")
For lIdx = LBound(vNotAllowed) To UBound(vNotAllowed)
sText = Replace(sText, vNotAllowed(lIdx), "_")
Next lIdx
sCleanFileName = sText
End Function