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

Liên hệ QC

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 :
Ngày tìm được
Ngày sắp xếp tăng dần
3, 7, 13, 18, 22, 27, 5, 9, 23
3, 5, 7, 9, 13, 18, 22, 23, 27

- 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

  • Nho giup.xlsx
    9 KB · Đọc: 52
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 :
Ngày tìm được
Ngày sắp xếp tăng dần
3, 7, 13, 18, 22, 27, 5, 9, 233, 5, 7, 9, 13, 18, 22, 23, 27

- 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 :
Ngày tìm được
Ngày sắp xếp tăng dần
3, 7, 13, 18, 22, 27, 5, 9, 233, 5, 7, 9, 13, 18, 22, 23, 27

- 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

  • Nho giup.xlsm
    22.3 KB · Đọc: 56
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

  • Nho giup -V2.xlsx
    9.9 KB · Đọc: 9
Đạ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"
 
Web KT
Back
Top Bottom