Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef lpDest As Any, ByRef lpSource As Any, ByVal iLen As Long)
Public Sub SortStringArray(ByRef sArray() As String)
Dim iLB As Long, iUB As Long, i As Long, j As Long, vTemp As String
iLB = LBound(sArray)
iUB = UBound(sArray)
SortStringArrayStep2 sArray, 4, iLB, iUB
InsertionSortString sArray, iLB, iUB
End Sub
Private Sub SortStringArrayStep2(ByRef sArray() As String, ByVal iSplit As Long, ByVal iLB As Long, ByVal iUB As Long)
Dim i As Long, j As Long, vTemp As String
If (iUB - iLB) > iSplit Then
i = (iUB + iLB) / 2
If sArray(iLB) > sArray(i) Then SwitchStr sArray(iLB), sArray(i)
If sArray(iLB) > sArray(iUB) Then SwitchStr sArray(iLB), sArray(iUB)
If sArray(i) > sArray(iUB) Then SwitchStr sArray(i), sArray(iUB)
j = iUB - 1
SwitchStr sArray(i), sArray(j)
i = iLB
CopyMemory ByVal VarPtr(vTemp), ByVal VarPtr(sArray(j)), 4 ' vTemp = sArray(j)
Do
Do
i = i + 1
Loop While sArray(i) < vTemp
Do
j = j - 1
Loop While sArray(j) > vTemp
If j < i Then Exit Do
SwitchStr sArray(i), sArray(j)
Loop
SwitchStr sArray(i), sArray(iUB - 1)
SortStringArrayStep2 sArray, iSplit, iLB, j
SortStringArrayStep2 sArray, iSplit, i + 1, iUB
End If
i = 0
CopyMemory ByVal VarPtr(vTemp), ByVal VarPtr(i), 4
End Sub
Private Sub InsertionSortString(ByRef sArray() As String, ByVal iLB As Long, ByVal iUB As Long)
Dim i As Long, j As Long, vTemp As String
For i = iLB + 1 To iUB
CopyMemory ByVal VarPtr(vTemp), ByVal VarPtr(sArray(i)), 4 ' vTemp = sArray(i)
j = i
Do While j > iLB
If sArray(j - 1) <= vTemp Then Exit Do
CopyMemory ByVal VarPtr(sArray(j)), ByVal VarPtr(sArray(j - 1)), 4 ' sArray(j) = sArray(j - 1)
j = j - 1
Loop
CopyMemory ByVal VarPtr(sArray(j)), ByVal VarPtr(vTemp), 4
Next i
i = 0
CopyMemory ByVal VarPtr(vTemp), ByVal VarPtr(i), 4
End Sub
Private Sub SwitchStr(ByRef s1 As String, ByRef s2 As String)
Dim i As Long
i = StrPtr(s1)
If i = 0 Then CopyMemory ByVal VarPtr(i), ByVal VarPtr(s1), 4
CopyMemory ByVal VarPtr(s1), ByVal VarPtr(s2), 4
CopyMemory ByVal VarPtr(s2), i, 4
End Sub[/vba]Then call it as follows:[vba] Dim i As Long, vArray() As String, ArrCount As Long
ArrCount = 0
ReDim vArray(ArrCount)
With Sheets("Sheet1")
For i = 2 To .Range("C65536").End(xlUp).Row
If .Cells(i, 3) <> "" Then
ReDim Preserve vArray(ArrCount)
vArray(ArrCount) = .Cells(i, 3)
ArrCount = ArrCount + 1
End If
Next i
End With
SortStringArray vArray
UserForm1.ListBox1.List = vArray
Matt