Sort dữ liệu theo Ý Muốn (1 người xem)

Liên hệ QC

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

NguyenthiH

Thành viên mới đăng ký
Tham gia
11/12/16
Bài viết
965
Được thích
175
Giới tính
Nữ
Chào các anh chị!
Em có dữ liệu Demo như trong file, mong các anh chị viết code sort dữ liệu như bảng vàng trong file.
Em cám ơn các anh chị.
 

File đính kèm

Bạn đưa dữ liệu chi tiết hơn chút đi,bảng dữ liệu đơn giản quá, viết xong mất công chỉnh tới chỉnh lui nữa.
 
Upvote 0
Cám ơn Bạn đã quan tâm. Mình xin đưa file thực tế.
Trong file mình chỉ vướng chổ sort tên vật tư "dây kéo" và "Nhãn Size" thôi, còn các vật tư khác sort theo Excel.
Mình sử dụng Form để nhập vật tư mới, và khi nhập vật tư mới xong thì sort luôn.
Mong các anh chị giúp đỡ.
 

File đính kèm

Upvote 0
Mình gửi lại file cho bạn, mình tạo thêm 3 cột và dùng hàm để tách ký tự trong chuỗi ra để sort,bạn sort theo thứ tự cột D -> E -> F -> B là ra dữ liệu bạn cần, hơi dài và rối, bạn thông cảm nha.
 

File đính kèm

Upvote 0
Cám ơn Bạn, nhưng chưa đúng ý mình.
Bạn chỉ mới sort được Day kéo, còn nhãn Size nữa, và các Vật tư khác thì vẫn sort bình thường.
Cám ơn Bạn.
 
Upvote 0
Cám ơn Bạn, nhưng chưa đúng ý mình.
Bạn chỉ mới sort được Day kéo, còn nhãn Size nữa, và các Vật tư khác thì vẫn sort bình thường.
Cám ơn Bạn.
Dữ liệu của bạn kiểu Text mà Sort theo yêu cầu rất khó.
Dùng Hàm (VBA) để tách Tên và Size ra theo quy định khác mới có thể Sort được.
Bạn xem file, muốn Sort thì chọn từ cột B đến cột F, Sort theo điều kiện 1: cột E, điều kiện 2: cột F.
 

File đính kèm

Upvote 0
Cám ơn tất cả các anh : @gttrongvn, @ Hoàng Trọng Nghĩa, Thầy @Ba Tê, Vẫn không đúng ý của em.
Đúng là dữ liệu của em khó sort theo ý được.
 
Upvote 0
Giải pháp của mình là tạo thêm một cột phụ, trong bảng danh sách, xài index kết hợp match để tìm ra số thứ tự được đánh trong bảng vàng, sau đó sort cột đó. Bạn xem thử được không
 

File đính kèm

Upvote 0
Trong file mình chỉ vướng chổ sort tên vật tư "dây kéo" và "Nhãn Size" thôi, còn các vật tư khác sort theo Excel.
Chỉ làm với dữ liệu đã đưa ở #3,
Chỉ sắp xếp tên vật tư,
Một số chỗ thiếu thông tin (Size 5,4,6,7) không đúng ý thì tự tìm cách điều chỉnh.
 

File đính kèm

Upvote 0
Cám ơn Anh @befaint, đúng ý em rồi, chổ nhãn size (Size 4,5,6,7) anh nói thiếu thông tin là sao ah.
Chổ nhãn Size anh sort ra theo thứ tụ này dùm em: 2T, 3T, 4, 5, 6, 7, XXS, S, M, L, XL, 2XL, 3XL, 4XL, 5XL.
và anh giúp sort cột ĐVT theo tên vật tư luôn ah.
Cám ơn Anh.
 
Upvote 0
Dây kéo thì xếp theo thứ tự: 7" - 7.5" - 8" - 8.5" - 9" - 9.5" - 10" - 10.5" - 11" - 11.5" - 12"
Nhãn size thì xếp theo thứ tự: 2T - 3T - XXS - S - M - L - XL - 2XL - 3XL - 4XL - 5XL
-------------
Đã liệt kê thì liệt kê cho hết đừng bắt người khác tìm mỏi mắt. Viết code rồi sửa chán chê.

Vd. có cả 6"

Ngoài 2T - 3T ... có cả 4, 5, 6, 7 (vd. Nhãn Size_4) ... Vậy chúng phải đứng trước 2T hay đứng ở đâu?

Mà còn cả XS nữa (Nhãn Size_XS). Nó phải đứng trước / sau cái gì?

Liệt kê hết các dạng và sắp xếp theo thứ tự!
 
Lần chỉnh sửa cuối:
Upvote 0
"Ý Muốn" là nhân vật nào vậy bạn chủ bài đăng?

 
Lần chỉnh sửa cuối:
Upvote 0
tới anh @befaint: Em đã chỉnh size 4,5,6,7 lại được rồi ah!
Mã:
Function ReverseSize(ByVal sText As String) As String
    '// like zSize '
    Dim a As Variant, b As Variant, i As Long
    a = Array("Size_2T", "Size_3T", "Size_4", "Size_5", "Size_6", "Size_7", "Size_XXS", "Size_XS", "Size_S", "Size_M", "Size_L", "Size_XL", "Size_2XL", "Size_3XL", "Size_4XL", "Size_5XL")
    b = Array("Size_NTH01", "Size_NTH02", "Size_NTH03", "Size_NTH04", "Size_NTH05", "Size_NTH06", "Size_NTH07", "Size_NTH08", "Size_NTH09", "Size_NTH10", "Size_NTH11", "Size_NTH12", "Size_NTH13", "Size_NTH14", "Size_NTH15", "Size_NTH16")
    For i = LBound(b) To UBound(b)
        sText = Replace(sText, b(i), a(i))
    Next i
    ReverseSize = sText
End Function
Trong code "Sub Sort_NTH()" mong anh chỉnh cho "a = Sheet1.Range("B4:B123").Value '<--- vung du lieu can xu ly'" là vùng dữ liệu"động" vì có thể sẽ có thêm vật tư mới, và mong anh chỉnh code sort luôn cột ĐVT với.
Cám ơn anh!
 
Upvote 0
tới anh @befaint: Em đã chỉnh size 4,5,6,7 lại được rồi ah!
Mã:
Function ReverseSize(ByVal sText As String) As String
    '// like zSize '
    Dim a As Variant, b As Variant, i As Long
    a = Array("Size_2T", "Size_3T", "Size_4", "Size_5", "Size_6", "Size_7", "Size_XXS", "Size_XS", "Size_S", "Size_M", "Size_L", "Size_XL", "Size_2XL", "Size_3XL", "Size_4XL", "Size_5XL")
    b = Array("Size_NTH01", "Size_NTH02", "Size_NTH03", "Size_NTH04", "Size_NTH05", "Size_NTH06", "Size_NTH07", "Size_NTH08", "Size_NTH09", "Size_NTH10", "Size_NTH11", "Size_NTH12", "Size_NTH13", "Size_NTH14", "Size_NTH15", "Size_NTH16")
    For i = LBound(b) To UBound(b)
        sText = Replace(sText, b(i), a(i))
    Next i
    ReverseSize = sText
End Function
Trong code "Sub Sort_NTH()" mong anh chỉnh cho "a = Sheet1.Range("B4:B123").Value '<--- vung du lieu can xu ly'" là vùng dữ liệu"động" vì có thể sẽ có thêm vật tư mới, và mong anh chỉnh code sort luôn cột ĐVT với.
Cám ơn anh!
Lâu rồi không dùng SortList, viết code để nhớ lệnh
Mượn code và ý tưởng của bạn @befaint
Mã:
Sub Sort_VatTu()
  Dim sList As Object, sArr(), Size(), Res()
  Dim sR As Long, i As Long, sKey As String, j As Long
  
  Const sMatch As String = """"
  Const zSize As String = "*Size_*"
  Size = Array("Size_2T", "Size_3T", "Size_XS", "Size_XXS", "Size_S", "Size_M", "Size_L", "Size_XL", "Size_2XL", "Size_3XL", "Size_4", "Size_4XL", "Size_5", "Size_5XL", "Size_6", "Size_7")
  
  Set sList = CreateObject("System.Collections.ArrayList")
  With Sheets("Sheet1")
    sArr = .Range("A4", .Range("C" & Rows.Count).End(xlUp)).Value '<--- vung du lieu can xu ly'
    sR = UBound(sArr, 1)
    For i = 1 To sR
      Key = sArr(i, 2)
      If Len(Key) Then
        If InStr(Key, """") Then Key = ReplaceLenght(Key, sMatch)
        If Key Like zSize Then
          For j = LBound(Size) To UBound(Size)
            If InStr(Key, Size(j)) Then Key = Replace(Key, Replace(Size(j), "Size_", ""), Format(j, "0000")): Exit For
          Next j
        End If
TroLai:
        If Not sList.Contains(Key) Then
          sList.Add Key
        Else
          Key = Key & " "
          GoTo TroLai
        End If
        sArr(i, 1) = Key
      End If
    Next i
    
    sList.Sort
    ReDim Res(1 To sList.Count, 1 To 3)
    For i = 0 To sList.Count - 1
      idx = sList.InDexOf(sArr(i + 1, 1), 0)
      Res(idx + 1, 1) = idx + 1
      Res(idx + 1, 2) = sArr(i + 1, 2)
      Res(idx + 1, 3) = sArr(i + 1, 3)
    Next i
    
    .Range("E4").Resize(sR, 3).Value = Res
  End With
End Sub
Function ReplaceLenght(ByVal sText As String, ByVal sMatch As String) As String
    '// like "*" & sMatch '
    Dim aTmp
    sText = Trim(sText)
        aTmp = Split(sText, "_")
        If UBound(aTmp) > 0 Then
            sText = aTmp(UBound(aTmp))
            sText = Replace(sText, sMatch, "")
            sText = Replace(sText, ",", ".") 'Dâu phây tai cell [B20]'
            sText = Format(Val(sText), "0##.0") & sMatch
            aTmp(UBound(aTmp)) = sText
        End If
        sText = Join(aTmp, "_")
    ReplaceLenght = sText
End Function
 

File đính kèm

Upvote 0
Oh! Cám ơn anh Hiếu nhiều.
Lại được sự giúp đỡ của anh.
Mã:
  Size = Array("Size_2T", "Size_3T", "Size_4", "Size_5", "Size_6", "Size_7", "Size_XXS", "Size_XS", "Size_S", "Size_M", "Size_L", "Size_XL", "Size_2XL", "Size_3XL", "Size_4XL", "Size_5XL")
Em có chỉnh chổ code trên theo ý em, nhưng code lại chạy không theo ý, mong anh xem lại giúp.
Tức szie thì xếp theo : 2T-3T-4-5-6-7-XXS-XS-S-M-L-XL-2XL-3XL-4XL-5XL
 
Upvote 0
Oh! Cám ơn anh Hiếu nhiều.
Lại được sự giúp đỡ của anh.
Mã:
  Size = Array("Size_2T", "Size_3T", "Size_4", "Size_5", "Size_6", "Size_7", "Size_XXS", "Size_XS", "Size_S", "Size_M", "Size_L", "Size_XL", "Size_2XL", "Size_3XL", "Size_4XL", "Size_5XL")
Em có chỉnh chổ code trên theo ý em, nhưng code lại chạy không theo ý, mong anh xem lại giúp.
Tức szie thì xếp theo : 2T-3T-4-5-6-7-XXS-XS-S-M-L-XL-2XL-3XL-4XL-5XL
Chỉnh lại dòng lệnh
For j = UBound(Size) To LBound(Size) Step -1
Mã:
        If Key Like zSize Then
          For j = UBound(Size) To LBound(Size) Step -1
            If InStr(Key, Size(j)) Then Key = Replace(Key, Replace(Size(j), "Size_", ""), Format(j, "0000")): Exit For
          Next j
        End If
 
Upvote 0
Xin Lỗi!
Em chỉnh thiếu, được rồi anh ơi.
Cám ơn Anh!
 
Upvote 0
Ah còn sai, anh Hiếu ơi.
Em xin đưa file, anh xem lại
Chổ Size S lại nằm trên.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom