I can't explain the "On" making it into the results unless you've added a color to the arrColors variable that contains the letters "on" in sequence. Blonde?

This is a bit sloppy, assuming you'll have no single or two lettered colors, we could go with this:

Public Function getColors(strprodname As String) As String
Dim arrColors()
Dim strColors As String
Dim x As Variant
Dim n As Integer

arrColors = Array("white", "blue", "green", "black", "yellow", "red", "purple")

x = Split(strprodname, " ")
For n = 0 To UBound(x)
    If Len(x(n)) > 2 Then
    If IsInArray(arrColors, LCase(x(n))) Then
        strColors = strColors & x(n) & " , "
    End If
    End If
Next n

If Len(strColors) > 0 Then
strColors = Trim(Left(strColors, InStrRev(strColors, ",") - 1))
End If

getColors = strColors
End Function
Hope that helps...