mhieuit
Thành viên hoạt động



- Tham gia
- 3/9/13
- Bài viết
- 163
- Được thích
- 19
- Nghề nghiệp
- Data controller






Hi HYen17,Thì bạn chép nội dung cột trộn đó đem gởi tạm vô cột 'Ghi chú' ở fía sau & xếp sắp theo cột trung gian này
Sau đó xóa dữ liệu trung gian đi.
Các bước này bạn thử tự ghi bằng bộ thu macro cũa VBA xem sao



Hi Anh,[note]
1. Tiêu đề phạm quy vì không giấu, đặt tên cũng chung chung
2. Bạn cần giúp viết code lại đưa bài vào Box Nhưng vấn đề chung -> Sai Box
Lưu ý lần sau nhé bạn. Tôi sẽ di chuyển đề tài vào box hợp lý
Cảm ơn bạn.
[/note]
VBA tối kỵ với việc merge cells, code sort bình thường không áp dụng được trong trường hợp này.
File att chỉ 1 trong những sheet demo, vì file của em có thể có rất nhiều sheet, vi em load từ hệ thống về thì đã merge cell sẳn rồi. HYen17 còn có cách nào khả thi hơn không.




Bài này với mình thì không khó khăn gì. Nhưng không biết bạn muốn thế nào nên chưa code. Bạn thử cho kết quả kế bên xem.Hi Anh,
vậy là không có cách nào để khắc phục tình huống này sao anh?



Hi anh,Bài này với mình thì không khó khăn gì. Nhưng không biết bạn muốn thế nào nên chưa code. Bạn thử cho kết quả kế bên xem.



Trong công việc nếu cần như vậy, thì tại sao ta không nghĩ đến việc bỏ Merge đi và xoá cột rổng rồi sort nhỉ.



Hi anh,Bao nhiêu Sheet cũng được, miễn là cấu trúc, tên gọi,. . . của chúng có thể tự động hóa bằng macro được là OK tất!
2uan trọng là bạn có trong tay con macro thân thương để chạy cho các trang tính cùng cấu trúc í mà thôi.



Hi anh,Bài này với mình thì không khó khăn gì. Nhưng không biết bạn muốn thế nào nên chưa code. Bạn thử cho kết quả kế bên xem.
Hi anh,
em gửi file att, bên trong file em có nội dung em cần anh code giúp, check giúp em nhe. Thanks anh.



bạn không cần phải bỏ merged đâu, để nguyên code cho thích
Để con trỏ ở sheet cần sắp xếp bấm Ctr+r là run sắp xếp
Alt+F11 để xem code
Hi anh,
em đã test code của anh, nhưng kết quả như hình att, anh check lại giúp em với. Thanks anh



Hi anh,Thế là kết quả chính xác đúng không bạn, vì bạn muốn sắp xếp cột "Desc Chi tiết" nên kết quả là đúng ???



Hi anh,Thi code của cột đó đúng =0 nên là 0, bạn định dạng format cho cột đó dạng 4 số 0000 thì sẽ trở lại đúng thôi



Hi anh,bạn Bấm ctrl+a rồi bấm ctrl+c để copy toàn bộ code của module sang module của file mới, nhớ rằng vị trí dữ liệu sắp xếp phải giống nhau nhé
'__________ code by giola, 01.2015
Sub sortPGH()
Const VungSort = "B15:W15" 'vung dong tieu de dau tien
Const colSort = 6 'thu tu cot sap xep
Const sort_AtoZ = True 'sap xep theo AtoZ (True), neu False la ZtoA
Dim Rg As Range
Dim ceL As Range
Dim Sh As Worksheet
Dim a As Variant
Dim b As Variant
Dim wB As Workbook
Set wB = ActiveWorkbook
If MsgBox("ban co chac chan sap xep vung du lieu " & VungSort & " cho tat ca cac Sheets trong files(Y/N)?", _
vbYesNo + vbQuestion) <> vbYes Then GoTo end_
On Error Resume Next
For Each Sh In wB.Sheets
Set Rg = Sh.Range(VungSort)
Set Rg = Rg.Offset(1).Resize(Sh.[B65536].End(xlUp).Row - Rg.Row)
'''If MsgBox("ban co chac chan sap xep vung du lieu " & Rg.Address & " (Y/N)?", _
vbYesNo + vbQuestion) <> vbYes Then GoTo end_
a = Rg.Value
b = QuickSort2DArray(Arr:=a, _
col_sort:=colSort, _
sortAtoZ:=sort_AtoZ)
Rg = b
Next
MsgBox "Ket thuc, Da sap xep xong"
end_:
End Sub



HI anh,** lưu ý tất cả các sheet đều là PGH
+copy toàn module sang,
+ và thay toàn bộ sortPGH thành cái sau
PHP:'__________ code by giola, 01.2015 Sub sortPGH() Const VungSort = "B15:W15" 'vung dong tieu de dau tien Const colSort = 6 'thu tu cot sap xep Const sort_AtoZ = True 'sap xep theo AtoZ (True), neu False la ZtoA Dim Rg As Range Dim ceL As Range Dim Sh As Worksheet Dim a As Variant Dim b As Variant Dim wB As Workbook Set wB = ActiveWorkbook If MsgBox("ban co chac chan sap xep vung du lieu " & VungSort & " cho tat ca cac Sheets trong files(Y/N)?", _ vbYesNo + vbQuestion) <> vbYes Then GoTo end_ On Error Resume Next For Each Sh In wB.Sheets Set Rg = Sh.Range(VungSort) Set Rg = Rg.Offset(1).Resize(Sh.[B65536].End(xlUp).Row - Rg.Row) '''If MsgBox("ban co chac chan sap xep vung du lieu " & Rg.Address & " (Y/N)?", _ vbYesNo + vbQuestion) <> vbYes Then GoTo end_ a = Rg.Value b = QuickSort2DArray(Arr:=a, _ col_sort:=colSort, _ sortAtoZ:=sort_AtoZ) Rg = b Next MsgBox "Ket thuc, Da sap xep xong" end_: End Sub
HI anh,
em đang test code của anh vào file chính thức bên em, em dự đinh addin để sử dụng, nếu có kết quả em sẽ back lại sau anh nhé.
cám ơn anh rất nhiều.



Hi anh,bạn không cần phải bỏ merged đâu, để nguyên code cho thích
Để con trỏ ở sheet cần sắp xếp bấm Ctr+r là run sắp xếp
Alt+F11 để xem code
Hi anh,
file att a thay đổi rồi ak, em thấy code mất hết phần moudle bên dưới, cho em xin code lại nhé, thanks anh



Dear GPE,
em cần giúp các anh chi code tiếp giúp em vấn đề như sau:
file att là e nhờ anh giola code sắp xếp theo côt Desc đã ok, anh chi code tiếp code này sau khi sắp xếp theo côt Desc nếu trùng tên thì sắp xếp côt mã hàng tăng dần giúp em với.
Thanks GPE nhiều.



Hi anh,Vấn đề của bạn, là đưa thêm yêu cầu không đưa ngay từ đầu, nên làm cho mọi người giúp đỡ khó khăn lại phải sửa đi sửa lại.
Tốt nhất là bạn mở chủ để mới với file mới hoàn toàn không lẫn cái cũ và đặt lại vấn đề, thì chắc có người giúp được




Mình code dựa theo file của bài 21 nha.Dear GPE,
em cần giúp các anh chi code tiếp giúp em vấn đề như sau:
file att là e nhờ anh giola code sắp xếp theo côt Desc đã ok, anh chi code tiếp code này sau khi sắp xếp theo côt Desc nếu trùng tên thì sắp xếp côt mã hàng tăng dần giúp em với.
Thanks GPE nhiều.
Sub Main()
Rem Written by QuangHai
Dim Data(), Temp As String, sh As Worksheet
Dim FirsrtRow As Long, FirstCol As String, SortOrder()
Dim TotalCols As Byte, Row As Long, J As Long
SortOrder = Array(7, 3)
For Each sh In Worksheets
Data = sh.Range("A16", sh.[A65536].End(3)).Resize(, 24).Value
TotalCols = UBound(Data, 2)
ReDim Preserve Data(1 To UBound(Data), 1 To (TotalCols + 1))
For Row = 1 To UBound(Data, 1)
For J = 0 To UBound(SortOrder)
Temp = Temp & Space(2) & Format(Data(Row, SortOrder(J)), String(10, "0"))
Next
Data(Row, TotalCols + 1) = Temp
Temp = Empty
Next
QuickSort Data, LBound(Data), UBound(Data)
sh.[A16].Resize(UBound(Data), TotalCols) = Data
Next
End Sub
Sub QuickSort(Arr(), Min As Long, Max As Long)
Dim MidVal As Variant, TempVal As Variant
Dim TempMin&, TempMax&, LastCol&, TotalCol&
TempMin = Min
TempMax = Max
LastCol = UBound(Arr, 2)
MidVal = Arr((Min + Max) \ 2, LastCol)
Do While TempMin <= TempMax
Do While Arr(TempMin, LastCol) < MidVal And TempMin < Max
TempMin = TempMin + 1
Loop
Do While MidVal < Arr(TempMax, LastCol) And TempMax > Min
TempMax = TempMax - 1
Loop
If TempMin <= TempMax Then
For TotalCol = 1 To LastCol
TempVal = Arr(TempMin, TotalCol)
Arr(TempMin, TotalCol) = Arr(TempMax, TotalCol)
Arr(TempMax, TotalCol) = TempVal
Next
TempMin = TempMin + 1
TempMax = TempMax - 1
End If
Loop
If Min < TempMax Then QuickSort Arr, Min, TempMax
If TempMin < Max Then QuickSort Arr, TempMin, Max
End Sub



Mình code dựa theo file của bài 21 nha.
Bạn copy code này vào 1 module của file trong bài 21
Chạy thử Sub Main. Lạy trời cho trúng.
PHP:Sub Main() Rem Written by QuangHai Dim Data(), Temp As String, sh As Worksheet Dim FirsrtRow As Long, FirstCol As String, SortOrder() Dim TotalCols As Byte, Row As Long, J As Long SortOrder = Array(7, 3) For Each sh In Worksheets Data = sh.Range("A16", sh.[A65536].End(3)).Resize(, 24).Value TotalCols = UBound(Data, 2) ReDim Preserve Data(1 To UBound(Data), 1 To (TotalCols + 1)) For Row = 1 To UBound(Data, 1) For J = 0 To UBound(SortOrder) Temp = Temp & Space(2) & Format(Data(Row, SortOrder(J)), String(10, "0")) Next Data(Row, TotalCols + 1) = Temp Temp = Empty Next QuickSort Data, LBound(Data), UBound(Data) sh.[A16].Resize(UBound(Data), TotalCols) = Data Next End Sub Sub QuickSort(Arr(), Min As Long, Max As Long) Dim MidVal As Variant, TempVal As Variant Dim TempMin&, TempMax&, LastCol&, TotalCol& TempMin = Min TempMax = Max LastCol = UBound(Arr, 2) MidVal = Arr((Min + Max) \ 2, LastCol) Do While TempMin <= TempMax Do While Arr(TempMin, LastCol) < MidVal And TempMin < Max TempMin = TempMin + 1 Loop Do While MidVal < Arr(TempMax, LastCol) And TempMax > Min TempMax = TempMax - 1 Loop If TempMin <= TempMax Then For TotalCol = 1 To LastCol TempVal = Arr(TempMin, TotalCol) Arr(TempMin, TotalCol) = Arr(TempMax, TotalCol) Arr(TempMax, TotalCol) = TempVal Next TempMin = TempMin + 1 TempMax = TempMax - 1 End If Loop If Min < TempMax Then QuickSort Arr, Min, TempMax If TempMin < Max Then QuickSort Arr, TempMin, Max End Sub




Mình code nhầm rồi, mà hình như mình hết thuốc trị bài này rồi.View attachment 136465
dear anh,
em có chạy thử code của anh, vài trường hợp thì code sort ok, vài trường hợp sort chưa đúng, anh xem ảnh att, anh code lại giúp em với nhé. Thanks anh



Dear anh,Mình code nhầm rồi, mà hình như mình hết thuốc trị bài này rồi.





Dear anh,
em thử thay đổi code như bên dưới, code chạy ok rồi anh
SortOrder = Array(7, 6)--thay số 3 thành số 6, tương ứng với cột mã hàng
View attachment 136469
nhưng còn 1 vướng mắc đó là số thứ tự cũng chạy theo khi sort, anh có cách nào để khi sort stt không theo không anh. thank anh



Mình đoán là bạn sẽ tự nhìn ra chỗ cần thay đổi. Đúng là phải thay số 3 thành số 6
......
Thay thử chỗ này Data = sh.Range("A16", sh.[A65536].End(3)).Resize(, 24).Value
Thành thế này Data = sh.Range("B16", sh.[B65536].End(3)).Resize(, 23).Value
.................
Và thêm chỗ này sh.[B16].Resize(UBound(Data), TotalCols) = Data