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

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

JETLI_VN

Thành viên mới
Tham gia
4/5/13
Bài viết
21
Được thích
1
Nghề nghiệp
Nhân viên kỹ thuật
Mình nhờ các bạn giúp mình với mục đích trong Excell như sau.Bảng Excell gồm :
[TABLE="width: 651"]
[TR]
[TD="align: center"]Ngày tìm được
[/TD]
[TD="align: center"]Ngày sắp xếp tăng dần
[/TD]
[/TR]
[TR]
[TD="align: center"]3, 7, 13, 18, 22, 27, 5, 9, 23
[/TD]
[TD="align: center"]3, 5, 7, 9, 13, 18, 22, 23, 27
[/TD]
[/TR]
[/TABLE]

- Mục đích: mình muốn cột “Ngày sắp xếp tăng dần” làm bằng công thức tự động sắp xếp tăng dần và cho ra kết quả. Thực chất cột này là kết quả sắp xếp tăng dần của cột bên.

Cám ơn sự giúp đỡ nhiệt tình của các bạn!
Thân chào!
 

File đính kèm

Mình nhờ các bạn giúp mình với mục đích trong Excell như sau.Bảng Excell gồm :
[TABLE="width: 651"]
[TR]
[TD="align: center"]Ngày tìm được
[/TD]
[TD="align: center"]Ngày sắp xếp tăng dần[/TD]
[/TR]
[TR]
[TD="align: center"]3, 7, 13, 18, 22, 27, 5, 9, 23[/TD]
[TD="align: center"]3, 5, 7, 9, 13, 18, 22, 23, 27 [/TD]
[/TR]
[/TABLE]

- Mục đích: mình muốn cột “Ngày sắp xếp tăng dần” làm bằng công thức tự động sắp xếp tăng dần và cho ra kết quả. Thực chất cột này là kết quả sắp xếp tăng dần của cột bên.

Cám ơn sự giúp đỡ nhiệt tình của các bạn!
Thân chào!
có lẽ phải viết hàm tự tạo bằng vba excel
 
Mình nhờ các bạn giúp mình với mục đích trong Excell như sau.Bảng Excell gồm :
[TABLE="width: 651"]
[TR]
[TD="align: center"]Ngày tìm được
[/TD]
[TD="align: center"]Ngày sắp xếp tăng dần[/TD]
[/TR]
[TR]
[TD="align: center"]3, 7, 13, 18, 22, 27, 5, 9, 23[/TD]
[TD="align: center"]3, 5, 7, 9, 13, 18, 22, 23, 27[/TD]
[/TR]
[/TABLE]

- Mục đích: mình muốn cột “Ngày sắp xếp tăng dần” làm bằng công thức tự động sắp xếp tăng dần và cho ra kết quả. Thực chất cột này là kết quả sắp xếp tăng dần của cột bên.

Cám ơn sự giúp đỡ nhiệt tình của các bạn!
Thân chào!
nếu dùng vba bạn có thể tham khảo đoạn code sau :
Mã:
Sub Test()
  Dim str As String, arr, i As Long
  str = "[FONT=Verdana]3, 7, 13, 18, 22, 27, 5, 9, 23[/FONT]"
  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
 
/-*+//-*+//-*+/ Thất bại rồi bạn ơi!

Cell tôi làm ví dụ thì ít số, chứ thực tế đâu phải luôn cố định bấy nhiêu số trong cell đó đâu! Nên kiểu bạn làm chưa được rồi.
 
/-*+//-*+//-*+/ Thất bại rồi bạn ơi!

Cell tôi làm ví dụ thì ít số, chứ thực tế đâu phải luôn cố định bấy nhiêu số trong cell đó đâu! Nên kiểu bạn làm chưa được rồi.

Người ta chỉ gợi ý, bạn phải tự tùy biến chứ
Với code ở bài 3:
Mã:
Sub Test()
  Dim str As String, arr, i As Long
  str = [COLOR=#ff0000]"3, 7, 13, 18, 22, 27, 5, 9, 23"[/COLOR]
  arr = Split(str, ",")
  With CreateObject("System.Collections.ArrayList")
    For i = 0 To UBound(arr): .Add CLng(arr(i)): Next
    .Sort: arr = .ToArray
  End With
  [COLOR=#0000cd]MsgBox Join(arr, ",")[/COLOR]
End Sub
Thì chỗ màu đỏ chính là dữ liệu đầu vào, chỗ màu xanh là đầu ra. Thay sao cho phù hợp là chuyện của bạn chứ
-------------------------------
Nói thêm: Bài này nếu tôi làm thì tôi sẽ xây dựng thành một hàm tự tạo
 
Cũng nói thêm: bài này nếu tôi làm thì tôi quy định số lớn nhất. Nếu số không lớn lắm thì dùng kỹ thuật đặt mảng boolean và dò mảng.
 
làm theo bác VetMini sử dụng các kỹ thuật mảng 1 chiều cây nhà lá vườn thử xem sao
Mã:
Function SapXep(ByVal CLL As Range) As String
  Dim str As String, arr, i As Long, j As Long
  str = CLL.value
  arr = Split(str, ",")
   Dim temp As Double
   Dim chuoi As String
   For i = 0 To UBound(arr, 1) - 1
     For j = i + 1 To UBound(arr, 1)
       If (Val(arr(i)) > Val(arr(j))) Then
          temp = arr(i)
          arr(i) = arr(j)
          arr(j) = temp
       End If
      Next j
    Next i


  For i = 0 To UBound(arr, 1) - 1
      chuoi = chuoi & arr(i) & ","
   Next
   chuoi = chuoi & arr(UBound(arr, 1))
   SapXep = chuoi
  End Function
 

File đính kèm

Lần chỉnh sửa cuối:
nếu dùng vba bạn có thể tham khảo đoạn code sau :
Mã:
Sub Test()
  Dim str As String, arr, i As Long
  str = "[FONT=Verdana]3, 7, 13, 18, 22, 27, 5, 9, 23[/FONT]"
  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
Thử Function này xem:
PHP:
Public Function GPEX(Rng As Range) As String
Dim Tem, i As Long, j As Long, k As Long
Tem = Split(Rng, ",")
For i = 0 To UBound(Tem) - 1
    For j = i + 1 To UBound(Tem)
        If Val(Tem(j)) < Val(Tem(i)) Then
            k = Val(Tem(i))
            Tem(i) = Val(Tem(j))
            Tem(j) = k
        Else
            Tem(i) = Val(Tem(i))
        End If
    Next j
Next i
GPEX = Join(Tem, ", ")
End Function
Công thức B2=GPEX(A2)
 
làm theo bác VetMini sử dụng các kỹ thuật mảng 1 chiều cây nhà lá vườn thử xem sao
Mã:
Function SapXep(ByVal CLL As Range) As String
  Dim str As String, arr, i As Long, j As Long
  str = CLL.value
  arr = Split(str, ",")
   Dim temp As Double
   Dim chuoi As String
   For i = 0 To UBound(arr, 1) - 1
     For j = i + 1 To UBound(arr, 1)
       If (Val(arr(i)) > Val(arr(j))) Then
          temp = arr(i)
          arr(i) = arr(j)
          arr(j) = temp
       End If
      Next j
    Next i


  For i = 0 To UBound(arr, 1) - 1
      chuoi = chuoi & arr(i) & ","
   Next
   chuoi = chuoi & arr(UBound(arr, 1))
   SapXep = chuoi
  End Function

Không phải, bạn hiểu lầm ý tôi rồi.
Trong kỹ thuật lập trình, có loại kỹ thuật dùng chỉ số mảng để ghi dữ liệu.
Đại khái tôi đặt một mảng từ 0 đến số lớn nhất.
Tôi đọc dữ liệu, gặp số nào thì tôi set phần tử tương ứng là true.
Sau đó tôi đọc mảng, phần tử nào true thì là phần tử có trong dữ liệu đã sắp xếp.
Kỹ thuật này chỉ hữu hiệu khi có rất nhiều dữ liệu. Hoặc số lớn nhất trong nhóm dữ liệu không lớn lắm. Vì tiêu đề bài là "ngày" cho nên tôi cho rằng số lớn nhất chỉ là 31.

Mã:
Const SOLONNHAT = 31
Dim mng() as Boolean
Redim mng(0 to SOLONNHAT)
Dim so
For each so in Split(chuoi, ",")
mng(Val(Trim(so)) = True
Next so
kq = ""
For so = 0 to UBound(mng)
If mng(so) then kq = kq & ", " & so
Next so
kq = MID(kq, 3)
 
Mình xin cám ơn bạn
phihndhsp

VBA của bạn làm rất chuẩn. 1 cell thực tế của mình chỉ có < 100 số.

Vì mình không hiểu gì về VBA. Nên mình nhìn vào các mã bạn làm như mù tịch. Mấy hàm cơ bản có sẵn của Excell thì mình còn hiểu và còn tùy biến được. Chứ các VBA của các bạn làm là mình chỉ copy về cho chạy thử, nếu được là OK, chứ mình không hề sửa 1 từ nào cả, vì mình chẳng hiểu biết gì về nó.

Cũng cám ơn các bạn cho ý kiến và nhiệt tình rỡ rối giúp mình!
Giờ thì OK rồi!
Thân chào các bạn!
 
Nhân tiện bài này, mình đố các anh chị làm sao để sắp xếp được mà chỉ cần 1 vòng For thôi. Đương nhiên là không dùng ArrayList. Đáp án của mình là 1 vòng For, code gọn trong 6 dòng tính luôn phần khai báo biến.
PS: điều kiện là số ngày trong cell không trùng nhau
 
Lần chỉnh sửa cuối:
--=0--=0--=0 Các bạn ơi.
Xem giùm mình lại VBA của bạn " phihndhsp " làm cho mình với.
Nó OK với cell, nhưng nếu bên trong hàm là một hàm khác thì nó báo lỗi #VALUE!
Các bạn xem file gửi kèm của mình!
Cám ơn các bạn trước nhé!
 

File đính kèm

Đại khái tôi đặt một mảng từ 0 đến số lớn nhất.
Tôi đọc dữ liệu, gặp số nào thì tôi set phần tử tương ứng là true.
Sau đó tôi đọc mảng, phần tử nào true thì là phần tử có trong dữ liệu đã sắp xếp.
Kỹ thuật này chỉ hữu hiệu khi có rất nhiều dữ liệu. Hoặc số lớn nhất trong nhóm dữ liệu không lớn lắm. Vì tiêu đề bài là "ngày" cho nên tôi cho rằng số lớn nhất chỉ là 31.

Mình thì nghĩ đến bài toán dạng tổng quát hơn:
- Chuỗi có thể là number hoặc text
- Trong chuỗi có thể có dấu phân cách hoặc không. Nếu có dấu phân cách thì sẽ Split theo dấu phân cách. Bằng ngược lại thì sẽ biến chuỗi thành mảng với mỗi ký tự của chuỗi là 1 phần tử trong mảng
Nếu mình làm bài này thì sẽ chia ra làm nhiều Function (không chơi 1 cục)
- 1 hàm dùng để biến chuỗi thành mảng 1 chiều, đại khái:
Mã:
Function String2Array(ByVal Text As String, Optional Delimiter As String)
- 1 hàm để sort mảng 1 chiều. Việc sort mảng 1 chiều cũng đã bàn nhiều rồi, giờ cứ áp dụng thôi
 
Lần chỉnh sửa cuối:
Nhân tiện bài này, mình đố các anh chị làm sao để sắp xếp được mà chỉ cần 1 vòng For thôi. Đương nhiên là không dùng ArrayList. Đáp án của mình là 1 vòng For, code gọn trong 6 dòng tính luôn phần khai báo biến.
PS: điều kiện là số ngày trong cell không trùng nhau
Với bài này + điều kiện của chú Hải thì......nó đây:
Mã:
Public Function Xep(Cll) As String
    Dim Mg(31), I
        Cll = Split(WorksheetFunction.Trim(Cll), ",")
            For I = 0 To UBound(Cll)
                Mg(Cll(I)) = Cll(I)
            Next I
    Xep = Replace(WorksheetFunction.Trim(Join(Mg)), " ", ", ")
End Function
Cái này hình như .....mình viết lâu rồi mà.
Híc
 
Với bài này + điều kiện của chú Hải thì......nó đây:
Mã:
Public Function Xep(Cll) As String
    Dim Mg(31), I
        Cll = Split(WorksheetFunction.Trim(Cll), ",")
            For I = 0 To UBound(Cll)
                Mg(Cll(I)) = Cll(I)
            Next I
    Xep = Replace(WorksheetFunction.Trim(Join(Mg)), " ", ", ")
End Function
Cái này hình như .....mình viết lâu rồi mà.
Híc
Hình như là anh nhìn thấy máy tính của em. Cú pháp giống hệt nhau chỉ duy nhất có mấy cái biến là độc quyền của anh.
 
Với bài này + điều kiện của chú Hải thì......nó đây:
Mã:
Public Function Xep(Cll) As String
    Dim Mg(31), I
        Cll = Split(WorksheetFunction.Trim(Cll), ",")
            For I = 0 To UBound(Cll)
                Mg(Cll(I)) = Cll(I)
            Next I
    Xep = Replace(WorksheetFunction.Trim(Join(Mg)), " ", ", ")
End Function
Cái này hình như .....mình viết lâu rồi mà.
Híc

Nếu tôi viết

For Each I In Split(WorksheetFunction.Trim(Cll), ",")
Mg(I) = I
Next I

thì tôi giảm được 1 dòng, còn lại 5
 
Nhân tiện bài này, mình đố các anh chị làm sao để sắp xếp được mà chỉ cần 1 vòng For thôi. Đương nhiên là không dùng ArrayList. Đáp án của mình là 1 vòng For, code gọn trong 6 dòng tính luôn phần khai báo biến.
PS: điều kiện là số ngày trong cell không trùng nhau

Nếu tôi viết thì: Vòng lập i chạy từ 1 đến 31, so i với chuỗi gốc, nếu có thì lấy i đó. Vậy thôi
 
Lần chỉnh sửa cuối:
Với bài này + điều kiện của chú Hải thì......nó đây:
Mã:
Public Function Xep(Cll) As String
    Dim Mg(31), I
        Cll = Split(WorksheetFunction.Trim(Cll), ",")
            For I = 0 To UBound(Cll)
                Mg(Cll(I)) = Cll(I)
            Next I
    Xep = Replace(WorksheetFunction.Trim(Join(Mg)), " ", ", ")
End Function
Cái này hình như .....mình viết lâu rồi mà.
Híc

Vậy em xin đố tiếp nếu như số trong cell trùng nhau. Ví dụ "1,3,5,3,2,1"
Làm sao cũng 1 vòng For mà cho ra kết quả "1,1,2,3,3,5"
 
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.
 

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

Back
Top Bottom