Làm sao sort danh sách theo tháng! (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Giã sử tôi có 1 bảng tính với nhiều cột, trong đó có cột ngày tháng năm (chẳng hạn là cột B)... Vậy làm thế nào tôi có thể Sort danh sách theo THÁNG trong cột B này... tức là tháng 1 sẽ đứng trước.. vân vân.. đến tháng 12... Tất nhiên là ko dùng cột phụ!
Mến
ANH TUẤN
 
Đầu tiên anh cần format cột B qua dạng (mmmm) dùng custom format đấy. Xong rồi tha hồ sort kiểu nào cũng được.

Thân
 
Tôi không nghĩ anhtuan1066 lại hỏi câu này.
 
À. Cách trên có dạng tên tháng theo tiếng Anh. Nếu anh bạn muốn tháng có dạng số thì vô custom format cho nó là (mm).

Mến
 
Sort rồi... ko dc... nó ko tài nó sắp lại tháng 1 nằm trên cả...
Chú ý rằng cột ngày tháng năm này đang lộn xộn nha! Tôi chỉ cần cùng tháng thì xếp gần nhau và xếp tăng dần, mặc kệ ngày và năm là gì?
Tôi ko nghĩ là Custom Format có thể giãi quyết dc vấn đề, các bạn thử lại đi... Vì theo nguyên tắc thì Custom Format chỉ là cách hiển thị, ngày 2/5/2007 dù có format custom kiểu nào thì bản chất của nó vẫn là số 39204... Vậy làm sao có thể dựa vào Custom Format đễ Excel hiểu rằng ngày 2/5/2006 (38839) và ngày 2/5/2007 (39204) là cùng 1 dạng đễ chúng xếp cạnh nhau? Rất vô lý, phải ko?
Nói chung là tôi đã thử các kiểu, nhưng ko dc!
Đây là file đính kèm, các bạn hảy làm sao sort cột NGAY SINH tăng dần theo tháng : Từ tháng 1 đến tháng 12
ANH TUẤN
 

File đính kèm

Lần chỉnh sửa cuối:
Ở đây thì bác nói:
anhtuan1066 đã viết:
Giã sử tôi có 1 bảng tính với nhiều cột, trong đó có cột ngày tháng năm (chẳng hạn là cột B)... Vậy làm thế nào tôi có thể Sort danh sách theo THÁNG trong cột B này... tức là tháng 1 sẽ đứng trước.. vân vân.. đến tháng 12... Tất nhiên là ko dùng cột phụ!
Đến đây bác lại nói:
anhtuan1066 đã viết:
Nói chung là tôi đã thử các kiểu, nhưng ko dc!
Nếu thật sự bác đã dùng các kiểu, cho em hỏi: Dùng cột phụ không phải là kiểu sao? Với em bài này nếu không dùng cột phụ để tách tháng ra thì em bó tay.

À... em hiểu rồi. Bác đố mọi người chớ gì? Tại nếu đã dùng cột phụ thì bác hỏi làm chi :
Chibi đã viết:
Tôi không nghĩ anhtuan1066 lại hỏi câu này.
 
Ko phài là đố! hi... hi... (chắc tại đố nhiều quá nên mọi người nghi ngờ)... Tôi bí vụ này thật đấy! Bạn nghĩ đi, dùng cột phụ thì dễ rồi, nhưng nếu dử liệu trên 20.000 dòng thì công thức tách tháng cũng phải chạy theo 20.000 dòng.. nhiều quá làm dung lượng file tăng và có thể bảng tính sẽ chậm!
Nếu giãi quyết vấn đề này bằng VBA thì phải làm thế nào đây? Bác BNTT hướng dẩn tôi với.. Bí thật đó!
Giá như chức năng Sort có thể chơi dc với 1 "mãng ảo" thì ngon rồi... tôi sẽ đặt name đễ tạo 1 mãng theo tháng (ko phải cột phụ) rồi cho chức năng sort sắp xếp theo "mãng ảo" này... Hic..
ANH TUẤN
 
À, anh muốn sort theo năm sinh. Cái này thì dùng VBA lấy dữ liệu ra từng tháng một theo auto filter thì mới được nếu không xài cột phụ lấy giá trị tháng.

Anh thữ làm trước đi rồi mọi người giúp ý kiến.

Mến
 
Tôi ko biết VBA nên ko nghĩ ra dc cách nào... Bạn BNTT và Digita có thể giúp tôi 1 code ko? Miển sao toàn bộ cột NGAY SINH sẽ dc sắp xếp tháng 1 đừng trước.. vân.. vân.. đến tháng 12 đứng sau cùng (ngày và năm ko quan trọng)... Có file đính kèm theo ở bài #5 đấy!
ANH TUẤN
 
anhtuan1066 đã viết:
... Tôi bí vụ này thật đấy! Bạn nghĩ đi, dùng cột phụ thì dễ rồi, nhưng nếu dử liệu trên 20.000 dòng thì công thức tách tháng cũng phải chạy theo 20.000 dòng.. nhiều quá làm dung lượng file tăng và có thể bảng tính sẽ chậm!
Nếu giãi quyết vấn đề này bằng VBA thì phải làm thế nào đây?
Tôi xin đề xuất: Dùng VBA và cột phụ
- Đưa giá trị month vào cột phụ
- Sort theo cột phụ
- Xoá giá trị trong cột phụ.
 
Néu không cột phụ thì giống như tự làm khó mình!

Nếu Là VBA thì mình nêu thử đường hướng như sau, các bạn cho ý kiến:

* Xác định số Record, cho vô biến LastRow;
* Khai 12 biến mãng (cho 12 tháng), kèm theo nó lá 12 biến đếm;
* Duyệt từ dòng thứ 2 (dòng 1 là tên trường) tất thẩy các records; gặp tháng nào gán vô mãng ứng với tháng nấy;
* Xóa toàn bộ records sau khi duyệt xong;
* Chép từ các mãng sang Sheet theo trình tự to đến nhỏ hay ngược lại

(chĩ mới xếp theo tháng thôi; kết quả chưa xếp theo năm)
 
Anh Tuấn down file sau có hướng dẩn cách làm ở cột F đấy nhá.

Mên
 

File đính kèm

Bác xài thử cái code này xem
Mã:
[color=darkblue]Sub[/color] Macro2()
[color=green]'[/color]
' Macro2 Macro
[color=green]' Macro recorded 12/11/2007 by QuocAnh[/color]
[color=green]'[/color]
'
    Sheet1.Select
    Cells.Find(What:="ngay sinh", SearchOrder:=xlByRows).Activate
    [color=darkblue]Dim[/color] sodong [color=darkblue]As[/color] [color=darkblue]Long[/color]
    sodong = ActiveCell.CurrentRegion.Rows.Count
    ActiveCell.Columns("A:A").EntireColumn.Select
    Selection.Insert Shift:=xlToRight
    ActiveCell.FormulaR1C1 = "cot phu"
    ActiveCell.Offset(1, 0).FormulaR1C1 = "=DATE(9999,MONTH(RC[1]),DAY(RC[1]))"
    ActiveCell.Offset(1, 0).AutoFill Destination:=ActiveCell.Range("A2:A" & sodong)
    ActiveCell.Range("A1").Select
    Selection.Sort Key1:=ActiveCell, Order1:= _
        xlAscending, Key2:=ActiveCell.Offset(0, -2).Range("A1"), Order2:=xlAscending _
        , Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
        xlTopToBottom
    ActiveCell.Columns("A:A").EntireColumn.Select
    Selection.Delete Shift:=xlToLeft
    ActiveCell.Select
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
 
SA_DQ đã viết:
Nếu Là VBA thì mình nêu thử đường hướng như sau, các bạn cho ý kiến:

* Xác định số Record, cho vô biến LastRow;
* Khai 12 biến mãng (cho 12 tháng), kèm theo nó lá 12 biến đếm;
* Duyệt từ dòng thứ 2 (dòng 1 là tên trường) tất thẩy các records; gặp tháng nào gán vô mãng ứng với tháng nấy;
* Xóa toàn bộ records sau khi duyệt xong;
* Chép từ các mãng sang Sheet theo trình tự to đến nhỏ hay ngược lại

(chĩ mới xếp theo tháng thôi; kết quả chưa xếp theo năm)

Nếu theo cách VBA cách của anh Sa thì các bước anh nêu ra thì đúng theo tuần tự. Nhưng kiểm tra từng hàng cho 12 biến đếm trong thì hơi lâu. Nên kết hợp chức năng auto filter lọc từng tháng rồi copy dữ liệu được lọc qua sheet khác.

Tuy nhiên vì có cách sort không cần cột phụ nên khỏi cần dùng "thuốc" VBA trong trường hợp này.

Mến
 
Oh... rõ ràng hổi nảy làm theo cách Digita ko tài nào dc, sao giờ lại dc ta? Còn cách Soibien thì cũng giống mình đang làm.. hi.. hi.. Là có dùng cột phụ, tuy nhiên xong thì xóa luôn
Vụ này lạ thật...
Rất hay, và nếu đúng như Digita nói thì ta còn có thể sort theo năm luôn nữa đấy! Hay nói chung là sort theo bất cứ giống gì ta nghĩ dc, đó là dựa vào Custom List trong Options và dựa và Custom Format... Hay thậ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!...
Một phát hiện cực kỳ! Chân thành cảm ơn Digita!
Mến
ANH TUẤN
 
Lần chỉnh sửa cuối:
Tôi lại hỏi thêm 1 chuyện nữa: Vì sort giống Digiata nói sẽ có liên quan đến Custom List... Ta đễ ý list mặc định của Excel là ko thể Remove dc... Vậy có phương pháp nào xóa dc Custom list này ko? (kể cả lập trình)
 
Không lẽ nói bó tay với bác rồi thì lơ luôn, thế là em ra ngoài mày mò nãy giờ. Bi giờ vào lại nhà thì thấy bài giải quá trời. Nhưng xem lại thì bài của em làm cũng có cái khác, vì bài của mấy bác sort xong cái cột STT nó lung tung cả lên, còn theo bài #15 của bác thì lỡ bác có một record nào đó nằm ở hàng thứ 100001 thì sao? Nên thui, cho em tham gia với. (Chỉ được góp ý, không được chê à nghen)
 

File đính kèm

Nó báo lỗi dòng này bác ơi:
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ANH TUẤN
 
Thua các Bác này luôn , hợi bị ghiền VBA rồi.
 
Ko phải đâu ThuNghi ơi... Thật ra cách sort thế này quả là lạ ko phải ai cũng biết... Nhưng rõ ràng nếu thao tác bằng tay cho dử liệu 10.000 dòng thì kéo lên kéo xuống nội cái chuyện Format ko cũng thấy mệt rồi.. Nên mượn tí code cho nhẹ công việc thôi mà... hi... hi... Và còn 1 điểm quan trọng nữa, bỏ đi cột phụ rồi dung lượng file giảm đáng kễ: File gốc của tôi là 1,5M... giờ bỏ cột phụ còn có 390KB... Sướng thấy mồ ngu sao ko làm...
Sẳn đây tôi nhờ các cao thủ làm cách nào bỏ dc cột phụ P (đang đặt name là STT)... Đại khái làm thế nào vẫn có dc name STT đễ dùng cho các sheet khác mà ko cần đến cột P
Mến
ANH TUẤN
 
Lần chỉnh sửa cuối:
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

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)
 

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

Back
Top Bottom