Cần giúp hàm tự tạo sắp xếp mảng có phần tử rỗng ("")

  • Thread starter Thread starter hktanh
  • Ngày gửi Ngày gửi
Liên hệ QC

hktanh

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
22/8/19
Bài viết
112
Được thích
8
Giới tính
Nam
Chào các bạn của giải pháp Excel. Mình có một bảng dữ liệu mẫu nhỏ như ở phía dưới, trong đó có hàm tự tạo lọc duy nhất mà mình tìm được trên mạng. Sau khi lọc được những giá trị duy nhất bằng hàm mảng đó rồi thì mình gặp phải một khó khăn đó là mình không thể sắp xếp lại được những giá trị của hàm mảng, cho nên mình rất cần bạn nào đó có thể giúp mình viết một hàm mảng sắp xếp theo hai cách tăng hoặc giảm dần như trong file mình có nêu để đi kèm với hàm mảng lọc duy nhất kia nhằm tạo ra được một mảng giá trị duy nhất đã được sắp xếp chỉ bằng hai hàm tự tạo là hàm sắp xếp và lọc duy nhất. Các bạn lưu ý là trong những giá trị mình cần sắp xếp có cả dạng công thức ="" (rỗng nhưng vẫn có công thức), các bạn giúp mình là nếu ô giá trị cần sắp xếp có ="" thì cái ="" này sẽ bị đẩy xuống dưới bất kể mình sắp xếp theo cách tăng hay giảm dần. Với các bạn nếu có thể viết cho mình được một hàm sắp xếp (trong danh sách chưa sắp xếp có cả ="") sao cho sau khi sắp xếp thì các cái ="" bị đẩy xuống dưới bất kể sắp xếp tăng dần hay giảm dần và hàm sắp xếp này có thể kéo copy công thức xuống được như một hàm bình thường thì càng tốt. Cảm ơn các bạn ;):):)
 

File đính kèm

bạn ơi tình hình là sếp có vẻ ok với phương án hàm của bạn rồi nhé :)) sau có gì mình sẽ hỏi thêm. Thực ra mình muốn hàm sắp xếp này ưu việt hơn chút vì thấy nhiều hàm sắp xếp trong mấy cái addin nó làm hay lắm, mỗi tội là phải mất tiền còn mình thì không muốn trả phí cho mấy cái addin đó :)) :1a::victory:
Bài đã được tự động gộp:


Bạn ơi, hàm của bạn trả về những ô không có giá trị thì toàn là số 0 , mình muốn nó là ô trống bạn nhé, bạn xem giúp mình file với, cảm ơn bạn nhiều :victory::victory::victory: ^^
Chỉnh
Dim sArr, Res(), oSList As Object, oSList2 As Object, iKey, iKey2
Thành
Dim sArr, Res() As String, oSList As Object, oSList2 As Object, iKey, iKey2
Mỗi cách đều có lợi hại riêng
 
Upvote 0
Upvote 0
Thử
Mã:
Function SapXepNew(ByVal Rng As Range, Optional ByVal ASC As Boolean = True, Optional ByVal TypeRes As Long = 0)
    Dim sArr, Res(), oSList As Object, oSList2 As Object, iKey, iKey2
    Dim sRow&, i&, k&
   
    Set oSList = CreateObject("System.Collections.SortedList")
    Set oSList2 = CreateObject("System.Collections.SortedList")
    If Rng.Rows.Count = 1 Then
      ReDim sArr(1 To 1, 1 To 1)
      sArr(1, 1) = Rng.Value
    Else
      sArr = Rng.Value
    End If
    sRow = UBound(sArr)
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If Len(iKey) > 0 Then
        If IsNumeric(iKey) Then
          If Not oSList.Contains(iKey) Then oSList.Add iKey, ""
        Else
          If TypeRes = 0 Then
            iKey2 = iKey
          ElseIf TypeRes = 1 Then
            iKey2 = UCase(iKey)
          ElseIf TypeRes = 2 Then
            iKey2 = LCase(iKey)
          Else
            iKey2 = Application.Proper(iKey)
          End If
          If Not oSList2.Contains(iKey2) Then oSList2.Add iKey2, ""
        End If
      End If
    Next i

    ReDim Res(1 To sRow, 1 To 1)
    If ASC = True Then
      For i = 0 To oSList.Count - 1
        k = k + 1
        Res(k, 1) = oSList.Getkey(i)
      Next i
      For i = 0 To oSList2.Count - 1
        k = k + 1
        Res(k, 1) = oSList2.Getkey(i)
      Next i
    Else
      For i = oSList.Count - 1 To 0 Step -1
        k = k + 1
        Res(k, 1) = oSList.Getkey(i)
      Next i
      For i = oSList2.Count - 1 To 0 Step -1
        k = k + 1
        Res(k, 1) = oSList2.Getkey(i)
      Next i
    End If
    Set oSList = Nothing:    Set oSList2 = Nothing
    SapXepNew = Res
End Function
Bạn ơi , bạn giúp mình trong trường hợp sắp xếp giảm dần mà có ký tự đặc biệt như file ví dụ này của mình thì những ký tự đặc biệt được đưa lên trên theo đúng nguyên tắc sắp xếp của AutoFilter bạn nhé, mình cảm ơn :sweatdrop:
 

File đính kèm

Upvote 0
Bạn ơi , bạn giúp mình trong trường hợp sắp xếp giảm dần mà có ký tự đặc biệt như file ví dụ này của mình thì những ký tự đặc biệt được đưa lên trên theo đúng nguyên tắc sắp xếp của AutoFilter bạn nhé, mình cảm ơn :sweatdrop:
Máy mình autofileter số nằn trênUntitled.png
 
Upvote 0
Bạn thử chọn vào Sort Z to A như mình xem thế nào nhé ^^ ký tự đặc biệt sẽ nhảy lên trên ý :sweatdrop: còn trong danh sách của AutoFilter mình nghĩ nó để mặc định là ký tự đặc biệt bên dưới cho dễ tìm kiếm, hihi, giống như kiểu mấy cái lỗi ấy, cũng ở dưới cùng của cái AutoFilter cho dễ tìm kiếm :sweatdrop:
Sort ZA.png
 
Upvote 0
Bạn thử chọn vào Sort Z to A như mình xem thế nào nhé ^^ ký tự đặc biệt sẽ nhảy lên trên ý :sweatdrop: còn trong danh sách của AutoFilter mình nghĩ nó để mặc định là ký tự đặc biệt bên dưới cho dễ tìm kiếm, hihi, giống như kiểu mấy cái lỗi ấy, cũng ở dưới cùng của cái AutoFilter cho dễ tìm kiếm :sweatdrop:
View attachment 225595
Chỉnh lại code
Mã:
Function SapXepNew(ByVal Rng As Range, Optional ByVal ASC As Boolean = True, Optional ByVal TypeRes As Long = 0)
    Dim sArr, Res(), oSList As Object, oSList2 As Object, iKey, iKey2
    Dim sRow&, i&, k&
    
    Set oSList = CreateObject("System.Collections.SortedList")
    Set oSList2 = CreateObject("System.Collections.SortedList")
    If Rng.Rows.Count = 1 Then
      ReDim sArr(1 To 1, 1 To 1)
      sArr(1, 1) = Rng.Value
    Else
      sArr = Rng.Value
    End If
    sRow = UBound(sArr)
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If Len(iKey) > 0 Then
        If IsNumeric(iKey) Then
          If Not oSList.Contains(iKey) Then oSList.Add iKey, ""
        Else
          If TypeRes = 0 Then
            iKey2 = iKey
          ElseIf TypeRes = 1 Then
            iKey2 = UCase(iKey)
          ElseIf TypeRes = 2 Then
            iKey2 = LCase(iKey)
          Else
            iKey2 = Application.Proper(iKey)
          End If
          If Not oSList2.Contains(iKey2) Then oSList2.Add iKey2, ""
        End If
      End If
    Next i

    ReDim Res(1 To sRow, 1 To 1)
    If ASC = True Then
      For i = 0 To oSList.Count - 1
        k = k + 1
        Res(k, 1) = oSList.Getkey(i)
      Next i
      For i = 0 To oSList2.Count - 1
        k = k + 1
        Res(k, 1) = oSList2.Getkey(i)
      Next i
    Else
      For i = oSList2.Count - 1 To 0 Step -1
        k = k + 1
        Res(k, 1) = oSList2.Getkey(i)
      Next i
      For i = oSList.Count - 1 To 0 Step -1
        k = k + 1
        Res(k, 1) = oSList.Getkey(i)
      Next i
    End If
    Set oSList = Nothing:    Set oSList2 = Nothing
    SapXepNew = Res
End Function
 
Upvote 0
Chỉnh lại code
Mã:
Function SapXepNew(ByVal Rng As Range, Optional ByVal ASC As Boolean = True, Optional ByVal TypeRes As Long = 0)
    Dim sArr, Res(), oSList As Object, oSList2 As Object, iKey, iKey2
    Dim sRow&, i&, k&
   
    Set oSList = CreateObject("System.Collections.SortedList")
    Set oSList2 = CreateObject("System.Collections.SortedList")
    If Rng.Rows.Count = 1 Then
      ReDim sArr(1 To 1, 1 To 1)
      sArr(1, 1) = Rng.Value
    Else
      sArr = Rng.Value
    End If
    sRow = UBound(sArr)
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If Len(iKey) > 0 Then
        If IsNumeric(iKey) Then
          If Not oSList.Contains(iKey) Then oSList.Add iKey, ""
        Else
          If TypeRes = 0 Then
            iKey2 = iKey
          ElseIf TypeRes = 1 Then
            iKey2 = UCase(iKey)
          ElseIf TypeRes = 2 Then
            iKey2 = LCase(iKey)
          Else
            iKey2 = Application.Proper(iKey)
          End If
          If Not oSList2.Contains(iKey2) Then oSList2.Add iKey2, ""
        End If
      End If
    Next i

    ReDim Res(1 To sRow, 1 To 1)
    If ASC = True Then
      For i = 0 To oSList.Count - 1
        k = k + 1
        Res(k, 1) = oSList.Getkey(i)
      Next i
      For i = 0 To oSList2.Count - 1
        k = k + 1
        Res(k, 1) = oSList2.Getkey(i)
      Next i
    Else
      For i = oSList2.Count - 1 To 0 Step -1
        k = k + 1
        Res(k, 1) = oSList2.Getkey(i)
      Next i
      For i = oSList.Count - 1 To 0 Step -1
        k = k + 1
        Res(k, 1) = oSList.Getkey(i)
      Next i
    End If
    Set oSList = Nothing:    Set oSList2 = Nothing
    SapXepNew = Res
End Function
hì hì được rồi bạn nhé, bạn tuyệt quá :1a: :1a: :1a:
 
Upvote 0
Chỉnh lại code
Mã:
Function SapXepNew(ByVal Rng As Range, Optional ByVal ASC As Boolean = True, Optional ByVal TypeRes As Long = 0)
    Dim sArr, Res(), oSList As Object, oSList2 As Object, iKey, iKey2
    Dim sRow&, i&, k&
   
    Set oSList = CreateObject("System.Collections.SortedList")
    Set oSList2 = CreateObject("System.Collections.SortedList")
    If Rng.Rows.Count = 1 Then
      ReDim sArr(1 To 1, 1 To 1)
      sArr(1, 1) = Rng.Value
    Else
      sArr = Rng.Value
    End If
    sRow = UBound(sArr)
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If Len(iKey) > 0 Then
        If IsNumeric(iKey) Then
          If Not oSList.Contains(iKey) Then oSList.Add iKey, ""
        Else
          If TypeRes = 0 Then
            iKey2 = iKey
          ElseIf TypeRes = 1 Then
            iKey2 = UCase(iKey)
          ElseIf TypeRes = 2 Then
            iKey2 = LCase(iKey)
          Else
            iKey2 = Application.Proper(iKey)
          End If
          If Not oSList2.Contains(iKey2) Then oSList2.Add iKey2, ""
        End If
      End If
    Next i

    ReDim Res(1 To sRow, 1 To 1)
    If ASC = True Then
      For i = 0 To oSList.Count - 1
        k = k + 1
        Res(k, 1) = oSList.Getkey(i)
      Next i
      For i = 0 To oSList2.Count - 1
        k = k + 1
        Res(k, 1) = oSList2.Getkey(i)
      Next i
    Else
      For i = oSList2.Count - 1 To 0 Step -1
        k = k + 1
        Res(k, 1) = oSList2.Getkey(i)
      Next i
      For i = oSList.Count - 1 To 0 Step -1
        k = k + 1
        Res(k, 1) = oSList.Getkey(i)
      Next i
    End If
    Set oSList = Nothing:    Set oSList2 = Nothing
    SapXepNew = Res
End Function
Bạn ơi hàm của bạn bị lộn :)) vì đáng ra lúc mình sắp xếp theo hướng giảm dần thì ký tự đặc biệt sẽ chuyển lên trên còn lúc sắp xếp tăng dần thì ký tự đặc biệt xuống dưới :sweatdrop::sweatdrop::sweatdrop:
Untitled.png
 
Upvote 0
Xếp gạch hóng các cao thủ giải quyết trọn vẹn mọi yêu cầu của thớt. :whistling::whistling::whistling:
 
Upvote 0

File đính kèm

Upvote 0
Cách xử lý giống sort của Excel mờ
ừ nhỉ, vậy là lâu nay mình cứ nhầm lẫn giữa thứ tự của số và ký tự đặc biệt, hì hì. Có gì không hiểu mình sẽ hỏi bạn tiếp nhé , nhất là về hàm ý :sweatdrop: :hi1: :hi1: (thế mà mình cứ tưởng ký tự đặc biệt là nó phải trên chữ cái cơ :"))
 
Upvote 0
Cách xử lý giống sort của Excel mờ
Chắc tại mình hay đặt tên các thư mục có ký tự đặc biệt để nó nhảy lên trên đầu nên mình mới bị nhầm bạn ạ :sweatdrop: :sweatdrop: :sweatdrop: mình hay có thói quen thêm ký tự đặc biệt vào đầu tên thư mục để nó nhảy lên trên đâm ra là nãy nhầm lẫn giữa excel và window quá ^^

pppppppp.png
 
Upvote 0
Web KT

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

Back
Top Bottom