Hàm sắp xếp chuỗi chứa ký tự

Liên hệ QC

NguyenNgocSon

KEEP WALKING
Tham gia
4/4/08
Bài viết
280
Được thích
832
Nghề nghiệp
Ths. Cầu hầm
Em đã tìm trên diễn đàn một số hàm sắp xếp nhưng chưa thực hiện được yêu cầu
Sắp xếp chuỗi sau:
KM0+500.00,KM0+480.00,KM0+460.00,KM0+320.00,KM1+300.00,KM0+280.00,KM0+440.00,KM0+420.00,KM0+340.00,KM2+490.00
Kết quả:
KM0+280.00,KM0+320.00,KM0+340.00,KM0+420.00,KM0+440.00,KM0+460.00,KM0+480.00,KM0+500.00,KM1+300.00,KM2+490.00
Trân trọng cám ơn !
 
Giải thuật:
Dùng hàm split để tách chuỗi thành mảng theo ký tự ","
sau khi có mảng thì bạn có 3 chọn lựa để sắp xếp:
(i) Dùng một hàm sắp xếp - kiểu nỏi bọt chẳng hạn
(ii) chuyển mảng vào một object ArrayList của .NET và bảo nó sắp xếp
(iii) Chuyển mảng vào một object JavaScript và bảo nó sắp xếp
Sau khi sắp xếp xong thì dùng hàm Join để nối lại theo ký tự ","

Chú: tất cả (i), (ii), (iii) trên đều có sẵn code trên diễn đàn này.
 
Upvote 0
Giải thuật:
Dùng hàm split để tách chuỗi thành mảng theo ký tự ","
sau khi có mảng thì bạn có 3 chọn lựa để sắp xếp:
(i) Dùng một hàm sắp xếp - kiểu nỏi bọt chẳng hạn
(ii) chuyển mảng vào một object ArrayList của .NET và bảo nó sắp xếp
(iii) Chuyển mảng vào một object JavaScript và bảo nó sắp xếp
Sau khi sắp xếp xong thì dùng hàm Join để nối lại theo ký tự ","

Chú: tất cả (i), (ii), (iii) trên đều có sẵn code trên diễn đàn này.
Mấy cái em đã làm thì nó chỉ sắp xếp theo số được thôi
Khi có ký tự nó sắp xếp ko đúng nữa ?
Trân trọng!
 
Upvote 0
Em đã tìm trên diễn đàn một số hàm sắp xếp nhưng chưa thực hiện được yêu cầu
Sắp xếp chuỗi sau:
KM0+500.00,KM0+480.00,KM0+460.00,KM0+320.00,KM1+300.00,KM0+280.00,KM0+440.00,KM0+420.00,KM0+340.00,KM2+490.00
Kết quả:
KM0+280.00,KM0+320.00,KM0+340.00,KM0+420.00,KM0+440.00,KM0+460.00,KM0+480.00,KM0+500.00,KM1+300.00,KM2+490.00
Trân trọng cám ơn !

Chỉ cho ra kết quả như sau thôi:
PHP:
   KM0+280.00,KM0+320.00,KM0+340.00,KM0+420.00,KM0+440.00,KM0+460.00,KM0+480.00,KM0+500.00,KM1+300.00,KM2+490.00
 
Upvote 0
bác cho xin luôn cái sub/functuon nhé
Cám ơn !
 
Upvote 0
Em đã tìm trên diễn đàn một số hàm sắp xếp nhưng chưa thực hiện được yêu cầu
Sắp xếp chuỗi sau:
KM0+500.00,KM0+480.00,KM0+460.00,KM0+320.00,KM1+300.00,KM0+280.00,KM0+440.00,KM0+420.00,KM0+340.00,KM2+490.00
Kết quả:
KM0+280.00,KM0+320.00,KM0+340.00,KM0+420.00,KM0+440.00,KM0+460.00,KM0+480.00,KM0+500.00,KM1+300.00,KM2+490.00
Trân trọng cám ơn !
Theo gợi ý của bác VetMini, bạn tham khảo:
PHP:
'Tach chuoi
Sub abc()
    Application.ScreenUpdating = False
    i = Cells(Rows.Count, "A").End(xlUp).Row
    Do While i > 0
        temp = Split(Cells(i, 1).Value, ",")
        For j = UBound(temp) To 0 Step -1
            Rows(i).Insert
            Cells(i, 3).Value = temp(j)
        Next
        i = i - 1
    Loop
    Application.ScreenUpdating = True
End Sub
'Sort
Sub loc()
    Range("C1:C" & Range("C" & Rows.Count).End(3)(1).Row).Select
    Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlGuess, _
                   OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                   DataOption1:=xlSortNormal
End Sub
Sub AZ()
    abc
    loc
End Sub
'Ghep chuoi
Function NoiChuoi(vung As Range)
    Dim cell As Range, tam
    For Each cell In vung
        If cell <> "" Then
            tam = tam & "," & cell
        End If
    Next
    NoiChuoi = Replace(tam, ",", "", 1, 1)
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Theo gợi ý của bác VetMini, bạn tham khảo:
PHP:
'Sort
Sub loc()
    Range("C1:C" & Range("C" & Rows.Count).End(3)(1).Row).Select
    Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlGuess, _
                   OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                   DataOption1:=xlSortNormal
End Sub

xin bạn cho biết code này là theo gợi ý số mấy của anh Vetmini vậy ?
búp bê sọt , ờ ray lít hay java ríp ?
 
Upvote 0
Xin lỗi Bác code này dùng Excel ghi macro em làm được rồi
Em muốn xử lý hàm theo chuỗi bằng VBA không phụ thuộc cách trên
Cám ơn !
 
Upvote 0
Có lẽ không đơn giản như bài #2. Để sắp xếp theo kiểu KM10+500.00 > KM2+500.00 cần phải viết hàm so sánh riêng.
 
Upvote 0
xin bạn cho biết code này là theo gợi ý số mấy của anh Vetmini vậy ?
búp bê sọt , ờ ray lít hay java ríp ?
Sao phải soi kỹ vậy bạn.Cái này Record Macro bình thường, mấy thứ bạn hỏi tôi nào có biết.
Về phía cá nhân tôi chỉ biết nghĩ làm sao để giải quyết được bài toán trước đã. Còn vấn đề làm thế nào để có cách giải hay, độc đáo thì chắc còn còn phải học hỏi nhiều ở các bậc đàn anh, đàn em trên diễn đàn GPE.
 
Upvote 0
Em đã tìm trên diễn đàn một số hàm sắp xếp nhưng chưa thực hiện được yêu cầu
Sắp xếp chuỗi sau:
KM0+500.00,KM0+480.00,KM0+460.00,KM0+320.00,KM1+300.00,KM0+280.00,KM0+440.00,KM0+420.00,KM0+340.00,KM2+490.00
Kết quả:
KM0+280.00,KM0+320.00,KM0+340.00,KM0+420.00,KM0+440.00,KM0+460.00,KM0+480.00,KM0+500.00,KM1+300.00,KM2+490.00
Trân trọng cám ơn !
Chủ topic thử hàm này nhé.
PHP:
Function SortString(Str As String, Optional OrderAscending As Boolean = True) As String
Dim i As Long, j As Long, ArrItem, Tmp As String
ArrItem = Split(Replace(Str, " ", ""), ",")
For i = 0 To UBound(ArrItem, 1) - 1
    For j = i + 1 To UBound(ArrItem, 1)
        If MyCompare(ArrItem(j), ArrItem(i), OrderAscending) Then
            Tmp = ArrItem(i):   ArrItem(i) = ArrItem(j):    ArrItem(j) = Tmp
        End If
    Next
Next
SortString = Join(ArrItem, ",")
End Function
PHP:
Private Function MyCompare(ByVal Str1 As String, ByVal Str2 As String, ByRef OrderAscending As Boolean) As Boolean
    MyCompare = (Evaluate(Replace("(" & Str1 & IIf(InStr(Str1, "+") > 0, "/1000)", ")") & "-(" & Str2 & IIf(InStr(Str2, "+") > 0, "/1000)", ")"), "KM", "")) > 0) Xor OrderAscending
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Chủ topic thử hàm này nhé.
PHP:
Function SortString(Str As String, Optional OrderAscending As Boolean = True) As String
Dim i As Long, j As Long, ArrItem, Tmp As String
ArrItem = Split(Replace(Str, " ", ""), ",")
For i = 0 To UBound(ArrItem, 1) - 1
    For j = i + 1 To UBound(ArrItem, 1)
        If MyCompare(ArrItem(i), ArrItem(j), OrderAscending) Then
            Tmp = ArrItem(i):   ArrItem(i) = ArrItem(j):    ArrItem(j) = Tmp
        End If
    Next
Next
SortString = Join(ArrItem, ",")
End Function
PHP:
Private Function MyCompare(ByVal Str1 As String, ByVal Str2 As String, ByRef OrderAscending As Boolean) As Double
    MyCompare = (Evaluate(Replace("(" & Str1 & IIf(InStr(Str1, "+") > 0, "/1000)", ")") & "-(" & Str2 & IIf(InStr(Str2, "+") > 0, "/1000)", ")"), "KM", "")) > 0) Xor OrderAscending
End Function

ủa sao ngộ cái là máy mình phải viết là

Mã:
If MyCompare(ArrItem([COLOR=#ff0000][B]j[/B][/COLOR]), ArrItem([COLOR=#ff0000][B]i[/B][/COLOR]), OrderAscending) Then

thì =SortString(A1)
mới ra kết quả màu đỏ ta ?
 
Upvote 0
Chủ topic thử hàm này nhé.
Trân trọng cám ơn Bác nhiều. Em đã test thử chạy thấy ok. Chỉ có điều =SortString(A1,False) mới ra sắp xếp tăng dần. Cái này thi không sao em :)
Em muốn hỏi cái hàm
Evaluate có cách nào thay thế nó bằng hàm khác không ?
Vì em dùng code trong môi trường khác
Trân trọng !
 
Upvote 0
ủa sao ngộ cái là máy mình phải viết là

Mã:
If MyCompare(ArrItem([COLOR=#ff0000][B]j[/B][/COLOR]), ArrItem([COLOR=#ff0000][B]i[/B][/COLOR]), OrderAscending) Then

thì =SortString(A1)
mới ra kết quả màu đỏ ta ?

Hình như Fải là: =SortString(A1,0) nó mới chạy đúng...
 
Upvote 0
Hình như Fải là: =SortString(A1,0) nó mới chạy đúng...

không đơn giản vậy đâu bạn , khi tác giả viết dòng này
Mã:
Optional [COLOR=#ff0000][SIZE=3][B]OrderAscending[/B][/SIZE][/COLOR] As Boolean = True
thì bạn cần hiểu ý đồ của họ là xếp A->Z là chế độ mặc định , không cần thêm chèn thêm tham số thứ 2 bạn ạ .
 
Upvote 0
không đơn giản vậy đâu bạn , khi tác giả viết dòng này
Mã:
Optional [COLOR=#ff0000][SIZE=3][B]OrderAscending[/B][/SIZE][/COLOR] As Boolean = True
thì bạn cần hiểu ý đồ của họ là xếp A->Z là chế độ mặc định , không cần thêm chèn thêm tham số thứ 2 bạn ạ .
Đúng là tôi nhầm, khi thử code tôi thử xếp tăng, giảm và thấy kết quả đúng nhưng không để ý là bị nhầm chiều.
 
Upvote 0
Đúng là tôi nhầm, khi thử code tôi thử xếp tăng, giảm và thấy kết quả đúng nhưng không để ý là bị nhầm chiều.

So sánh thì chỉ cần biết a có lớn hơn b hay không thôi, cần gì phải cầu kỳ thêm cái tham số át xen với đét xen.

Nếu bạn có hàm Greater(a, b) = ?(a > b)
Thì lúc IF chỉ cần IF Greater(x, y), hoặc Greater(y, x), hoặc Not Greater(x, y)

Cho tui hỏi, nếu tui hông biết gì về 3 thằng in đậm ở trên và tui cũng hông muốn sắp xếp bằng công cụ của anh Bill thì có cách nào khác khác hông ????+-+-+-++-+-+-++-+-+-+

Có thể có, có thể không. Tuỳ theo bạn định nghĩa thế nào là công cụ của anh Bill. VD, nếu tôi cho vào mảng worksheet rồi sọt thì đó là dùng công cụ của anh Bill.
 
Upvote 0
Web KT
Back
Top Bottom