Autofilter theo tháng (1 người xem)

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

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

vbavn

Thành viên chính thức
Tham gia
10/1/08
Bài viết
70
Được thích
145
Nguồn: http://www.dailydoseofexcel.com/archives/2008/11/26/autofiltering-on-months/

Đôi khi chúng ta cần lọc số liệu theo tháng. Lúc ấy, chúng ta dùng Autofilter tương tự như hình sau:

autofiltermonth.gif


Phức tạp nhỉ, mắc công xem ngày cuối tháng là ngày nào, ngày đầu tháng là ngày nào. Nếu tạo ra cột phụ cũng không thích. Vậy nên chúng ta có thể dựa vào giá trị ngày tại ô hiện hành (ActiveCell), và sau đây là đoạn mã để chúng ta áp dụng:

Mã:
  [COLOR=#0000dd]Sub[/COLOR] FilterOnMonth[COLOR=#008800]([/COLOR][COLOR=#008800])[/COLOR]
    
    [COLOR=#007f00]'Create a filter in the active column within a sheet's autofilter[/COLOR]
    [COLOR=#007f00]'Use the month of the activecell to filter the range[/COLOR]
    
    [COLOR=#0000dd]Dim[/COLOR] lMonth [COLOR=#0000dd]As[/COLOR] [COLOR=#0000dd]Long[/COLOR]
    [COLOR=#0000dd]Dim[/COLOR] lYear [COLOR=#0000dd]As[/COLOR] [COLOR=#0000dd]Long[/COLOR]
    
    [COLOR=#0000dd]If[/COLOR] [COLOR=#0000dd]IsDate[/COLOR][COLOR=#008800]([/COLOR]ActiveCell.Value[COLOR=#008800])[/COLOR] [COLOR=#0000dd]Then[/COLOR]
        lMonth = [COLOR=#0000dd]Month[/COLOR][COLOR=#008800]([/COLOR]ActiveCell.Value[COLOR=#008800])[/COLOR]
        lYear = Year[COLOR=#008800]([/COLOR]ActiveCell.Value[COLOR=#008800])[/COLOR]
        
            [COLOR=#007f00]'Check if there is an autofilter[/COLOR]
            [COLOR=#0000dd]If[/COLOR] ActiveCell.Parent.AutoFilterMode [COLOR=#0000dd]Then[/COLOR]
            
                [COLOR=#007f00]'Make sure activecell is within autofilter range[/COLOR]
                [COLOR=#0000dd]If[/COLOR] [COLOR=#0000dd]Not[/COLOR] Intersect[COLOR=#008800]([/COLOR]ActiveCell, _
                    ActiveCell.Parent.AutoFilter.Range[COLOR=#008800])[/COLOR] [COLOR=#0000dd]Is[/COLOR] [COLOR=#0000dd]Nothing[/COLOR] [COLOR=#0000dd]Then[/COLOR]
 
                    [COLOR=#007f00]'Create filter[/COLOR]
                    [COLOR=#0000dd]With[/COLOR] ActiveCell.Parent.AutoFilter
                        .Range.AutoFilter ActiveCell.Column - .Range[COLOR=#008800]([/COLOR][COLOR=#cc66cc]1[/COLOR][COLOR=#008800])[/COLOR].Column + [COLOR=#cc66cc]1[/COLOR], _
                            [COLOR=#ff0000]">="[/COLOR] & [COLOR=#0000dd]DateSerial[/COLOR][COLOR=#008800]([/COLOR]lYear, lMonth, [COLOR=#cc66cc]1[/COLOR][COLOR=#008800])[/COLOR], _
                            xlAnd, _
                            [COLOR=#ff0000]"<="[/COLOR] & [COLOR=#0000dd]DateSerial[/COLOR][COLOR=#008800]([/COLOR]lYear, lMonth + [COLOR=#cc66cc]1[/COLOR], [COLOR=#cc66cc]0[/COLOR][COLOR=#008800])[/COLOR]
                    [COLOR=#0000dd]End[/COLOR] [COLOR=#0000dd]With[/COLOR]
                [COLOR=#0000dd]End[/COLOR] [COLOR=#0000dd]If[/COLOR]
            [COLOR=#0000dd]End[/COLOR] [COLOR=#0000dd]If[/COLOR]
    [COLOR=#0000dd]End[/COLOR] [COLOR=#0000dd]If[/COLOR]
    
[COLOR=#0000dd]End[/COLOR] [COLOR=#0000dd]Sub
[/COLOR]


Vbavn
 
Nguồn: http://www.dailydoseofexcel.com/archives/2008/11/26/autofiltering-on-months/

Đôi khi chúng ta cần lọc số liệu theo tháng. Lúc ấy, chúng ta dùng Autofilter tương tự như hình sau:

autofiltermonth.gif


Phức tạp nhỉ, mắc công xem ngày cuối tháng là ngày nào, ngày đầu tháng là ngày nào. Nếu tạo ra cột phụ cũng không thích. Vậy nên chúng ta có thể dựa vào giá trị ngày tại ô hiện hành (ActiveCell), và sau đây là đoạn mã để chúng ta áp dụng:
Đâu cần thế bạn ơi! Chỉ cần định dạng cột NGÀY THÁNG là m hoặc mm hoặc mmm là có thể AutoFilter thoải mái rồi
Sort theo tháng cũng dựa trên nguyên tắc này
(Excel nó thông minh hơn ta tưởng đấy)
 
Upvote 0
Nhưng người dùng không muốn thì sao !

Vbavn
Cứ cho là vậy! Nếu là tôi, đàng nào cũng viết code thì tôi sẽ viết sao cho nó thay đổi Format của cell thành mm, sau đó sẽ AutoFilter ---> Có phải ngắn gọn và dể hiểu hơn không? ---> Code cùng lắm chỉ độ 3 dòng
(Nếu cần đến cuối đoạn code sẽ trả mọi thứ về nguyên gốc)
 
Upvote 0
Đây!
Thử tạo 1 file đơn giãn, các bạn xem thế nào nhé:
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$F$1" Then
    With [A1].CurrentRegion
      .Offset(1, 1).Resize(, 1).NumberFormat = "m"
      .AutoFilter 2, Format([F1], "@")
      .Offset(1, 1).Resize(, 1).NumberFormat = "dd/mm/yyyy"
    End With
  End If
End Sub
Cực kỳ dể hiểu, đúng không?
----> Đã làm theo ý bạn: Trả Format cột NGÀY về nguyên mẫu sau khi AutoFilter
 

File đính kèm

Upvote 0
Cứ cho là vậy! Nếu là tôi, đàng nào cũng viết code thì tôi sẽ viết sao cho nó thay đổi Format của cell thành mm, sau đó sẽ AutoFilter ---> Có phải ngắn gọn và dể hiểu hơn không? ---> Code cùng lắm chỉ độ 3 dòng
(Nếu cần đến cuối đoạn code sẽ trả mọi thứ về nguyên gốc)

Anh ơi, theo em thấy, ý của Tác giả đoạn code ở trên là viết code đầy đủ đê xử lý các tình huống.

Vbavn
 
Upvote 0
Chuyện các bác đang bàn là chỉ dành cho Excel 2003 trở về trước thôi nhỉ.
Chứ nếu xài Excel 2007 thì bản thân cái AutoFilter đã có sẵn chuyện lọc theo tháng, theo năm rồi.
 
Upvote 0
Anh ơi, theo em thấy, ý của Tác giả đoạn code ở trên là viết code đầy đủ đê xử lý các tình huống.

Vbavn
Vâng!... tôi không nói code trên sai hoặc dở gì cả (thậm chí có đoạn tôi còn chưa hiểu... ví dụ như cái.. .Parent gì đó)... Chỉ là rất có thể tác giã khi viết code này vẩn chưa từng biết Excel có khả năng AutoFilter theo NGÀY, THÁNG, NĂM ... ???
Chính tôi lúc đầu cũng chưa nghĩ ra... Kiến thức này là học được từ bạn Digita
Nên tôi nghĩ rằng với công cụ có sẳn ta dùng sẽ thuận tiện hơn và dể hiểu hơn cho nhưng tay "bèo" như tôi
Hiiiii
 
Upvote 0
Web KT

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

Back
Top Bottom