Bàn về thuật toán sort mảng

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,655
Được thích
16,712
Giới tính
Nam
Hổm rày chưa thấy đề tài nào sôi nổi, giờ thử đố một đề tài xem có tạo hứng thú cho mọi người không.

Nếu tôi có một chuỗi với các số (dương) lộn xộn:

Chuỗi = "1, 8, 6, 4, 5, 11, 12, 13, 16, 15, 20, 14, 10, 7"

Giờ, tôi sẽ viết hàm như thế nào để dãy số trên được lược lại, và có kết quả như dưới?

Kết quả = "1, 4-8, 10-16, 20"

Các bạn thử xem nào!
 
Lần chỉnh sửa cuối:
Tôi không hiểu bạn khoe cái "không dùng vòng lặp" để làm gì nhỉ? Một đằng là tự viết, một đằng là dùng "đồ" của người khác.

Thế nếu bạn hungpecc1 sửa lại chút code rồi viết thành DLL nào đó rồi sau đó tôi dùng SUB của bạn ấy thì sao? Chả nhẽ tôi sẽ nói: "không dùng vòng lặp"? Thậm chí tôi còn hét lên: Thậm chí không cần "chỉ cần duyệt các số qua thêm 1 vòng lặp nữa thôi thì công việc đã hoàn tất rồi" mà có luôn "công việc đã hoàn tất"?

Nếu công việc bắt buộc phải "đóng đinh" thì phải đóng đinh, thế thôi. Bạn không phải đóng đinh chẳng qua là bạn "mượn" ai đó đóng định hộ bạn mà thôi. Cũng có thể bạn và không ai đóng định nhưng lúc đó thì để làm công việc bạn phải "vặn vít". Bạn không vặn thì có nghĩa là bạn "mượn" ai đó vặn. Mà bạn đừng khoe là không phải đóng đinh nhé. Vì lúc đó tôi sẽ khoe là tôi không phải vặn vít như bạn.

Công việc không tự nhiên sinh ra và cũng không tự nhiên mất đi. Nó chỉ "nhẩy" từ người này sang người khác. Bạn học định luật bảo toàn công việc chưa? He he.

Đã nói không dùng vòng lặp trong VBA rồi mà Thầy, thử xem, nếu dùng hàm InStr để tìm 1 hoặc nhiều ký tự nào đó trong một chuỗi, thì bản thân nó có dùng vòng lặp không? Ai đảm bảo rằng nó sẽ không có đằng sau "hậu trường"? Tuy nhiên, khi người sử dụng nó, có quyền nói rằng "tôi không dùng vòng lặp" trong code của tôi. Vậy thôi à.
 
Upvote 0
Đã nói không dùng vòng lặp trong VBA rồi mà Thầy, thử xem, nếu dùng hàm InStr để tìm 1 hoặc nhiều ký tự nào đó trong một chuỗi, thì bản thân nó có dùng vòng lặp không? Ai đảm bảo rằng nó sẽ không có đằng sau "hậu trường"? Tuy nhiên, khi người sử dụng nó, có quyền nói rằng "tôi không dùng vòng lặp" trong code của tôi. Vậy thôi à.

Bạn là người đố, bạn có thể ra điều kiện. Tôi đã đọc các bài viết của bạn và không thấy có chỗ nào ra điều kiện: "không dùng vòng lặp trong VBA"

Hay tôi sơ ý không nhìn thấy?
 
Upvote 0
Bạn là người đố, bạn có thể ra điều kiện. Tôi đã đọc các bài viết của bạn và không thấy có chỗ nào ra điều kiện: "không dùng vòng lặp trong VBA"

Hay tôi sơ ý không nhìn thấy?

Oh, thật ra em không nhấn mạnh điều này, bởi vì mỗi người có mỗi thuật toán để thực hiện, những người làm đúng yêu cầu thì đã là có đáp án đúng. Điều em mong đợi rằng qua nhiều đáp án, sẽ có nhiều cách để thực hiện yêu cầu đó, thông qua đó, em sẽ được học thêm nhiều.

Kinh nghiệm cho em thấy rằng "Hãy cho rồi sẽ nhận", nên em sẳn sàng gửi tặng những gì em học được và hiểu biết được lên diễn đàn, và sau đó em biết em sẽ được nhiều người góp ý, chỉnh sửa và hoàn thiện ý tưởng của em.
 
Upvote 0
Làm đại 2 cách cách nào được thì lấy :D.
Phương án 1
PHP:
Function Function1(Str As String) As String
Dim Arr, i As Long, j As Long, Tmp, Count As Long
Arr = Split(Str, ", ")
For i = LBound(Arr) To UBound(Arr)
    For j = i + 1 To UBound(Arr)
        If CLng(Arr(j)) < CLng(Arr(i)) Then
            Tmp = Arr(j):   Arr(j) = Arr(i):    Arr(i) = Tmp
        End If
    Next
Next
Tmp = Arr(LBound(Arr)):    Count = 1:   Str = ""
For i = LBound(Arr) + 1 To UBound(Arr)
    If CLng(Arr(i)) = Tmp + Count Then
        Count = Count + 1
    Else
        Str = Str & ", " & Tmp & IIf(Count > 1, "-" & (Tmp + Count - 1), "")
        Tmp = CLng(Arr(i))
        Count = 1
    End If
Next
Str = Str & ", " & Tmp & IIf(Count > 1, "-" & (Tmp + Count - 1), "")
Function1 = Replace(Str, ", ", "", 1, 1)
End Function

Qua bài này, tôi quan tâm đến dòng này:

If CLng(Arr(j)) < CLng(Arr(i)) Then

Thay vì với CLng hay CDbl, thì tôi lại nghĩ dùng Val.

Lý do: Với Val("") hay Val("abc") nó trả về giá trị 0, như thế, vẫn so sánh được, còn CLng hay CDbl nó lại báo lỗi.

Theo các bạn, tôi dùng Val có tốt hơn không?
 
Upvote 0
Tôi không hiểu bạn khoe cái "không dùng vòng lặp" để làm gì nhỉ? Một đằng là tự viết, một đằng là dùng "đồ" của người khác.

Thế nếu bạn hungpecc1 sửa lại chút code rồi viết thành DLL nào đó rồi sau đó tôi dùng SUB của bạn ấy thì sao? Chả nhẽ tôi sẽ nói: "không dùng vòng lặp"? Thậm chí tôi còn hét lên: Thậm chí không cần "chỉ cần duyệt các số qua thêm 1 vòng lặp nữa thôi thì công việc đã hoàn tất rồi" mà có luôn "công việc đã hoàn tất"?

Nếu công việc bắt buộc phải "đóng đinh" thì phải đóng đinh, thế thôi. Bạn không phải đóng đinh chẳng qua là bạn "mượn" ai đó đóng định hộ bạn mà thôi. Cũng có thể bạn và không ai đóng định nhưng lúc đó thì để làm công việc bạn phải "vặn vít". Bạn không vặn thì có nghĩa là bạn "mượn" ai đó vặn. Mà bạn đừng khoe là không phải đóng đinh nhé. Vì lúc đó tôi sẽ khoe là tôi không phải vặn vít như bạn.

Công việc không tự nhiên sinh ra và cũng không tự nhiên mất đi. Nó chỉ "nhẩy" từ người này sang người khác. Bạn học định luật bảo toàn công việc chưa? He he.

Chuẩn bác siwtom ah,

Đây là sai lầm ngớ ngẩn nhất của nhiều người sử dụng - cứ tưởng đó không phải dùng vòng lặp (khi sử dụng công cụ khác) - ví như dùng máy xay sinh tốt thay vì dùng dao cắt rùi nghền ... sẽ nghĩ nó không cắt không chém ( có khi còn cắt chém nhiều hơn nhiều năng lượng hơn). Vì thế không thể nói là không dùng vòng lặp dù là Instr hay là scripts nào đó

Vì thế, đôi khi ta cần rèn luyện từ bước cơ bản, và hiểu bản chất của các công cụ chứ không phải nói sai từ như thế dẫn đến nhiều người hiểu lầm
 
Upvote 0
Hỏi để học:

Chào các bạn,

Nếu như không sắp xếp kiểu Script và cũng không sắp xếp kiểu như bạn huuthang_bd (code dưới) thì còn kiểu sắp xếp chuỗi nào nữa không ạ?

Mã:
[COLOR=#0000BB][FONT=monospace][I]Arr [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Split[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Str[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]", "[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])
For [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]LBound[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]) [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]To UBound[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])
    For [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]+ [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]1 To UBound[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])
        If [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]CLng[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])) < [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]CLng[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])) [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Then
            Tmp [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]):   [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]) = [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]):    [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]) = [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Tmp
        End [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]If
    [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Next
Next[/I][/FONT][/COLOR]
 
Upvote 0
Chào các bạn,

Nếu như không sắp xếp kiểu Script và cũng không sắp xếp kiểu như bạn huuthang_bd (code dưới) thì còn kiểu sắp xếp chuỗi nào nữa không ạ?

Mã:
[COLOR=#0000BB][FONT=monospace][I]Arr [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Split[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Str[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]", "[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])
For [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]LBound[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]) [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]To UBound[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])
    For [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]+ [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]1 To UBound[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])
        If [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]CLng[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])) < [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]CLng[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])) [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Then
            Tmp [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]):   [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]) = [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]):    [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]) = [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Tmp
        End [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]If
    [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Next
Next[/I][/FONT][/COLOR]


Có một cách hiệu quả, đó là:

1) Cắt chuỗi về mảng 1 chiều

2) Gán mảng đó vào sheet sau khi đổi chiều (Transpose)

3) Dùng công cụ SORT của sheet sắp xếp lại dữ liệu

4) Gán ngược giá trị về mảng rồi chuyển mảng về chuỗi.

Mã:
Sub NoiChuoi()

    Dim Chuoi As String, Str As String
    Dim SplArr, StrSplArr(), i As Long, u As Long
    Chuoi = "10,9,8,5,6,7,8,3,4,6,7,9,10,1,11,33"
    SplArr = Split(Chuoi, ",")
    
    u = UBound(SplArr) + 1
    
    With Range("F1").Resize(u)
        .Value = WorksheetFunction.Transpose(SplArr)
        .Sort [F1], xlAscending
        SplArr = .Value
    End With
    
    For i = 2 To u
        Str = Str & "," & SplArr(i, 1)
    Next


    Str = SplArr(1, 1) & Str
    
    Debug.Print Str
    
[COLOR=#008000]'    ReDim StrSplArr(1 To u)[/COLOR]
[COLOR=#008000]'    For i = 1 To u[/COLOR]
[COLOR=#008000]'        StrSplArr(i) = SplArr(i, 1)[/COLOR]
[COLOR=#008000]'    Next[/COLOR]
[COLOR=#008000]'    Chuoi = Join(StrSplArr, ",")[/COLOR]
[COLOR=#008000]'    Debug.Print Chuoi[/COLOR]


End Sub

Nhưng chúng ta phải làm như vậy sao? Nếu mà là hàm thì Sheet ở đâu ra nhỉ? Tạo ra? Lỡ phần tử bên trong lớn hơn số hàng thì sao?

"Cơ bản" lắm đó, nhưng cũng kỳ lắm đó!
 
Upvote 0
Chào các bạn,

Nếu như không sắp xếp kiểu Script và cũng không sắp xếp kiểu như bạn huuthang_bd (code dưới) thì còn kiểu sắp xếp chuỗi nào nữa không ạ?

Mã:
[COLOR=#0000BB][FONT=monospace][I]Arr [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Split[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Str[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]", "[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])
For [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]LBound[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]) [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]To UBound[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])
    For [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]+ [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]1 To UBound[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])
        If [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]CLng[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])) < [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]CLng[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])) [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Then
            Tmp [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]):   [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]j[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]) = [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]):    [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Arr[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]i[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]) = [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Tmp
        End [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]If
    [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Next
Next[/I][/FONT][/COLOR]
Theo em nếu đã đưa được chuỗi về mảng Arr= Split(str,",") ta có thể dùng các thuật toán sắp xếp mảng thông dụng :
* Cách sắp xếp như của a Huuthang_bd hình như được gọi là Selection Sort
* Theo kiểu Quick Sort thì như vậy :
[GPECODE=vb]
Sub quicksort(subArr(), ByVal L As Long, ByVal U As Long)
Dim i As Long, j As Long
Dim pivot, TG
If L >= U Then Exit Sub
i = L: j = U
pivot = Int(Rnd() * (j - i + 1) + i)
Do
While subArr(i) < subArr(pivot)
i = i + 1
Wend
While subArr(j) > subArr(pivot)
j = j - 1
Wend
If i <= j Then
TG = subArr(i): subArr(i) = subArr(j): subArr(j) = TG
i = i + 1
j = j - 1
End If
Loop Until i > j
quicksort subArr, L, j
quicksort subArr, i, U
End Sub
[/GPECODE]
Kiểm tra :
Mã:
Sub test()
    Dim arr()
    Dim item
    arr = Array(1, 3, 5, 8, 97, 4, 5, 6)
    quicksort arr, LBound(arr), UBound(arr)
    For Each item In arr
        Debug.Print item
    Next
End Sub
* Hôm qua mới vọc thêm vụ Distribution count sorting :sắp xếp bằng phép đếm phân phối :
Cách thức hoạt động của thuật toán
- Ta xây dựng dãy c(1),c(2),...,c(M) trong đó c(i) là số lần xuất hiện của số i trong dãy cần sắp xếp.
Vd: Với dãy: 1,5,4,2,1,4,7,5,5,8 thì: c(1)=2; c(2)=1,c(4)=2; c(5)=3; c(7)=1; c(8)=1
- Dựa vào c(i), ta có thể biết được giá trị i sẽ nằm từ vị trí nào đến vị trí nào trong dãy đã sắp xếp:
Vd: Với dãy trên sau khi đã sắp xếp là: 1,1,2,4,4,5,5,5,7,8
++++++++++Giá trị 1 đứng ở vị trí từ 1 -> c(1) [tức từ 1 -> 2]
++++++++++Giá trị 2 đứng ở vị trí từ c(1)+1 -> c(1) + c(2) [tức là từ 3->3]
++++++++++Giá trị i đứng ở vị trí từ c(1)+c(2)+c(3)+...+c(i-1)+1 -> c(1)+c(2)+c(3)+...+c(i-1)+c(i)
- Sau đó dựa vào dãy c này ta dựng nên dãy t là dãy đã được sắp xếp từ dãy a và gán dãy t vào dãy a.
Mã:
[COLOR=#000080][FONT=monospace]Private[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Sub[/FONT][/COLOR][COLOR=#444444][FONT=monospace] DistributionCountingSort()[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]Dim[/FONT][/COLOR][COLOR=#444444][FONT=monospace] c(1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] M) [/FONT][/COLOR][COLOR=#000080][FONT=monospace]As[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Long[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]Dim[/FONT][/COLOR][COLOR=#444444][FONT=monospace] t(1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] N) [/FONT][/COLOR][COLOR=#000080][FONT=monospace]As[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Long[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]Dim[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i [/FONT][/COLOR][COLOR=#000080][FONT=monospace]As[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Long[/FONT][/COLOR][COLOR=#444444][FONT=monospace], j [/FONT][/COLOR][COLOR=#000080][FONT=monospace]As[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Long[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]For[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i = 1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] N[/FONT][/COLOR]
[COLOR=#444444][FONT=monospace]  c(a(i)) = c(a(i)) + 1 [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'Đếm số lần xuất hiện của giá trị i trong dãy
[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Next[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]For[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i = 2 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] M[/FONT][/COLOR]
[COLOR=#444444][FONT=monospace]  c(i) = c(i - 1) + c(i) [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'Tính vị trí cuối của mỗi giá trị trong dãy
[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Next[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]For[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i = N [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] 1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]Step[/FONT][/COLOR][COLOR=#444444][FONT=monospace] -1[/FONT][/COLOR]
[COLOR=#444444][FONT=monospace]  j = a(i) [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'Lấy ra giá trị của khóa a(i)
[/FONT][/COLOR][COLOR=#444444][FONT=monospace] t(c(j)) = a(i) [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'biến c(j) sẽ chứa vị trí mà a(i) cần phải ở khi đã được sắp xếp, giá trị này sẽ được đưa vào đúng vị trí trong dãy t
[/FONT][/COLOR][COLOR=#444444][FONT=monospace] c(j) = c(j) - 1 [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'đồng thời giảm giá trị của c(j) xuống 1 đơn vị để những giá trị sau sẽ được thêm vào trước vị trí trên.
[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Next[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]For[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i = 1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] N[/FONT][/COLOR]
[COLOR=#444444][FONT=monospace]  a(i) = t(i) [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'Gán toàn bộ giá trị của dãy t vào dãy a
[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Next[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]End[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Sub[/FONT][/COLOR]

p/s : mà hình như chủ đề là " đố vui VBA " còn mấy cái vụ này không được gọi là "đố vui" roài , anh có thể rời bài ra topic " vui để đố " để không vi phạm nội quy :-=
 
Lần chỉnh sửa cuối:
Upvote 0
Theo em nếu đã đưa được chuỗi về mảng Arr= Split(str,",") ta có thể dùng các thuật toán sắp xếp mảng thông dụng :
* Cách sắp xếp như của a Huuthang_bd hình như được gọi là Selection Sort
* Theo kiểu Quick Sort thì như vậy
.....................

Một mảng được cắt ra từ chuổi thì nó có được bao nhiêu phần tử mà phải "đấu" về tốc độ
Có thể dùng System.Collections.ArrayList cho đơn giản.
Thí nghiệm xem:
Mã:
Sub Test()
  Dim str As String, arr, i As Long
  str = "10,9,8,5,6,7,8,3,4,6,7,9,10,1,11,33"
  arr = Split(str, ",")
  With CreateObject("System.Collections.ArrayList")
    For i = 0 To UBound(arr): .Add CLng(arr(i)): Next
    .Sort: arr = .ToArray
  End With
  MsgBox Join(arr, "-")
End Sub
------------------------------
p/s : mà hình như chủ đề là " đố vui VBA " còn mấy cái vụ này không được gọi là "đố vui" roài , anh có thể rời bài ra topic " vui để đố " để không vi phạm nội quy
biggrin.png
ĐỐ VUI tức là ĐỐ cái gì thật ĐƠN GIẢN nhưng ít ai nghĩ ra (đáp án bất ngờ)
Vậy nên bài này chẳng VUI tí nào
 
Upvote 0
Với chuỗi số đó, hướng 2 (hàm Function2) thì cho kết quả:

Kết quả = "1,9,1,2,1,8,16,4,3,11,11,9,5,11,12,13,16,15,20,15 ,14,10,7,20"

không những không lược được mà chẳng xếp được nữa đấy nhé!

Còn hàm Function1 lại báo lỗi ở dòng này:

str = str & ", " & Tmp & IIf(Count > 1, "-" & (Tmp + Count - 1), "")

huuthang_bd xem lại thử nhé!
Bạn hãy đưa dữ liệu đầu vào về dạng chuẩn dữ liệu ở bài đầu tiên bạn đố (tức là giữa các số được phân cách nhau bằng một dấu phẩy và một khoản trắng) thì bạn sẽ thấy.
 
Upvote 0
Mã:
Sub Test()
  Dim str As String, arr, i As Long
  str = "10,9,8,5,6,7,8,3,4,6,7,9,10,1,11,33"
  arr = Split(str, ",")
  With CreateObject("System.Collections.ArrayList")
    For i = 0 To UBound(arr): .Add CLng(arr(i)): Next
    .Sort: arr = .ToArray
  End With
  MsgBox Join(arr, "-")
End Sub

Nhân tiện nói về ArrayList, xin đố 1 câu: Code trên Sort từ nhỏ đến lớn. Vậy xin hỏi phải sửa code thế nào để sort ngược lại: Từ lớn đến nhỏ?
 
Upvote 0
Upvote 0
Nhân tiện nói về ArrayList, xin đố 1 câu: Code trên Sort từ nhỏ đến lớn. Vậy xin hỏi phải sửa code thế nào để sort ngược lại: Từ lớn đến nhỏ?
Cũng giống như thằng em kia:

Mã:
Function SortArraySystem2(SerStr As String) As String
    Dim str As String, arr, i As Long
    arr = Split(SerStr, ",")
    With CreateObject("System.Collections.ArrayList")
        For i = 0 To UBound(arr)
            .Add CLng(arr(i))
        Next
        .Sort
[COLOR=#ff0000][B]        .Reverse[/B][/COLOR]
        arr = .ToArray
    End With
    SortArraySystem2 = Join(arr, "-")
End Function
 
Upvote 0
Một mảng được cắt ra từ chuổi thì nó có được bao nhiêu phần tử mà phải "đấu" về tốc độ
Có thể dùng System.Collections.ArrayList cho đơn giản.
Thí nghiệm xem:
Mã:
Sub Test()
  Dim str As String, arr, i As Long
  str = "10,9,8,5,6,7,8,3,4,6,7,9,10,1,11,33"
  arr = Split(str, ",")
  With CreateObject("System.Collections.ArrayList")
    For i = 0 To UBound(arr): .Add CLng(arr(i)): Next
    .Sort: arr = .ToArray
  End With
  MsgBox Join(arr, "-")
End Sub
------------------------------

ĐỐ VUI tức là ĐỐ cái gì thật ĐƠN GIẢN nhưng ít ai nghĩ ra (đáp án bất ngờ)
Vậy nên bài này chẳng VUI tí nào

Mã:
Function SortArrayScript(SerStr As String) As String
    SerStr = "('" & SerStr & "').split(',').sort(function(a,b){return (a-b)}).join(',')" ' & ".reverse()" 'if DESC
    With CreateObject("MSScriptControl.ScriptControl")
        .Language = "JavaScript"
        SortArrayScript = .Eval(SerStr)
    End With
End Function


Function SortArraySystem(SerStr As String) As String
    Dim str As String, arr, i As Long
    arr = Split(SerStr, ",")
    With CreateObject("System.Collections.ArrayList")
        For i = 0 To UBound(arr)
            .Add CLng(arr(i))
        Next
        .Sort: arr = .ToArray
    End With
    SortArraySystem = Join(arr, "-")
End Function

Xét về tốc độ, thì 2 thằng em này cũng ngang ngang nhau, nếu dùng For ... Next do mình xử lý chuỗi thì có mà chờ dài cổ, tôi đã thử code của huuthang_bd với 1,000 mục cho ra thời gian đâu có bao nhiêu: 114 giây! Trong khi đó, với 60,000 mục thì 2 thằng em trên xử lý trong vòng 2 giây.

Thế cho nên đừng ai vỗ ngực xưng tên tôi hay và chê người ta ngớ ngẫn, mà hãy học thêm và biết chọn lọc tinh hoa của người khác mà ứng dụng vô công việc của mình. Bạn có giỏi thì cứ cắt bằng tay đi rồi nghiền nát, còn tôi thì dùng máy xay sinh tố vậy!


''===================================

Suy cho cùng thì tôi thích cách mà Thầy NDU giới thiệu hơn: System.Collections.ArrayList

Nó dễ hiểu, dễ hình dung, nó đơn giản và không cầu kỳ, không như
MSScriptControl.ScriptControl cấu trúc thật sự khó hiểu và không thân thiện lắm.

Cám ơn Thầy.
 
Lần chỉnh sửa cuối:
Upvote 0
Thế cho nên đừng ai vỗ ngực xưng tên tôi hay và chê người ta ngớ ngẫn, mà hãy học thêm và biết chọn lọc tinh hoa của người khác mà ứng dụng vô công việc của mình. Bạn có giỏi thì cứ cắt bằng tay đi rồi nghiền nát, còn tôi thì dùng máy xay sinh tố vậy!

Nói AI vậy trời? ??? ??? ???
----------------
Suy cho cùng thì tôi thích cách mà Thầy NDU giới thiệu hơn: System.Collections.ArrayList

Nó dễ hiểu, dễ hình dung, nó đơn giản và không cầu kỳ, không như
MSScriptControl.ScriptControl cấu trúc thật sự khó hiểu và không thân thiện lắm.

Cám ơn Thầy.
Thích thì tặng luôn:
Mã:
Function Sort1DArray(ByVal SourceArray, ByVal Order As Boolean)
  Dim i As Long, aTmp
  On Error Resume Next
  aTmp = SourceArray
  With CreateObject("System.Collections.ArrayList")
    For i = LBound(aTmp) To UBound(aTmp): .Add aTmp(i): Next
    .Sort
    If Order = False Then .Reverse
    Sort1DArray = .ToArray()
  End With
End Function
 
Upvote 0
Nói AI vậy trời? ??? ??? ???
----------------

Thích thì tặng luôn:
Mã:
Function Sort1DArray(ByVal SourceArray, ByVal Order As Boolean)
  Dim i As Long, aTmp
  On Error Resume Next
  aTmp = SourceArray
  With CreateObject("System.Collections.ArrayList")
    For i = LBound(aTmp) To UBound(aTmp): .Add aTmp(i): Next
    .Sort
    If Order = False Then .Reverse
    Sort1DArray = .ToArray()
  End With
End Function


Sẳn đây em cũng có tham khảo một số thủ tục mà CreateObject("System.Collections.ArrayList") hoạt động, những bạn chưa biết nhiều về nó thì tham khảo chung luôn:

[GPECODE=vb] Option Explicit
Sub ptest()
'http://www.robvanderwoude.com/vbstech.php#Data
'http://www.thecodecage.com/forumz/showthread.php?p=1055000938#post1055000938
'this code creates and populates an ArrayList

Dim myArrayList As Object, myArrayList2 As Object
Dim xItem, myrange

Set myArrayList = CreateObject("System.Collections.ArrayList")
myArrayList.Add "Kyle"
myArrayList.Add "123"
myArrayList.Add "C"
myArrayList.Add "snb"
myArrayList.Add "pike"

'result to immediate window
Debug.Print Join(myArrayList.toarray(), Chr(10))

' copy / clone ArrayList
Set myArrayList2 = myArrayList.Clone

'Now, to add an element and sort the ArrayList, all we need to do is:
'add the new element to the ArrayList
myArrayList.Add "Z"

'remove the new element to the ArrayList
myArrayList.Remove "C"

'result to immediate window
Debug.Print Join(myArrayList.toarray(), Chr(10))

'result to immediate window
Debug.Print "List Has C " & myArrayList.Contains("C")
Debug.Print "List Has Z " & myArrayList.Contains("Z")

'result to immediate window - count elements and capacity
Debug.Print "Size : " & myArrayList.Count
Debug.Print "Capacity : " & myArrayList.Capacity

'trim blank elements from the ArrayList
myArrayList.TrimToSize

'result to immediate window - count elements and capacity
Debug.Print "Size : " & myArrayList.Count
Debug.Print "Capacity : " & myArrayList.Capacity

'sort the ArrayList
myArrayList.Sort

'result to immediate window
Debug.Print Join(myArrayList.toarray(), Chr(10))

' reverse the ArrayList
myArrayList.Reverse

'result to immediate window
Debug.Print Join(myArrayList.toarray(), Chr(10))

' copy / clone ArrayList2 result to immediate window
Debug.Print Join(myArrayList2.toarray(), Chr(10))

'toarray transfer ArrayList to results to worksheet
Range("B1").Resize(myArrayList.Count) = Application.Transpose(myArrayList.toarray())
Range("C1").Resize(1, myArrayList.Count) = myArrayList.toarray()

Set myArrayList = Nothing
Set myArrayList2 = Nothing
End Sub[/GPECODE]

[GPECODE=vb]Sub Queuelist() With CreateObject("System.Collections.Queue")
.Enqueue "Kyle"
.Enqueue "123"
.Enqueue "snb"
.Enqueue "pike"
.Enqueue "Simon"

Debug.Print Join(.Toarray(), Chr(10))

.Dequeue

Debug.Print .Peek

Debug.Print Join(.Toarray(), Chr(10))

Range("A1").Resize(.Count) = Application.Transpose(.Toarray())
Range("C1").Resize(1, .Count) = .Toarray()

End With

End Sub

Sub Stacklist()
With CreateObject("System.Collections.Stack")
.Push "Kyle"
.Push "123"
.Push "snb"
.Push "pike"
.Push "Simon"

Debug.Print Join(.Toarray(), Chr(10))

.pop

Debug.Print .Peek

Debug.Print Join(.Toarray(), Chr(10))

Range("A1").Resize(.Count) = Application.Transpose(.Toarray())
Range("C1").Resize(1, .Count) = .Toarray()

End With

End Sub [/GPECODE]

[GPECODE=vb]'http://www.robvanderwoude.com/vbstech.php#Data
'http://www.thecodecage.com/forumz/showthread.php?p=1055000938#post1055000938

Dim objSortedList As Object
Dim objList2 As Object
Dim i As Integer

Set objSortedList = CreateObject("System.Collections.Sortedlist")

objSortedList.Add "First", "AAAA"
objSortedList.Add "Second", "!"
objSortedList.Add "Third", "CCCC"
objSortedList.Add "Fourth", ","

Debug.Print objSortedList.IndexOfKey("First")
Debug.Print objSortedList.IndexOfValue("AAAA")
Debug.Print objSortedList.IndexOfKey("Second")
Debug.Print objSortedList.IndexOfValue("!")
Debug.Print objSortedList.IndexOfKey("Third")
Debug.Print objSortedList.IndexOfValue("CCCC")
Debug.Print objSortedList.IndexOfKey("Fourth")
Debug.Print objSortedList.IndexOfValue(",")


For i = 0 To objSortedList.Count - 1
Debug.Print objSortedList.GetKey(i) & vbTab & objSortedList.GetByIndex(i)

Next
'This is the resulting output:

'First Hello
'Fourth !
'Second ,
'Third world
'Note how the list is automatically sorted by keys; it is not possible to sort the list by values.

'Like ArrayLists, SortedLists have Count and Capacity properties, and a TrimToSize method, demonstrated in the following code:

Debug.Print "Size : " & objSortedList.Count
Debug.Print "Capacity : " & objSortedList.Capacity


objSortedList.TrimToSize

Debug.Print "Size : " & objSortedList.Count
Debug.Print "Capacity : " & objSortedList.Capacity
'This will result in the following output:

'Size : 4
'Capacity : 16

'Size : 4
'Capacity : 4
'Cloning a SortedList is a piece of cake:
Dim xxxx
Set objList2 = objSortedList.Clone
Debug.Print "Sorted List Key(1) = " & objSortedList.GetKey(1)
Debug.Print "Cloned List Key(1) = " & objList2.GetKey(1)
'The result:


'Sorted List Key(1) = Fourth
'Cloned List Key(1) = Fourth
Set objList2 = Nothing
Set objSortedList = Nothing
End Sub [/GPECODE]

[GPECODE=vb]Option Explicit Sub System_Collections_ArrayList()

' Reference Library mscorlib

Dim ArrayListOne As Object, ArrayListTwo As ArrayList, ArrayListThree As Object, ArrayListFour As ArrayList

Set ArrayListOne = CreateObject("System.Collections.ArrayList") ' method with out Reference library
Set ArrayListTwo = New ArrayList 'Can use this method after loading Reference Library mscorlib
Set ArrayListThree = CreateObject("System.Collections.ArrayList") ' method with out Reference library
Set ArrayListFour = New ArrayList 'Can use this method after loading Reference Library mscorlib

ArrayListOne.Add "A"
ArrayListOne.Add "B"
ArrayListOne.Add "D"
ArrayListOne.Insert 2, "C"
ArrayListOne.Insert 2, "C"
ArrayListOne.Add "E"
ArrayListOne.Add "C"
ArrayListOne.Add "F"
ArrayListOne.Add "G"

Debug.Print ArrayListOne.Item(3)
Debug.Print ArrayListOne.Contains("C")
Debug.Print ArrayListOne.IndexOf_2("C", 0, 4)
Debug.Print ArrayListOne.Contains("H")
Debug.Print ArrayListOne.LastIndexOf("C")

ArrayListOne.Remove "C"
ArrayListOne.RemoveAt 5

With ArrayListTwo
.Add "1"
.Add "2"
.Add "3"
.Add "4"
.Add "5"
End With

ArrayListThree.Add "EE"
ArrayListThree.Add "CC"
ArrayListThree.Add "BB"
ArrayListThree.Insert 2, "DD"
ArrayListThree.Add "AA"

ArrayListOne.Addrange ArrayListThree
ArrayListOne.insertRange 6, ArrayListTwo
ArrayListOne.Addrange ArrayListTwo
ArrayListOne.RemoveRange 6, 5
ArrayListOne.Reverse_2 7, 5

ArrayListOne.TrimToSize

Debug.Print Join(ArrayListOne.toarray(), Chr(10))
Debug.Print ArrayListOne.ToString

Range("A10").Resize(ArrayListOne.Capacity) = Application.Transpose(ArrayListOne.toarray())
Range("C10").Resize(, ArrayListOne.Count) = ArrayListOne.toarray()

With ArrayListOne

Debug.Print .binarysearch_2("CC")

.Sort

Debug.Print .binarysearch_2("CC")

.Reverse

Debug.Print Join(.toarray(), Chr(10))
Debug.Print .GetHashCode

End With

Debug.Print Join(ArrayListFour.toarray(), Chr(10))

ArrayListFour.Add "pike"
ArrayListFour.Add "Japan Dave"
ArrayListFour.Add "Kyle123"
ArrayListFour.Add "snb"

ArrayListOne.SetRange 5, ArrayListFour

Debug.Print Join(ArrayListOne.toarray(), Chr(10))

Set ArrayListOne = Nothing
Set ArrayListTwo = Nothing
Set ArrayListThree = Nothing
Set ArrayListFour = Nothing

End Sub [/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Thế cho nên đừng ai vỗ ngực xưng tên tôi hay và chê người ta ngớ ngẫn, mà hãy học thêm và biết chọn lọc tinh hoa của người khác mà ứng dụng vô công việc của mình. Bạn có giỏi thì cứ cắt bằng tay đi rồi nghiền nát, còn tôi thì dùng máy xay sinh tố vậy!

Bạn cố tình không hiểu vodoi2x nói gì rồi. Tôi nói cố tình vì tôi biết là bạn hiểu. Ý của vodoi2x chỉ là bạn có thể chặt chém hoa quả nhưng cũng có thể dùng máy xay sinh tố. Nhưng không có nghĩa là dùng máy xay sinh tố thì không có hiện tượng chặt chém. Chưa cần mở xem, chưa cần dùng lần nào mà chỉ đọc tên máy cũng đã biết là "chặt chém" có sẩy ra.
Bạn vodoi2x không nói rằng không nên dùng máy xay sinh tố, cũng không nói rằng dùng máy kém hơn hay bất cứ ý nào khác.

Bạn nói là bạn không phải làm A - hàm ý là người khác phải làm A - thì tôi nói rằng: vì bạn dùng B mà B làm A thay bạn. Người khác làm A chẳng qua là họ tự làm. Bạn nói tiếp là bạn đã ra điều kiện là "không được làm A" cơ mà. Nhưng tôi thường đọc rất kỹ bài của người khác nên tôi biết là bạn không ra điều kiện. Tôi lại chỉ ra. Chả nhẽ bạn mất bình tĩnh vì thế sao?

Cả tôi và vodoi2x không nói gì để bạn có thể viết ra những dòng đỏ đỏ. Bình tĩnh lại đi.
 
Lần chỉnh sửa cuối:
Upvote 0
.........

Thế cho nên đừng ai vỗ ngực xưng tên tôi hay và chê người ta ngớ ngẫn, mà hãy học thêm và biết chọn lọc tinh hoa của người khác mà ứng dụng vô công việc của mình. Bạn có giỏi thì cứ cắt bằng tay đi rồi nghiền nát, còn tôi thì dùng máy xay sinh tố vậy!
......

Tôi đã nói ở bài #813 là nói về nhận định của bác siwtom, bạn đừng có chen ngang vào nhé
Nhưng bạn đã cố tình viết, thì tôi trả lời:

Không đúng Hoàng Trọng Nghĩa ơi,

Khi chọn một công cụ có sẵn được ví như ta chọn máy sinh tố để xay hoa quả: Không ai bảo chọn máy sinh tố là ngớ ngẩn cả, mà cái khái niệm nghĩ máy sinh tố không có phải cắt chém (lặp đi lặp lại việc cắt chém) thì là sai lầm ngớ ngẩn (ngớ ngẫn ở đây là đãng trí là lơ đãng là có thể chưa hiểu cơ bản, hay có thể dù không biết các công cụ có dùng vòng lặp hay không mà cứ khẳng định như đúng rùi là không có vòng lặp - vì đã đem ra đố thì tự mình phải có giải đáp, đáp án rui - không thể đánh lận còn đen muốn biết không hỏi mà lại ra vẻ đi đố được - chắc bạn không rơi vào trường hợp này)

Còn xưa nay ta vẫn có thể nói là nếu vấn đề nào sử dụng được các công cụ của sẵn trong excel, từ DLL tốt (như các DLL đã được Microsoft cung cấp) thì chắc chắn NHANH HƠN nhiều so với nếu chúng ta dùng cách thông thường viết (vì code VBA là code thuộc hạng chưa dịch - chạy ở tầng thứ cấp) - như việc không bao giờ người ta lại so sánh giữa cái có sẵn (máy xay sinh tố) đó với việc dùng từng bước (dùng dao tự cắt) rõ chưa - việc so sánh đó mới là ngớ ngẩn

Tuy thế, tùy từng quy mô công việc mà chúng ta sử dụng hay KHÔNG sử dụng công cụ có sẵn hay không? sao cho hợp lý ví như có mỗi một quả cherry nhỏ mà ném vào máy xay sinh tố thì thật là không đáng,

Túm lại, việc tôi nói "khái niệm về ngớ ngẩn" là ở chỗ đó chứ không phải giật mình đâu bạn ah,

Về việc đố vui ở đây, thì nhiều người nói rùi đó (cũng là lý do mà bài trên tôi chỉ trả lời và giải thích rõ bài #812 của bác siwtom):

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

ĐỐ VUI tức là ĐỐ cái gì thật ĐƠN GIẢN nhưng ít ai nghĩ ra (đáp án bất ngờ)
Vậy nên bài này chẳng VUI tí nào

...........
p/s : mà hình như chủ đề là " đố vui VBA " còn mấy cái vụ này không được gọi là "đố vui" roài , anh có thể rời bài ra topic " vui để đố " để không vi phạm nội quy :-=

Bạn còn là MOD (mới nhìn lại màu mới thấy) nữa - càng phải cần tự xét lại mình xem bài viết cách hỏi, cách viết như thế đúng là hợp lý chưa nhé... xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn cố tình không hiểu vodoi2x nói gì rồi. Tôi nói cố tình vì tôi biết là bạn hiểu. Ý của vodoi2x chỉ là bạn có thể chặt chém hoa quả nhưng cũng có thể dùng máy xay sinh tố. Nhưng không có nghĩa là dùng máy xay sinh tố thì không có hiện tượng chặt chém. Chưa cần mở xem, chưa cần dùng lần nào mà chỉ đọc tên máy cũng đã biết là "chặt chém" có sẩy ra.
Bạn vodoi2x không nói rằng không nên dùng máy xay sinh tố, cũng không nói rằng dùng máy kém hơn hay bất cứ ý nào khác.

Bạn nói là bạn không phải làm A - hàm ý là người khác phải làm A - thì tôi nói rằng: vì bạn dùng B mà B làm A thay bạn. Người khác làm A chẳng qua là họ tự làm. Bạn nói tiếp là bạn đã ra điều kiện là "không được làm A" cơ mà. Nhưng tôi thường đọc rất kỹ bài của người khác nên tôi biết là bạn không ra điều kiện. Tôi lại chỉ ra. Chả nhẽ bạn mất bình tĩnh vì thế sao?

Cả tôi và vodoi2x không nói gì để bạn có thể viết ra những dòng đỏ đỏ. Bình tĩnh lại đi.

Em HIỂU hết những gì mọi người nói
Ẹc... Ẹc...
Có điều tại đồng chí kia nói hơi quá:
Đây là sai lầm ngớ ngẩn nhất của nhiều người sử dụng - cứ tưởng đó không phải dùng vòng lặp (khi sử dụng công cụ khác)

Vì thế, đôi khi ta cần rèn luyện từ bước cơ bản, và hiểu bản chất của các công cụ chứ không phải nói sai từ như thế dẫn đến nhiều người hiểu lầm
Ngớ ngẩn gì đâu chứ trong khi ta thấy nó KHÔNG VÒNG LẬP thì ta nói nó không lập thôi (bên trong ruốt nó lập hay không thây kệ nó)
Vấn đề là: Nếu ta tự viết được cái của riêng ta nó NHANH hơn thì ta xài, không thì cứ xài cái mà ta nghĩ là KHÔNG LẬP kia cho khỏe
Có gì đâu mà NGỚ với NGẨN nhỉ?
Cũng giống như dùng VBScript.RegEx, ta thấy nó không vòng lập và gọn thì ta xài ---> Ai rảnh đâu mà suy nghĩ bên trong ruột nó viết thế nào. Mà dù có cố suy nghĩ thì ta chắc gì đã biết bên trong nó có LẬP HAY KHÔNG LẬP mà bảo là NÓI SAI TỪ
----------------
Ngộ thiệt (tại ku Nghĩa bực mình thôi chứ em thì chẳng quan tâm)
Ẹc... Ẹc...
 
Upvote 0
Hehehe, hiểu lầm cả, mọi người bỏ qua vấn đề không vui đi, đây là box đố vui mà!

Không biết ai có code nào muốn đố cho vui không nhỉ? Tôi thấy rằng mình học được rất nhiều từ các bài đố này đó.

Thanks.
 
Upvote 0
Web KT
Back
Top Bottom