Los ordena de esa manera porque seguramente son valores leidos de un archivo de texto, de un control que contiene valores tipo texto o de variables declaradas como tipo texto (string). Para que los ordenes correctamente no puedes comparar el valor tal y como es, sino que tienes que comparar el equivalente numerico de la expresion. El equivalente numerico lo consigues con Val().