viết code trong excel để sắp xếp theo yêu cầu sau đó tách sheet

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

thufpts

Thành viên hoạt động
Tham gia
6/8/12
Bài viết
157
Được thích
6
Giới tính
Nam
Nghề nghiệp
Bốc vác
em chào các bác!
em có một file excel có các cột ở dòng số 8 được đánh thứ tự ưu tiên và mong muốn được sắp xếp theo các điều kiện sau nhờ các bác, anh chị giúp đỡ
1) cột E, W, AC các dữ liệu giống nhau thì được sắp xếp cùng nhau theo thứ tự ưu tiên đã đánh đâu ở dòng số 8, cột G sắp xếp tăng dần ví dụ
ví dụ kết quả như sau khi bấm nút "sap xep" sẽ sắp xếp MACHINE có 7 dòng giá trị là PFR 01, TEETH là 44 và INK COLOR là BLACK được sắp xếp cùng nhau sao cho cột FINAL D có ngày tăng dần cho đến khi hết TEETH có giá trị là 44 thì chuyển sang TEETH có giá trị 44, hết 44 thì chuyển sang 83, hết 83 thì chuyển sang 46 lần lượt như ảnh em gửi, nó phức tạp ở chỗ là nhiều dữ liệu quá ngồi làm thủ công thì rối loạn luôn.

2) nếu thứ tự ưu tiên được thay đổi thì khi bấm nút sắp xếp sẽ được thay đổi theo thứ tự ưu tiên mới
3) khi sắp xếp xong tiến hành tách sheet theo cột MACHINE NAME, ví dụ cột MACHINE NAME có 3 tên là PFR09, PFR01 và PFR04 thì tách thành 3 sheets, nghĩa là có bao nhiêu tên thì tách thành bây nhiêu sheet

1727684604007.png
 

File đính kèm

Lần chỉnh sửa cuối:
Giải pháp
Đôi khi thớt sort theo 4 cột hoặc 6 cột thì phải làm sao? :)
Chỉnh lại một chút bạn hiền:
Mã:
Sub SortbyMultipleColumns()
Dim lastRow As Long, i As Long, rng As Range, SortRng As Range
With Worksheets("PFL_PRINT")
    lastRow = .Range("B9").End(xlDown).Row
    Set rng = Range("B9:AT" & lastRow) '
    For i = 31 To 1 Step -1
        Set SortRng = .Range("A8:AC8").Find(i)
        If Not SortRng Is Nothing Then rng.Sort Key1:=SortRng.Offset(1, 0), Order1:=xlAscending
    Next
End With
End Sub
Đầy đủ thì thêm phần kiểm tra tên sheet và tách. Hahaha ...
em chào các bác!
em có một file excel có các cột ở dòng số 8 được đánh thứ tự ưu tiên và mong muốn được sắp xếp theo các điều kiện sau nhờ các bác, anh chị giúp đỡ
1) cột E, W, AC các dữ liệu giống nhau thì được sắp xếp cùng nhau theo thứ tự ưu tiên đã đánh đâu ở dòng số 8, cột G sắp xếp tăng dần ví dụ
ví dụ kết quả như sau khi bấm nút "sap xep" sẽ sắp xếp MACHINE có 7 dòng giá trị là PFR 01, TEETH là 44 và INK COLOR là BLACK được sắp xếp cùng nhau sao cho cột FINAL D có ngày tăng dần cho đến khi hết TEETH có giá trị là 44 thì chuyển sang TEETH có giá trị 44, hết 44 thì chuyển sang 83, hết 83 thì chuyển sang 46 lần lượt như ảnh em gửi, nó phức tạp ở chỗ là nhiều dữ liệu quá ngồi làm thủ công thì rối loạn luôn.

2) nếu thứ tự ưu tiên được thay đổi thì khi bấm nút sắp xếp sẽ được thay đổi theo thứ tự ưu tiên mới
3) khi sắp xếp xong tiến hành tách sheet theo cột MACHINE NAME, ví dụ cột MACHINE NAME có 3 tên là PFR09, PFR01 và PFR04 thì tách thành 3 sheets, nghĩa là có bao nhiêu tên thì tách thành bây nhiêu sheet

View attachment 304357
Thử code này xem sao?
Mã:
Sub Sortby5Column()
Dim lastRow As Long, i As Long, rng As Range, SortRng As Range
With Worksheets("PFL_PRINT")
    lastRow = .Range("B9").End(xlDown).Row
    Set rng = .Range("B9:AT" & lastRow) '
    For i = 5 To 1 Step -1
        Set SortRng = .Range("A8:AC8").Find(i).Offset(1, 0)
        rng.Sort Key1:=SortRng, Order1:=xlAscending
    Next
End With
End Sub
 
Upvote 0
Vâng là thiếu sót của em, em đã chỉnh lại yêu cầu của bài 1 rồi. mong bác xem xét.
Bài 1 bạn chỉ thay ảnh bằng ảnh bài 8. Mà bài 8 thì tôi khẳng định từ bài 15 và 17 là vô nghĩa và dùng sort là vô phương.
Bạn chưa giải thích tại sao cột Teeth tăng dần mà 83 nhảy lên trên 46, 48, 56, 72? Các dòng mang số 83 có đặc điểm nhân dạng gì mà ưu tiên? Nếu bạn không nói ra, thì chỉ mình bạn biết, không ai giúp được. Vấn đề mấu chốt mà không nói thì qua 3 ngày, 1 tuần, 1 tháng cũng vậy thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Đọc sơ qua thì thấy cũng vậy, sau 44 vẫn cứ là 46, rồi tới 48, 56, 72. Còn 83 vẫn dưới cùng của PFR01. Còn hình bài 8 với hình bài 1 mới thay thì con 83 là có số hưởng ăn trên ngồi trước.
 
Upvote 0
Thử code này xem sao?
Mã:
Sub Sortby5Column()
Dim lastRow As Long, i As Long, rng As Range, SortRng As Range
With Worksheets("PFL_PRINT")
    lastRow = .Range("B9").End(xlDown).Row
    Set rng = .Range("B9:AT" & lastRow) '
    For i = 5 To 1 Step -1
        Set SortRng = .Range("A8:AC8").Find(i).Offset(1, 0)
        rng.Sort Key1:=SortRng, Order1:=xlAscending
    Next
End With
End Sub
Đôi khi thớt sort theo 4 cột hoặc 6 cột thì phải làm sao? :)
 
Upvote 0
Đôi khi thớt sort theo 4 cột hoặc 6 cột thì phải làm sao? :)
Nếu đã hỏi 4, hoặc 6, thì hỏi luôn từ 0 đến 31 (dữ liệu 31 cột). Thôi thì hỏi gì trả lời nấy cho khỏe, sau đó đổi đề bài vô lý và không thích trả lời tiếp thì rút lui như @Quang_Hải, đổi đề bài vô lý mà muốn vặn thì như lão ct.
Còn có hứng như anh thì cứ làm cho anh em khác học hỏi.
 
Upvote 0
Đôi khi thớt sort theo 4 cột hoặc 6 cột thì phải làm sao? :)
Chỉnh lại một chút bạn hiền:
Mã:
Sub SortbyMultipleColumns()
Dim lastRow As Long, i As Long, rng As Range, SortRng As Range
With Worksheets("PFL_PRINT")
    lastRow = .Range("B9").End(xlDown).Row
    Set rng = Range("B9:AT" & lastRow) '
    For i = 31 To 1 Step -1
        Set SortRng = .Range("A8:AC8").Find(i)
        If Not SortRng Is Nothing Then rng.Sort Key1:=SortRng.Offset(1, 0), Order1:=xlAscending
    Next
End With
End Sub
Đầy đủ thì thêm phần kiểm tra tên sheet và tách. Hahaha ...
 
Upvote 0
Giải pháp
Bài 1 bạn chỉ thay ảnh bằng ảnh bài 8. Mà bài 8 thì tôi khẳng định từ bài 15 và 17 là vô nghĩa và dùng sort là vô phương.
Bạn chưa giải thích tại sao cột Teeth tăng dần mà 83 nhảy lên trên 46, 48, 56, 72? Các dòng mang số 83 có đặc điểm nhân dạng gì mà ưu tiên? Nếu bạn không nói ra, thì chỉ mình bạn biết, không ai giúp được. Vấn đề mấu chốt mà không nói thì qua 3 ngày, 1 tuần, 1 tháng cũng vậy thôi.
Cám ơn bác rất nhiều, phải nói như thế nào nhỉ nó cũng ở em không mô tả được, khi lên đây được nhiều bác nói mới vỡ lẽ, em sẽ chọn tam một giải pháp chống cháy trước.
Bài đã được tự động gộp:

Chỉnh lại một chút bạn hiền:
Mã:
Sub SortbyMultipleColumns()
Dim lastRow As Long, i As Long, rng As Range, SortRng As Range
With Worksheets("PFL_PRINT")
    lastRow = .Range("B9").End(xlDown).Row
    Set rng = Range("B9:AT" & lastRow) '
    For i = 31 To 1 Step -1
        Set SortRng = .Range("A8:AC8").Find(i)
        If Not SortRng Is Nothing Then rng.Sort Key1:=SortRng.Offset(1, 0), Order1:=xlAscending
    Next
End With
End Sub
Đầy đủ thì thêm phần kiểm tra tên sheet và tách. Hahaha ...
đa tạ bác
 
Upvote 0
Nếu đã hỏi 4, hoặc 6, thì hỏi luôn từ 0 đến 31 (dữ liệu 31 cột). Thôi thì hỏi gì trả lời nấy cho khỏe, sau đó đổi đề bài vô lý và không thích trả lời tiếp thì rút lui như @Quang_Hải, đổi đề bài vô lý mà muốn vặn thì như lão ct.
Còn có hứng như anh thì cứ làm cho anh em khác học hỏi.
Thật ra bài này không có khó, em đã giải hết 90% theo yêu cầu của chủ thớt rồi. Em đã ghi chú ở đoạn code cho bạn ấy tự mày mò. Còn muốn viết từ a tới z thì em đành phải lấy phí thôi. Em sống bằng việc viết code mà.
 
Upvote 0
Thật ra bài này không có khó, em đã giải hết 90% theo yêu cầu của chủ thớt rồi. Em đã ghi chú ở đoạn code cho bạn ấy tự mày mò. Còn muốn viết từ a tới z thì em đành phải lấy phí thôi. Em sống bằng việc viết code mà.
Nếu dữ liệu này mà không giải thích được các dòng có con số 83 có nhân thân dòng họ thế nào để được ăn trên ngồi trước thì tôi cho rằng nên làm tay. Ít nhất phải có 1 cột, hoặc 1 dấu hiệu cho việc ưu tiên này. Không code nào đọc được ý nghĩ trong đầu kiểu tôi cứ muốn nó nằm trên, làm sao thì làm.
 
Upvote 0
Nếu dữ liệu này mà không giải thích được các dòng có con số 83 có nhân thân dòng họ thế nào để được ăn trên ngồi trước thì tôi cho rằng nên làm tay. Ít nhất phải có 1 cột, hoặc 1 dấu hiệu cho việc ưu tiên này. Không code nào đọc được ý nghĩ trong đầu kiểu tôi cứ muốn nó nằm trên, làm sao thì làm.
là thế này ạ, cột TEETH tại sao lại đưa 83 lên trước nó sẽ phụ thuộc vào cột FINAL D, em sẽ làm thủ công như sau, nhìn bằng mắt thường nếu thấy cột FINAL D có ngày nhỏ nhất thì hốt cả cái chỗ ngày đó lên theo teeth sắp xếp trước, ở đây sẽ có trường hợp cột TEETH sẽ có nhiều loại mà đều có ngày ở cột FINAL D bằng nhau thì nhìn từ trên xuống dưới gặp cái nào thì hốt cái đó lên trước thôi ạ, chứ không cứ gì là 83, em hiểu ý bác cần phải có cái gì đó để giải thích rõ nên từ góc độ của em sẽ diễn tả bằng văn xuôi như vậy để bác hiểu
 
Upvote 0
là thế này ạ, cột TEETH tại sao lại đưa 83 lên trước nó sẽ phụ thuộc vào cột FINAL D, em sẽ làm thủ công như sau, nhìn bằng mắt thường nếu thấy cột FINAL D có ngày nhỏ nhất thì hốt cả cái chỗ ngày đó lên theo teeth sắp xếp trước, ở đây sẽ có trường hợp cột TEETH sẽ có nhiều loại mà đều có ngày ở cột FINAL D bằng nhau thì nhìn từ trên xuống dưới gặp cái nào thì hốt cái đó lên trước thôi ạ, chứ không cứ gì là 83, em hiểu ý bác cần phải có cái gì đó để giải thích rõ nên từ góc độ của em sẽ diễn tả bằng văn xuôi như vậy để bác hiểu
Mình nghĩ là bạn muốn kết quả thế này, na ná như kết quả của hình thứ 2
1728271930187.png1728271967935.png
 
Upvote 0
Bác có thể gửi lại code không để em chạy thử ạ
Bạn tham khảo thử kết quả test trong file. Mình nghĩ yêu cầu của bạn có thể thực hiện bằng code. Vì đây là code vay mượn nên mình không thể gởi code này lên diễn đàn. Khi tải file về có thể bị Block, bạn phải vào properties rồi chọn unblock
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom