Nguyễn Thành Châu
Thành viên mới

- Tham gia
- 12/10/17
- Bài viết
- 46
- Được thích
- 6
- Giới tính
- Nam
Về Sort Chuỗi trong Excel, không tuân theo vị trí dấu trừ ( - ) nha bạn. Nó theo quy tắc này: 0,1,2,...9,a/A,b/B,c/C, ...z/Z.Em có file excel như trên, em lọc cột vị trí nhưng không theo tứ tự tứ 1 đến cuối được. Mong anh em hỗ trợ em với.
Thứ tự ưu tiên : Z..., các chỉ số tiếp theo.Em có file excel như trên, em lọc cột vị trí nhưng không theo tứ tự tứ 1 đến cuối được. Mong anh em hỗ trợ em với.
Sub Sort_B()
Dim Nguon, Dong, Cot
Dim Mang
Dim Thg, Max, Tam
Dim Kq
Dim CSD
Dim i, j, k
Nguon = Sheet1.Range("A2", Sheet1.Range("K2").End(xlDown))
Dong = UBound(Nguon)
Cot = UBound(Nguon, 2)
ReDim CSD(1 To Dong, 1 To 1)
For i = 1 To Dong
CSD(i, 1) = i
Next i
ReDim Mang(1 To Dong, 1 To 5)
For i = 1 To Dong
k = 5
For Each j In Split(Nguon(i, 1), "-")
If IsNumeric(j) = True Then
Mang(i, k) = CLng(j)
If Max < Mang(i, k) Then Max = Mang(i, k)
k = k - 1
Else
Mang(i, k) = CLng(Right(j, Len(j) - 1))
If Max < Mang(i, k) Then Max = Mang(i, k)
k = k - 1
Mang(i, k) = AscW(Left(j, 1))
If Max < Mang(i, k) Then Max = Mang(i, k)
k = k - 1
End If
Next j
Next i
For j = 5 To 1 Step -1
ReDim Thg(Max)
For i = 1 To Dong
Thg(Mang(CSD(i, 1), j)) = Thg(Mang(CSD(i, 1), j)) + 1
Next i
k = 0
For i = 0 To Max
If Thg(i) <> "" Then
k = k + Thg(i)
Thg(i) = k
End If
Next i
ReDim Tam(1 To Dong, 1 To 1)
For i = Dong To 1 Step -1
k = Thg(Mang(CSD(i, 1), j))
Thg(Mang(CSD(i, 1), j)) = Thg(Mang(CSD(i, 1), j)) - 1
Tam(k, 1) = CSD(i, 1)
Next i
CSD = Tam
Next j
ReDim Kq(1 To Dong, 1 To Cot)
For i = 1 To Dong
k = CSD(i, 1)
For j = 1 To Cot
Kq(i, j) = Nguon(k, j)
Next j
Next i
With Sheet1
.Range("M2").Resize(UBound(Kq), UBound(Kq, 2)).Clear
.Range("M2").Offset(, 1).Resize(UBound(Kq), 1).NumberFormat = "@"
.Range("M2").Resize(UBound(Kq), UBound(Kq, 2)) = Kq
.Range("M2").Resize(UBound(Kq), UBound(Kq, 2)).Columns.AutoFit
End With
End Sub
Cảm ơn bạn nhaVề Sort Chuỗi trong Excel, không tuân theo vị trí dấu trừ ( - ) nha bạn. Nó theo quy tắc này: 0,1,2,...9,a/A,b/B,c/C, ...z/Z.
Thứ tự chuỗi không phân biệt chữ in hoa và chữ thường.
Đối với yêu cầu cua bạn, nên quy định lại chuỗi ở cột A, ví dụ: 0000-Z00-0-0, cân nhắn số lượng ký tự, ví dụ: 4014-Z1-2-1 sẽ thành 4014-Z01-2-1
Mình cảm ơn bạn nhiều nhaThứ tự ưu tiên : Z..., các chỉ số tiếp theo.
Nếu yêu cầu sort khác, bạn làm rõ rồi tính tiếp.
Kết quả ghi tại cột M để so sánh
Mã:Sub Sort_B() Dim Nguon, Dong, Cot Dim Mang Dim Thg, Max, Tam Dim Kq Dim CSD Dim i, j, k Nguon = Sheet1.Range("A2", Sheet1.Range("K2").End(xlDown)) Dong = UBound(Nguon) Cot = UBound(Nguon, 2) ReDim CSD(1 To Dong, 1 To 1) For i = 1 To Dong CSD(i, 1) = i Next i ReDim Mang(1 To Dong, 1 To 5) For i = 1 To Dong k = 5 For Each j In Split(Nguon(i, 1), "-") If IsNumeric(j) = True Then Mang(i, k) = CLng(j) If Max < Mang(i, k) Then Max = Mang(i, k) k = k - 1 Else Mang(i, k) = CLng(Right(j, Len(j) - 1)) If Max < Mang(i, k) Then Max = Mang(i, k) k = k - 1 Mang(i, k) = AscW(Left(j, 1)) If Max < Mang(i, k) Then Max = Mang(i, k) k = k - 1 End If Next j Next i For j = 5 To 1 Step -1 ReDim Thg(Max) For i = 1 To Dong Thg(Mang(CSD(i, 1), j)) = Thg(Mang(CSD(i, 1), j)) + 1 Next i k = 0 For i = 0 To Max If Thg(i) <> "" Then k = k + Thg(i) Thg(i) = k End If Next i ReDim Tam(1 To Dong, 1 To 1) For i = Dong To 1 Step -1 k = Thg(Mang(CSD(i, 1), j)) Thg(Mang(CSD(i, 1), j)) = Thg(Mang(CSD(i, 1), j)) - 1 Tam(k, 1) = CSD(i, 1) Next i CSD = Tam Next j ReDim Kq(1 To Dong, 1 To Cot) For i = 1 To Dong k = CSD(i, 1) For j = 1 To Cot Kq(i, j) = Nguon(k, j) Next j Next i With Sheet1 .Range("M2").Resize(UBound(Kq), UBound(Kq, 2)).Clear .Range("M2").Offset(, 1).Resize(UBound(Kq), 1).NumberFormat = "@" .Range("M2").Resize(UBound(Kq), UBound(Kq, 2)) = Kq .Range("M2").Resize(UBound(Kq), UBound(Kq, 2)).Columns.AutoFit End With End Sub