Harlan's formula seems to break with numbers or blanks. The one I wrote is:
[reformatted slightly]
=IF(INDEX(Data,RIGHT(TEXT(SMALL(ISTEXT(Data)*ROWS(Data)+(Data="")*ROWS(Data)
*2+ISTEXT(Data)*COUNTIF(Data,"<='"&Data)+ISNONTEXT(Data)*COUNTIF(Data,"<="
&Data)+(ROW(Data)-MIN(ROW(Data))+1)/100000,ROW(INDIRECT("1:"&ROWS(Data)))),
"0.00000"),5))="","",INDEX(Data,RIGHT(TEXT(SMALL(ISTEXT(Data)*ROWS(Data)
+(Data="")*ROWS(Data)*2+ISTEXT(Data)*COUNTIF(Data,"<='"&Data)+ISNONTEXT(Data)
*COUNTIF(Data,"<="&Data)+(ROW(Data)-MIN(ROW(Data))+1)/100000,
ROW(INDIRECT("1:"&ROWS(Data)))),"0.00000"),5)))
It sorts entries of mixed data types (text, numbers, numbers as text, and
blanks) and places blanks at the end of the list. (In fact, the order in
which it places the different data types can be controlled quite easily by
modifying the multipliers.)
...
First a quibble. ROW(INDIRECT("1:"&ROWS(Data))) gives the same 1D array of
integers that ROW(Data)-CELL("Row",Data)+1 does, but the former uses 3 function
calls all nested while the latter uses just two unnested function calls. In
complicated nested formulas, ROW(.)-CELL("Row",.)+1 is always the better idiom
to use.
It's an open qhestion whether numbers as text should be sorted as text or as
numbers. I'd sort them as text. If they should be sorted as numbers, why not
convert them to numbers in the source range?
That said, to sort numbers after text and blanks after both with numbers and
text sorted in ascending order,
=INDEX(IF(ISBLANK(Data),"",Data),MATCH(SMALL(ISBLANK(Data)*2*VERYBIG
+IF(ISNUMBER(Data),VERYBIG+COUNTIF(Data,"<"&Data),COUNTIF(Data,"<"&Data&"*")),
ROW(Data)-CELL("Row",Data)+1),ISBLANK(Data)*2*VERYBIG+IF(ISNUMBER(Data),
VERYBIG+COUNTIF(Data,"<"&Data),COUNTIF(Data,"<"&Data&"*")),0))
where VERYBIG is defined as =1E9 or some other fairly large number.