I did say it might work
The only way to not display the blank entries is not to have them - you need to make your array dynamic. The problem then becomes that you can only resize the last dimension of your array so you need to transpose it. Having done that it can be made to work by transposing it again when you add it to the list box. And in between you have to sort by columns instead of rows.
So, instead of your array having 4 columns and many rows, it will have 4 rows and many columns and you sort the columns. Also it would be better declared as String instead of Variant, something like this:
[vba]
Dim YourArray() As String
ReDim YourArray(0, 0)
' Fill the first (zeroth) column
ReDim Preserve YourArray(1, 0)
' Fill the second column
' etc.
' Parameters for the Sort are:
' array, ascending/descending, first column, last column, type (1=column)
WordBasic.SortArray YourArray$(), 0, 0, UBound(YourArray, 2), 1
' transpose to listbox
UserForm1.ListBox1.Column = YourArray
[/vba]
You might reasonably decide that this quickly becomes obscure and go with Bob's sort instead!
I'm not sure I follow what you're saying about the messing up.