quynhnamimex
Thành viên mới
- Tham gia
- 8/1/09
- Bài viết
- 18
- Được thích
- 7
Bạn gửi file giả lập gần giống với file thực tế của bạn rồi gửi lên đây mọi người xem thử nhé.Kính chào các thầy và anh, chị
Nhờ các thầy viết dùm code sắp xếp như trong hình
View attachment 270093
Cám ơn các thầy và các anh, chị nhiều
Ý tưởng thì có rồi ví dụ như sau:Bạn đã có ý tưởng gì chưa?
Sub SapXep_HLMT()
Dim cnn As String
cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=No"";Data Source=" & ThisWorkbook.FullName
With CreateObject("ADODB.Recordset")
.Open ("Select F1 From [D8:D18] Order By Val(Right(F1,2)),Val(Left(F1,3))"), cnn
Range("F8").CopyFromRecordset .DataSource
End With
End Sub
ý tưởng mình là tách 3 số + 2 số, sau đó ưu tiên sort 2 sốBạn đã có ý tưởng gì chưa?
Tôi đã làm theo ý này ở bài trên rồi mà bạn?ý tưởng mình là tách 3 số + 2 số, sau đó ưu tiên sort 2 số
Thầy quá pro rồi. Cám ơn thầy nhiềuTôi đã làm theo ý này ở bài trên rồi mà bạn?
Đúng rồi, tách ra và ưu tiên sort, bạn làm được đoạn nào rùiý tưởng mình là tách 3 số + 2 số, sau đó ưu tiên sort 2 số
Tại thớt thích code cho pờ-rồ chứ bài này các ô có độ dài bằng nhau.Xài hàm MOD(100,XXXAB) => AB & đem số này nhân với 1000 & cọng với XXX
Xếp cột phụ này là OK!
Như vầy luôn cũng được.Nếu là công thức thì ví dụ công thức cho E8, kết thúc bằng Ctrl + Shift + Enter
Mã:=RIGHT(SMALL(--(MID(D$8:D$18 & D$8:D$18,4,5) & D$8:D$18),ROWS(A$1:A1)),5)
=RIGHT(SMALL(--MID(D$8:D$18 & D$8:D$18,4,7),ROWS(A$1:A1)),5)
Sub sapxep()
Application.ScreenUpdating = False
Dim rng As Range
Dim Arr As Variant
Dim temp, Lr, i, j As Long
Lr = Cells(Rows.Count, "D").End(xlUp).Row
Set rng = Range("D8:D" & Lr)
ReDim Arr(1 To Lr - 7, 1 To 1)
For i = 8 To Lr
Arr(i - 7, 1) = Right(Cells(i, "D"), 2) * 1000 + Left(Cells(i, "D"), 3)
Next
For i = 1 To Lr - 7
For j = i + 1 To Lr - 7
If Arr(i, 1) > Arr(j, 1) Then
temp = Arr(j, 1)
Arr(j, 1) = Arr(i, 1)
Arr(i, 1) = temp
End If
Next
Next
For i = 1 To Lr - 7
temp = Arr(i, 1)
Arr(i, 1) = Right(temp, 3) & Left(temp, 2)
Next
Range("D8").Resize(Lr - 7, 1).Value = Arr
Application.ScreenUpdating = True
End Sub
Sao không kết hợp cái vòng lặp cuối vào trong vòng for trên nhỉ bạn.Tìm được giá trị nào tách luôn ra đỡ phải thêm cái vòng lặp cuối.Nếu muốn VBA thì dùng tạm củ chuối này:
PHP:Sub sapxep() Application.ScreenUpdating = False Dim rng As Range Dim Arr As Variant Dim temp, Lr, i, j As Long Lr = Cells(Rows.Count, "D").End(xlUp).Row Set rng = Range("D8:D" & Lr) ReDim Arr(1 To Lr - 7, 1 To 1) For i = 8 To Lr Arr(i - 7, 1) = Right(Cells(i, "D"), 2) * 1000 + Left(Cells(i, "D"), 3) Next For i = 1 To Lr - 7 For j = i + 1 To Lr - 7 If Arr(i, 1) > Arr(j, 1) Then temp = Arr(j, 1) Arr(j, 1) = Arr(i, 1) Arr(i, 1) = temp End If Next Next For i = 1 To Lr - 7 temp = Arr(i, 1) Arr(i, 1) = Right(temp, 3) & Left(temp, 2) Next Range("D8").Resize(Lr - 7, 1).Value = Arr Application.ScreenUpdating = True End Sub
Thử đi nhé. Vòng lặp (viết tắt là "VL")Sao không kết hợp cái vòng lặp cuối vào trong vòng for trên nhỉ bạn.Tìm được giá trị nào tách luôn ra đỡ phải thêm cái vòng lặp cuối.
Em thấy code thế này cũng được:Thử đi nhé. Vòng lặp (viết tắt là "VL")
VL1 để dịch từ 00119 thành 19001
VL2 để so sánh giá trị lần lựơt từng ô với lần lượt từng ô còn lại, kết thúc VL là giá trị MIN nằm trên cùng.
VL3 dùng để đảo vị trí từng thành phần của mảng tạo ra từ VL2, VD: 19001 thành 00119
Nếu kết hợp thì không được vì VL2 phải kết thúc, mới bắt đầu VL3 được.
Sub SapXep1()
Dim Arr(), Tmp As Long, I As Long, J As Long
With Sheets("Sheet1")
Arr = .Range("D8:D" & .Cells(Rows.Count, "D").End(xlUp).Row).Value
For I = 1 To UBound(Arr)
For J = I + 1 To UBound(Arr)
If Val(Right(Arr(J, 1), 2) & Left(Arr(J, 1), 3)) < Val(Right(Arr(I, 1), 2) & Left(Arr(I, 1), 3)) Then
Tmp = Arr(I, 1)
Arr(I, 1) = Arr(J, 1)
Arr(J, 1) = Tmp
End If
Next
Next
.Range("G8").Resize(UBound(Arr)) = Arr
End With
End Sub
Lúc VL2 kết thúc thì Arr(i, 1) đã ngồi yên vị trí rồi. Vòng tới của VL1, thì code chỉ sort kể từ i+1...Nếu kết hợp thì không được vì VL2 phải kết thúc, mới bắt đầu VL3 được.
mình làm dc rồi, cám ơn bạn nheĐúng rồi, tách ra và ưu tiên sort, bạn làm được đoạn nào rùi
Ái chà chà, lúc này Bí Bo viết dữ hé. Bài này mình đố Bí Bo viết chỉ xử dụng 1 vòng lặpNếu muốn VBA thì dùng tạm củ chuối này:
PHP:Sub sapxep() Application.ScreenUpdating = False Dim rng As Range Dim Arr As Variant Dim temp, Lr, i, j As Long Lr = Cells(Rows.Count, "D").End(xlUp).Row Set rng = Range("D8:D" & Lr) ReDim Arr(1 To Lr - 7, 1 To 1) For i = 8 To Lr Arr(i - 7, 1) = Right(Cells(i, "D"), 2) * 1000 + Left(Cells(i, "D"), 3) Next For i = 1 To Lr - 7 For j = i + 1 To Lr - 7 If Arr(i, 1) > Arr(j, 1) Then temp = Arr(j, 1) Arr(j, 1) = Arr(i, 1) Arr(i, 1) = temp End If Next Next For i = 1 To Lr - 7 temp = Arr(i, 1) Arr(i, 1) = Right(temp, 3) & Left(temp, 2) Next Range("D8").Resize(Lr - 7, 1).Value = Arr Application.ScreenUpdating = True End Sub