Làm sao sort danh sách theo tháng!

Liên hệ QC
anhtuan1066 đã viết:
Nó báo lỗi dòng này bác ơi:
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ANH TUẤN
Sao kỳ vậy cà... Có bác nào bị giống vậy nữa không? Em test kỹ lắm mới dám cho lên đây đấy chứ.
À, bác Tuấn ơi, bác xóa phén luôn cái dòng đó đi thử xem, em mới down về lại, mặc dù không báo lỗi gì cả, nhưng em thử xóa luôn cái dòng đó, nó vẫn sort cái vèo. Hihi
 
Xóa xong nó báo thêm 1 chùm nữa:
Mã:
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=ActiveCell.Range _
        ("A1:A743"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", DataOption:=xlSortNormal
Hicccccccccccccccccc
 
Em chưa trả lời cho bác được việc bác hỏi, nhưng em phải nói cái này đã.
File của bác hay ghê, đúng là một con người biết quan tâm đến người khác.
--------
Còn cái bác vửa post lên, thì em bó tay...
Cho em hỏi thêm lần nữa, vì có đến 7 lần tải về, có ai gặp giống như bác Tuấn không? Và tại sao bác Tuấn lại bị như vậy? Vì em vẫn không bị nên không biết phải trả lời làm sao...
 
Lần chỉnh sửa cuối:
Tôi sửa lại cái đoạn ấy cho giống của tôi thì nó lại báo lỗi khúc dưới nữa... là khúc WITH gì đó...
---------------------------------
Bạn ơi, khi mình giúp người khác thì mình cũng dc lợi nhiều mà: thu thập thêm kiến thức, đúng ko? Nói chung là vì tôi rất ghét vụ thêm cột phụ như thế này... vài trăm dòng thì ko sao, nhưng lên đến 10.000 dòng thì cách này ko ỗn.. Vì thế mà tôi muốn nghiên cứu thêm đễ có thể LỌC dc trong nhưng tình huống tương tự thế này...
Mong các bạn trợ giúp
 
anhtuan1066 đã viết:
Lở dùng VBA rồi thì làm luôn code cho đở mất công chạy tới chạy lui:
Mã:
Sub SAPXEP()
    Range("D2:D10000").NumberFormat = "mmm"
    Range("B2:K10000").Sort Key1:=Range("D2"), Order1:=xlAscending
    Range("D2:D10000").NumberFormat = "dd/mm/yyyy"
End Sub
Quá gọn!...
ANH TUẤN
Nếu dùng VBA rồi thì chơi tới luôn. Nếu ngày không ở cột D hoặc dòng cuối lớn hơn 10000 thì sao? SortMonth mang tính tổng quát hơn, bao nhiêu dòng hoặc ngày ở cột nào cũng được (hạn chế là bảng tính không sử dụng cột IV (cột 256 cuối cùng) vì SortMonth sẽ dùng cột.
VBA sẽ tạo cột phụ và sau khi sort xong, nó xóa cột phụ nên không làm tăng dung lượng tập tin. Muốn sử dụng SortMonth, bạn chỉ cần chọn 1 ô trong cột ngày để SortMonth biết cột cần sắp xếp, phần việc còn lại VBA giải quyết.

Khi SortMonth chạy, nó sẽ:
1. Ghi dòng cuối dsách vào rc, ghi cột ngày vào cotngay.
2. Thông báo xác nhận sắp xếp (cẩn thận vì khi sort xong không thể undo được).
3. Nếu OK, thực hiện:
- Tách tháng ghi vào cột 256
- Sắp xếp từ cột 1 đến 256 theo cột ngày

Mã:
[/FONT]
[FONT=Verdana]Sub SortMonth()
On Error GoTo baoloi
rc = Cells(1, 1).End(xlDown).Row
cotngay = ActiveCell.Column
tencot = Mid(Cells(1, cotngay).Address, 2, InStr(2, Cells(1, cotngay).Address, "$") - 2)
chon = MsgBox("Ban sap xep thang cho cot " & tencot & " ?", vbYesNo + vbDefaultButton2, "Sort Month")
If chon = 6 Then
  For r = 2 To rc
    Cells(r, 256) = Month(Cells(r, cotngay))
  Next
  Range(Cells(2, 1), Cells(rc, 256)).Sort Key1:=Cells(2, 256), Order1:=xlAscending, Header:=xlNo
  Columns(256).ClearContents
  Cells(1, cotngay).Select
End If
Exit Sub
baoloi:
MsgBox "Du lieu ô " & Cells(r, cotngay).Address(0, 0) & " khong phai ngay!", vbOKOnly, "Sort Month"
Cells(r, cotngay).Select
End Sub
[/FONT]
[FONT=Verdana]

Nếu muốn sort theo năm thì thay Month bằng Year, muốn sort giảm dần thì thay xlAscending bằng xlDescending
 

File đính kèm

  • SortMonth.zip
    31.5 KB · Đọc: 37
Trong bài Loc_SN4, ct tại M1 và N1 hình như chưa đúng.
M1={=MATCH(TRUE,MONTH($D$2:$D$876)=LIST!$Q$5,0)+1}
Tìm dòng đầu có tháng = tháng
N1=SUMPRODUCT((MONTH($D$2:$D$876)=LIST!$Q$5)*1)+M1-1
Tìm số dòng có tháng = tháng.
Theo tôi nên sửa 1 chút như sau:
M1:{=MIN(IF(MONTH($D$2:$D$876)=LIST!$Q$5,IF(DAY($D$2:$D$876)=LIST!$P$5,ROW($D$2:$D$876),"")))}
N1:={MAX(IF(MONTH($D$2:$D$876)=LIST!$Q$5,IF(DAY($D$2:$D$876)=LIST!$P$5,ROW($D$2:$D$876),"")))}
Còn phần bỏ cột P thì chưa nghĩ ra.
Còn bài này mà dùng VBA thì quá nhanh. Tạo ra 1 cột có ngày, tháng=ngày, tháng, gán 1, công thức if này có thể chạy 20.000 row rất nhanh, còn đừng có hỏi nhanh bao nhiêu, gán đồng hồ vào mà tính. AF theo 1 là ra 1 bảng cần.
 
Tôi thử lại công thức của tôi thì thấy chính xác... Còn của ThuNghi thì sai 1 khoảng rất lớn so với thực tế
Ví dụ tôi chọn tháng 2 thì nhìn lại công thức tôi cho kết quả =122 và 181 (đúng) còn của ThuNghi cho kết quả =165 và 175 (sai)
Bạn xem lại nhé!
ANH TUẤN
 
Công thức của tôi là lấy theo ngày, tháng.
Bạn thử tại dòng 700 nhập vào ngày 01/02/2007 xem thế nào. kiểm tra tại sh list thử.
 
Phần bỏ cột phụ tôi nghĩ ra dc rồi... Nói chung sẽ dựa vào mãng sao đây làm điều kiện:
Mã:
=(day(...)=d/k1)*(month(...)=dk2)*row($2:$...)
Lúc đó chỉ cần kết hợp thêm hàm SMALL đễ lấy ra tuần tự từ em nhỏ nhất đến em lớn nhất... kết hợp thêm INDIRECT nữa là ra toàn bộ kết quả... Với cách này sẽ ko cần Sort, ko cần cột phụ... Tuy nhiên khi thử nghiêm thì nó lại chậm hơn rất nhiều so với cách dùng cột phụ, chẳng hiểu tại sao nữa? Một cách phải quét ít nhất vài chục dòng, còn cách kia tìm chính xác luôn, vậy mà chậm hơn mới kỳ chứ!
Về nguyên tắc thì tìm dc giãi pháp rồi, nhưng vẩn chưa xử lý dc tốc độ cho cách mới này...
Mến
ANH TUẤN
 
Tôi phát hiện cái code của BNTT tại sao tôi ko chạy dc rồi... Trời đất ơi.. cái đó bạn thao tác trên Excel2007 cơ mà, làm sao Excel2002 của tôi chạy dc chứ... Hôm nay tôi thử record macro trên Excel2007 thì thấy code giống như của bạn vậy... he... he...
--------------------------------------
Giờ đễ bỏ luôn cột phụ mà tốc độ vẫn nhanh thì chắc vẫn phải thêm vụ sort tháng nữa... (đễ trích ra mãng động)... Tôi post lên cho mọi người xem nha!
--------------------------------------
Nhân tiện thao tác trên Excel2007 và save thành file xlsx mới thấy rằng dung lượng giảm xuống kinh khủng: Từ 2M còn 400K... Tuy nhiên, nếu nén lại bằng RAR thì nên đễ nguyên file xls mà nén.. vì 400K file xlsx khi nén thành RAR thì còn 156K.. nhưng 2M file xls khi nén lại chỉ còn 98K... Ngộ thiệt
 
Lần chỉnh sửa cuối:
anhtuan1066 đã viết:
Tôi phát hiện cái code của BNTT tại sao tôi ko chạy dc rồi... Trời đất ơi..
Thì hôm trước em nghe bác nói bác xài Office 2007 portable gì có mà.
Cho em xin lỗi nhé.
 
Đã là Portable thì chủ yếu là nghiên cứu chơi và mang đi xa, còn thường thì tôi dùng Excel2002.. Định đến khi nào thật nhuần nhuyển nó thì cài luôn... hi.. hi.. Chứ xài thật sự ai lại xài Portable, nhất là đối với Office, (ko thể tùy biến như thêm bớt thành phần hoặc thêm add-in)
 
Web KT
Back
Top Bottom