To answer your question on sorting by a certain column, you can use this general routine (I would place this in a module) :

VB Code:
  1. '-----------------------------------------------------------------------------
  2. Public Sub SortGrid(pobjGrid As MSFlexGrid, ByVal plngSortCol As Long)
  3. '-----------------------------------------------------------------------------
  4.    
  5.     With pobjGrid
  6.    
  7.         ' suppress changes in display until done
  8.         .Redraw = False
  9.    
  10.         ' Sort using the clicked column.
  11.         .Col = plngSortCol
  12.         .ColSel = plngSortCol
  13.         .Row = 0
  14.         .RowSel = 0
  15.    
  16.         ' If this is a new sort column, sort ascending.
  17.         ' Otherwise switch which sort order we use.
  18.         If mlngSortCol <> plngSortCol Then
  19.             mintSortOrder = flexSortGenericAscending
  20.         ElseIf mintSortOrder = flexSortGenericAscending Then
  21.             mintSortOrder = flexSortGenericDescending
  22.         Else
  23.             mintSortOrder = flexSortGenericAscending
  24.         End If
  25.         .Sort = mintSortOrder
  26.    
  27.         ' Restore the previous sort column's name.
  28.         If mlngSortCol = 0 Then
  29.             If Left$(.TextMatrix(0, 0), 2) = "< " _
  30.             Or Left$(.TextMatrix(0, 0), 2) = "> " _
  31.             Then
  32.                 .TextMatrix(0, 0) = Mid$(.TextMatrix(0, 0), 3)
  33.             End If
  34.         Else
  35.             .TextMatrix(0, mlngSortCol) = Mid$(.TextMatrix(0, mlngSortCol), 3)
  36.         End If
  37.    
  38.         ' Display the new sort column's name.
  39.         mlngSortCol = plngSortCol
  40.         If mintSortOrder = flexSortGenericAscending Then
  41.             .TextMatrix(0, mlngSortCol) = "< " & _
  42.                 .TextMatrix(0, mlngSortCol)
  43.         Else
  44.             .TextMatrix(0, mlngSortCol) = "> " & _
  45.                 .TextMatrix(0, mlngSortCol)
  46.         End If
  47.    
  48.        ' refresh the display
  49.         .Redraw = True
  50.    
  51.     End With
  52.    
  53. End Sub

USAGE:
VB Code:
  1. '-----------------------------------------------------------------------------
  2. Private Sub MSFlexGrid1_MouseUp(Button As Integer, _
  3.                                 Shift As Integer, _
  4.                                 X As Single, _
  5.                                 Y As Single)
  6. '-----------------------------------------------------------------------------
  7.    
  8.     ' If this is not row 0, do nothing.
  9.     If MSFlexGrid1.MouseRow <> 0 Then Exit Sub
  10.  
  11.     MSFlexGrid1.Highlight = flexHighlightNever
  12.    
  13.     ' Sort by the clicked column.
  14.     SortGrid MSFlexGrid1, MSFlexGrid1.MouseCol
  15.  
  16. End Sub

NOTES:
When setting up the grid, it is assumed that you have set FixedRows to 1 (thus reserving the first row, row 0, for the column headings). In my example, I am not using any fixed columns, but if you are, than you should test for that in your MouseUp routine, i.e.:
If MSFlexGrid1.MouseCol = 0 Then Exit Sub
Also, as a rule of thumb, if the column contains numeric data, concatenate one blank space at the beginning of the data, i.e.:
" " & TheNumericData
Additionally, for dates, format them with the year first:
" " & Format$(TheDateField, "yyyy-mm-dd")

-----------------------------------------------------------------

Can't help you with rearranging columns

----------------------------------------------------------------
To set the alignment of text in the current cell, you can use the CellAlignment property.

I hope this has helped.