Are you always going to have those blank lines between colors?
If so, this won't work, so I removed them.
If you absolutly have to have them use a loop rather than Advanced Filter.
Dim rngData As Range
Dim critRange As Range
Private Sub ComboBox1_Click()
Dim oneCell As Range
If ComboBox1.ListIndex <> -1 Then
critRange.Cells(2, 1).Value = "*" & ComboBox1.Text
rngData.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=critRange, Unique:=False
ComboBox2.Clear
For Each oneCell In rngData.Columns(3).Offset(1, 0).SpecialCells(xlCellTypeVisible)
ComboBox2.AddItem Left(oneCell.Value, 4)
Next oneCell
ComboBox3.Clear
End If
End Sub
Private Sub ComboBox2_Click()
Dim oneCell As Range
If ComboBox2.ListIndex <> -1 Then
critRange.Cells(2, 1).Value = ComboBox2.Text & "*" & ComboBox1.Text
On Error Resume Next
rngData.Parent.ShowAllData
On Error GoTo 0
rngData.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=critRange, Unique:=False
ComboBox3.Clear
For Each oneCell In rngData.Offset(1, 0).Columns(3).SpecialCells(xlCellTypeVisible)
ComboBox3.AddItem oneCell.Value
Next oneCell
End If
End Sub
Private Sub UserForm_Initialize()
Set rngData = Sheet1.Range("A2").CurrentRegion
Set critRange = rngData.Offset(0, rngData.Columns.Count + 1).Resize(2, 1)
critRange.Cells(1, 1).Value = "Description"
With ComboBox1
.AddItem "Black"
.AddItem "Grey"
.AddItem "White"
End With
Me.Caption = rngData.Address
End Sub
Private Sub UserForm_Terminate()
With critRange
On Error Resume Next
.Parent.ShowAllData
On Error GoTo 0
.ClearContents
End With
End Sub