Function sort(s As String) As String Dim As Uinteger i, j, n = Len(s) Dim As String temp For i = 1 To n For j = i + 1 To n If Asc(Mid(s, i, 1)) > Asc(Mid(s, j, 1)) Then temp = Mid(s, i, 1) Mid(s, i, 1) = Mid(s, j, 1) Mid(s, j, 1) = temp End If Next j Next i Return s End Function Function rfind(c As String, s As String) As Uinteger Return Instr(s, c) End Function Function nextHigh2(n As String) As String Dim As Uinteger hi = Asc(Right(n, 1)) Dim As Uinteger i, ni, idx Dim As String sr For i = Len(n) - 1 To 1 Step -1 ni = Asc(Mid(n, i, 1)) If ni < hi Then sr = sort(Mid(n, i)) idx = rfind(Chr(ni), sr) + 1 Mid(n, i, 1) = Mid(sr, idx, 1) Mid(sr, idx, 1) = "" Mid(n, i + 1) = sr Return n End If hi = Iif(hi > ni, hi, ni) Next i Return "0" End Function Dim As String tests2(8) = { "0", "9", "12", "21", "12453", _ "738440", "45072010", "95322020", "9589776899767587796600" } Dim As Double t1 = Timer For i As Uinteger = 0 To Ubound(tests2) Print tests2(i); " => "; nextHigh2(tests2(i)) Next i Print Chr(10); Timer - t1; "sec."