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...