Nhờ giúp làm hàm tự động sắp xếp tăng dần trong 1 Cell . (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Mg(Cll(I)) = Mg(Cll(I)) & IIf(Mg(Cll(I)) = "", "", " ") & Cll(I)

Ý mình không phải 2 số trùng nằm nhau đâu "1,2,1,3,5,2"
Số trùng nó nằm loạn bên trong cơ.
Rồi giờ muốn sắp từ lớn tới nhỏ nữa cơ, và số bên trong có thể lên tới hàng 1000...
"10,25,17,500,10,25,17,25" >>> "500,25,25,25,17,17,10,10"
 
Lần chỉnh sửa cuối:
Ý mình không phải 2 số trùng nằm nhau đâu "1,2,1,3,5,2"
Số trùng nó nằm loạn bên trong cơ.
Rồi giờ muốn sắp từ lớn tới nhỏ nữa cơ, và số bên trong có thể lên tới hàng 1000...
"10,25,17,500,10,25,17,25" >>> "500,25,25,25,17,17,10,10"

Thì cũng vậy thôi! "Màu mè" thêm tí nữa chứ gì
Mã:
Function StrSort(ByVal Text As String, ByVal Delimiter As String, Optional ByVal Order As Boolean = False) As String
  Dim aTmp, item, strDes As String
  Dim n As Long
  On Error Resume Next
  aTmp = Split(Text, Delimiter)
  ReDim arr(1 To 1)
  For Each item In aTmp
    n = CLng(Trim(item))
    If n > UBound(arr) Then ReDim Preserve arr(1 To n)
    arr(n) = arr(n) & " " & IIf(Order, StrReverse(n), n)
  Next
  strDes = WorksheetFunction.Trim(Join(arr, " "))
  If Order Then strDes = StrReverse(strDes)
  StrSort = Replace(strDes, " ", Delimiter)
End Function
-----------------------
Nghĩ lại chắc chú Hải cũng phải cảm ơn tác giả. Họ hỏi gì thây kệ, miễn có đề tài cho chú "vọc" là được rồi
Ẹc... Ẹc...
 
Cám ơn các A chuyên gia nhé!
Vậy kết hợp của các A được VBA sau là E thấy ổn nhất, vì ngày đã có thì không cần phải hiện nhiều, đỡ phải tốn công lọc lại ngày trùng nhau :

---------
Public Function XepNgay(Cll) As String
Dim Mg(31), I
For Each I In Split(WorksheetFunction.Trim(Cll), ",")
Mg(I) = I
Next I
XepNgay = Replace(WorksheetFunction.Trim(Join(Mg)), " ", ", ")
End Function

---------
Thân chào!
 
Thì cũng vậy thôi! "Màu mè" thêm tí nữa chứ gì
Mã:
Function StrSort(ByVal Text As String, ByVal Delimiter As String, Optional ByVal Order As Boolean = False) As String
  Dim aTmp, item, strDes As String
  Dim n As Long
  On Error Resume Next
  aTmp = Split(Text, Delimiter)
  ReDim arr(1 To 1)
  For Each item In aTmp
    n = CLng(Trim(item))
    If n > UBound(arr) Then ReDim Preserve arr(1 To n)
    arr(n) = arr(n) & " " & IIf(Order, StrReverse(n), n)
  Next
  strDes = WorksheetFunction.Trim(Join(arr, " "))
  If Order Then strDes = StrReverse(strDes)
  StrSort = Replace(strDes, " ", Delimiter)
End Function
-----------------------
Nghĩ lại chắc chú Hải cũng phải cảm ơn tác giả. Họ hỏi gì thây kệ, miễn có đề tài cho chú "vọc" là được rồi
Ẹc... Ẹc...
Thuật toán của anh hay quá, vượt xa cách em suy nghĩ. Em thì phải mược thêm cái Dic nữa mới xong. Chỉ vọc chơi thôi chứ dễ gì có dịp xài mấy dạng code này đâu.
 
Thuật toán của anh hay quá, vượt xa cách em suy nghĩ. Em thì phải mược thêm cái Dic nữa mới xong. Chỉ vọc chơi thôi chứ dễ gì có dịp xài mấy dạng code này đâu.

Nếu chuỗi chứa số quá lớn sẽ bị tràn bộ nhớ của mảng, nếu sort thì vẫn dùng các thuật toán sort thông thường sẽ ổn định.
Em kiểm tra Với cách anh Ndu chuỗi chứa hàng trăm nghìn trở lên bị tràn bộ nhớ và không sort được. Ví cell chứa 45678,7894
 
Nếu chuỗi chứa số quá lớn sẽ bị tràn bộ nhớ của mảng, nếu sort thì vẫn dùng các thuật toán sort thông thường sẽ ổn định.
Em kiểm tra Với cách anh Ndu chuỗi chứa hàng trăm nghìn trở lên bị tràn bộ nhớ và không sort được. Ví cell chứa 45678,7894

Làm để trả lời câu đố của Quang Hải thôi chứ nếu tôi làm đàng hoàng, để xài một cách tổng quát thì tôi đâu có làm vậy mà sẽ làm theo phương án ở bài 14
 
Nhận tiện cho em hỏi nếu dữ liệu khoảng 2 triệu dòng nằm trên 10 cột (có thể nằm ở 2 sheet hoặc 2 vùng khác nhau vì excel tối đa chỉ chứa 1.048.576 dòng) vậy mình có thể viết code sort giống excel tức là nhiều level khác nhau. Ví dụ ưu tiên sort cột A sau đó là cột C tiếp đó là cột G chẳng hạn các cột khác chạy theo có thể mở rộng là bao nhiêu level tuỳ ý vì excel có thể add tới 64 level (khiếp thật). Nếu có thể mong các bạn, anh chị giúp đỡ thuật toán cảm ơn
 
Nếu chuỗi chứa số quá lớn sẽ bị tràn bộ nhớ của mảng, nếu sort thì vẫn dùng các thuật toán sort thông thường sẽ ổn định.
Em kiểm tra Với cách anh Ndu chuỗi chứa hàng trăm nghìn trở lên bị tràn bộ nhớ và không sort được. Ví cell chứa 45678,7894

Ở bài số #7, tôi đã có nói trước là thuật toán chỉ số mảng chỉ hữu hiệu khi số lớn nhất trong vùng dữ liệu có trị không lớn lắm. Nếu trị này lớn mà dùng để sắp xếp mảng chỉ vài hần tử quèn thì đương nhiên là phí phạm.

Thuật toán chỉ số mảng có tác dụng mạnh nhất khi vùng dữ liệu đặc - số khoảng cách ít hơn số có giá trị.

Đây là chuyện thuật toán. Mỗi thuật toán có một vùng mượt (sweet spot) của nó.
 
Nhận tiện cho em hỏi nếu dữ liệu khoảng 2 triệu dòng nằm trên 10 cột (có thể nằm ở 2 sheet hoặc 2 vùng khác nhau vì excel tối đa chỉ chứa 1.048.576 dòng) vậy mình có thể viết code sort giống excel tức là nhiều level khác nhau. Ví dụ ưu tiên sort cột A sau đó là cột C tiếp đó là cột G chẳng hạn các cột khác chạy theo có thể mở rộng là bao nhiêu level tuỳ ý vì excel có thể add tới 64 level (khiếp thật). Nếu có thể mong các bạn, anh chị giúp đỡ thuật toán cảm ơn
Theo mình thì chắc không code nổi đâu. Nếu vì lý do gì đó cần phải Sort trong mảng thì viết cái hàm Sort tạm thôi. Với dữ liệu ít thì được chứ nếu dữ liệu nhiều chạy treo máy luôn.
Thỉnh thoảng mình vẫn dùng code này để Sort trong mảng
PHP:
Sub Sort_Array()
Dim Sarr(), SortCol As Byte
SortCol = 1
Sarr = Range([A1], [A65536].End(3)).Resize(, 10).Value
[A1].Resize(UBound(Sarr), UBound(Sarr, 2)) = Sort_In_Arr(Sarr, SortCol)
End Sub
Function Sort_In_Arr(Sarr As Variant, Col As Byte) As Variant
Dim i As Long, j As Long, X As Long
Dim Temp(), Changed As Boolean
ReDim Temp(1 To 1, 1 To UBound(Sarr, 2))
For i = 1 To UBound(Sarr) - 1
   Changed = False
   For j = 1 To UBound(Sarr) - 1
      If Sarr(j, Col) > Sarr(j + 1, Col) Then
         For X = 1 To UBound(Sarr, 2)
            Temp(1, X) = Sarr(j, X)
            Sarr(j, X) = Sarr(j + 1, X)
            Sarr(j + 1, X) = Temp(1, X)
         Next
         Changed = True
      End If
   Next
   If Changed = False Then Exit For
Next
Sort_In_Arr = Sarr
End Function
 
Nhận tiện cho em hỏi nếu dữ liệu khoảng 2 triệu dòng nằm trên 10 cột (có thể nằm ở 2 sheet hoặc 2 vùng khác nhau vì excel tối đa chỉ chứa 1.048.576 dòng) vậy mình có thể viết code sort giống excel tức là nhiều level khác nhau. Ví dụ ưu tiên sort cột A sau đó là cột C tiếp đó là cột G chẳng hạn các cột khác chạy theo có thể mở rộng là bao nhiêu level tuỳ ý vì excel có thể add tới 64 level (khiếp thật). Nếu có thể mong các bạn, anh chị giúp đỡ thuật toán cảm ơn

Vấn đề bạn hỏi bao gồm hai thủ thuật, thủ thuật thứ nhất là làm sao sort nhiều cột, và thủ thuật thứ hai là làm sao sort nhiều dòng. (Lưu ý ở đây là cách làm, nên ta tạm bỏ qua vấn đề tốc độ, chỉ hỏi làm cách nào để giải quyết)

Thứ nhất, sort nhiều cột:
Cách dễ nhất là cộng các cột lại. Bạn suy nghĩ thử xem làm cách nào để cộng cột đem sort. Bí thì hỏi tiếp.
vd "abcd"+"efgh" thì lớn hơn "abc"+"defgh"
Nếu bạn giải quyết được rồi thì thử tiếp theo làm thế nào cộng cột số. Bước kế tiếp là làm cách nào để cột thì xếp lớn đến nhỏ, cột khác nhỏ đến lớn.

Thứ hai, sort nhiều dòng:
Cách dễ nhất là dùng hộp tổng mục lục. Tức là chia chúng ra từng nhóm nhỏ theo tổng mục.
VD bạn đặt ra 39 hộp tượng trưng cho các 26 chữ cái, 10 chữ số, một hôp cho tất cả các ký tự đứng trước số 0, 1 cho tất các các ký tự giữa Z và a, và 1 cho tất cả các ký tự sau z. Đọc hết các dữ liệu, lấy tất cả các dòng bắt đầu bằng ký tự của hộp đầu tiên, sort chúng, và ghi vào hộp 1. Tiếp tục đến hộp cuối cùng, rồi gộp lại.

VBA không phải là ngôn ngữ được đặt ra để giải quyết những vấn đề khoa học. Cho nên đừng nói chuyện tính quỹ đạo phi thuyền bay lên Hoả tinh với nó. Bạn hỏi một vấn đề. Tôi đề nghị cách giải quyết. Không hơn không kém.
 
Bổ sung về sort theo nhiều cột:
Các ngôn ngữ hàng chuyên nghiệp như C++, Java thì chúng có thư viện sort. VD như C++. chỉ việc nhét đống dữ liệu vào cái mẫu (template) trong nhóm STL của nó, viết một hàm chỉ định cách so sánh, và pass cái địa chỉ của hàm so sánh cho cái mẫu. Nó sẽ sort.

Bạn có thể lấy ý tưởng này, viết một hàm so sánh, hàm nhận 2 tham số là 2 dòng, so sánh và trả về: -1: dòng 1 nhỏ hơn dòng 2; 0: bằng nhau; 1: dòng 1 lớn hơn. Một khi có hàm này rồi thì bạn có quyền chọn lựa cách sort nào cũng được. Cách sort bong bóng có cải tiến (Modified Bubble Sort) như của quanghai1969 là cách đơn giản nhất. Tôi được biết trước đây có người có thiện ý đưa lên code của mấy kiểu sort khác. Vì lý do cá nhân, tôi tránh không nhắc tên. Bạn tự tìm lấy.
 
Các phương pháp sort Quick sort, Bubble sort,.... em đã thử như với dữ liệu nhiều không thể nhanh hơn được có khi là treo máy.


Cách hiện giờ cách em vẫn thương dùng là dùng code sort viết theo cách thông thường giống cách của anh Quanghai, hoặc chú Ba Tê để sort lại theo cột ưu tiên 1 sau đó dùng Dic nạp giá trị sort này vào rồi duyệt qua mạng dữ liệu thô sau đó đập lại excel và áp dụng sort của excel và lưu ý dòng cuối cùng và dòng đầu của mỗi sheet hoặc mỗi vùng để sort cho đúng lưu ý trường hợp em áp dụng chỉ đúng với tiếng Việt không dấu, đây là cách khả thi và nhanh nhất


Em có tham khảo cách của anh Siwtom có đề cập tới sort 3 cột như không thấy code vì có thể chưa ai cần nên không đề cập đến hiện tại vì có lúc làm việc đến dữ liệu nhiều vượt giới hạn dòng của excel nên vấn đề sort nhiêu cột đã đụng tới, không hiểu các chương trình phần mềm nổi tiếng làm cái gì mà nó sort với tốc độ chống mặt.


Cách của anh hướng dẫn đọc hoa cả mắt nhưng sẽ cố gắng tìm hiểu cách này.


Vấn đề này e sẽ mở chủ đề mới để tiện theo dõi


Xin cảm ơn
 
Các phương pháp sort Quick sort, Bubble sort,.... em đã thử như với dữ liệu nhiều không thể nhanh hơn được có khi là treo máy.

Cách hiện giờ cách em vẫn thương dùng là dùng code sort viết theo cách thông thường giống cách của anh Quanghai, ...

Code trong bài#29 là code enhanced/modified bubble sort.
 
Web KT

Bài viết mới nhất

Back
Top Bottom