Hỏi cách lọc danh sách HS theo lớp

Liên hệ QC

tanlanh

Thành viên mới
Tham gia
15/5/08
Bài viết
14
Được thích
1
Mình có danh sách học sinh của 1 khối, mình muốn trích lọc danh sách theo lớp thì dùng hàm gì hè. Nhờ các anh chị giúp sức.
Bảng dữ liệu như sau: Sheet1 là danh sách học sinh toàn khối, Sheet2 là bảng tổng hợp cần trích lọc theo lớp.
Ở sheet2, nếu ô J5 = 7/1 thì sẽ trích lọc toàn bộ danh sách học sinh lớp 7/1 vào khung dưới.
Và khi thay đổi J5 = 7/2 thì cho ra danh sách của lớp 7/2.
Xin các anh chị giúp mình.
Cảm ơn mọi người rất nhiều.
 

File đính kèm

  • dsach.xls
    67.5 KB · Đọc: 449
Lần chỉnh sửa cuối:
Cái này dùng VLOOKUP cho đơn giản bạn nhé, tham khảo thêm một số bài LỌC trên diễn đàn
 
Lần chỉnh sửa cuối:
Có nhiều cách để trích lọc danh sách bạn có thể dùng hàm INDEX, hoặc dùng Advance filter để lọc
 
Bạn Khang đọc không kỹ đề rồi. Chỉ dùng VLOOKUP được sau khi đã tách riêng ra từng lớp.
Còn để tách ra từng lớp, tôi nghĩ chắc phải dùng VBA mới được.
Vâng, Vlookup chắc không xơi nổi, Em dùng công thức kết hợp với name để lọc !
 

File đính kèm

  • Loc DS lop.rar
    16.1 KB · Đọc: 713
thanks phamnhukhang nhiều nhiều. Mình hỏi thêm là khi trích lọc như vậy mình có thể sắp xếp họ tên theo ABC được không hè.
 
thanks phamnhukhang nhiều nhiều. Mình hỏi thêm là khi trích lọc như vậy mình có thể sắp xếp họ tên theo ABC được không hè.
Nan giải đấy, nếu gộp Lọc và Sort luôn thì hơi căng. Mình sẽ nghiên cứu và cần mọi người trợ giúp thêm !
 
Vâng, Vlookup chắc không xơi nổi, Em dùng công thức kết hợp với name để lọc !

Vào Insert \ Name \ Define trong file của bác em phát hoảng, mượn file của bác em chỉnh sửa chút (chỉ cần duy nhất 2 name), dung lượng file giảm đáng kể [từ 162 KB (166,400 bytes) giảm xuống còn 88.5 KB (90,624 bytes) ]

có thể dùng INDEX + MATCH, hoặc VLOOKUP, hoặc OFFSET
 

File đính kèm

  • boyxin Loc DS lop dung INDEX+MATCH.rar
    13.6 KB · Đọc: 577
Lần chỉnh sửa cuối:
Thêm cách này để tác giả lựa chọn, nhiều khi sử dụng cột phụ cũng đơn giản.
Không hiểu sao file của Boyxin chay nó cứ giật màn hình?
 

File đính kèm

  • LocDS_Thai.rar
    21 KB · Đọc: 406
Nan giải đấy, nếu gộp Lọc và Sort luôn thì hơi căng. Mình sẽ nghiên cứu và cần mọi người trợ giúp thêm !

Nếu gộp Lọc và Sort đúng là nan giải nếu chỉ dùng công thức đặc biệt là sort, có thể dùng phương pháp nào đó sort phần nguồn trước rồi lọc sau thì tính khả thi khi dùng công thức sẽ cao
Nếu nhất thiết phải gộp Lọc và Sort thì dùng VBA thì tính khả thi cao, các bác giúp về phần VBA nhé, VBA thì em mù tịt
 
File đính kèm dùng VBA để lọc và sắp xếp.
 

File đính kèm

  • Loc DS lop_chibi.xls
    67 KB · Đọc: 234
File đính kèm dùng VBA để lọc và sắp xếp.


PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim dong_cuoi As Integer, rg As Range, so_hs As Integer, _
    gt, i As Integer, dong As Integer
    If Target.Address = "$J$6" Then
        gt = Target.Value
        dong_cuoi = Sheets("DS").Range("B65536").End(xlUp).Row
        Set rg = Sheets("DS").Range("C2:C" & dong_cuoi)
        so_hs = Application.WorksheetFunction.CountIf(rg, gt)
        Range("A8:M5000").Clear
        If so_hs = 0 Then Exit Sub
        dong = 8
        For i = 2 To dong_cuoi
            If Sheets("DS").Range("C" & i).Value = gt Then
                Range("A" & dong).Value = dong - 7
                Range("B" & dong & ":M" & dong).Value = _
                Sheets("DS").Range("D" & i & ":O" & i).Value
                dong = dong + 1
            End If
        Next
        dong_cuoi = Range("B5000").End(xlUp).Row
        Range("B8:M" & dong_cuoi).Sort key1:=Columns("C")
    End If
End Sub

Viết cho gọn lại xíu bác ạ. (Những cái gì dùng 1 lần thì không nên đặt biến bác ạ, nếu muốn tìm kiếm xem có tồn tại không nhanh hơn thì nên dùng Match hoặc phương thức Find bác ạ)



PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Target.Address <> "$J$6" Then Exit Sub
    Application.ScreenUpdating = True
    Dim HC As Long, i As Long
    HC = 7
    With Sheet2
        .Range("A8:A10000").ClearContents
        For i = 2 To Sheet1.Range("C65000").End(xlUp).Row
            If Sheet1.Range("C" & i).Value = Target.Value Then
                HC = HC + 1
                .Range("A" & HC).Value = HC - 7
                .Range("B" & HC & ":M" & HC).Value = Sheet1.Range("D" & i & ":O" & i).Value
        Next
        .Range("B8:M" & HC).Sort key1:=Columns("C")
    End If
    Application.ScreenUpdating = False
End Sub
 
Lần chỉnh sửa cuối:
Trước tiên xin được chúc mừng OKeBAP ở đây!
Viết cho gọn lại xíu bác ạ. (Những cái gì dùng 1 lần thì không nên đặt biến bác ạ,

PHP:
1        For i = 2 To Sheet1.Range("C65000").End(xlUp).Row
            If Sheet1.Range("C" & i).Value = Target.Value Then
                HC = HC + 1
                .Range("A" & HC).Value = HC - 7
                .Range("B" & HC & ":M" & HC).Value = Sheet1.Range("D" & i & ":O" & i).Value
        Next
2    Application.ScreenUpdating = False
End Sub
Có 2 vấn đề mà BAP ta khuyên bậy đó, các bạn à:
1*/ Sheet1.Range("C65000").End(xlUp).Row là hoàn toàn không dùng 1 lần đâu; Cứ sau mỗi lần lặp excel sẽ phải kiểm xem đã tới hạn chưa; nếu chưa thì làm tiếp (cũng giống nhu Do . . .Loop vậy thôi);
Nên ta phải
Dim DgCuoi As Long
DgCuoi = Sheet1.Range("C65000").End(xlUp).Row
2*/ Câu lệnh mình đánh số 2 đó là BAP ta hại các bạn sau khi chạy macro cũa BAP đó!
 
Vào Insert \ Name \ Define trong file của bác em phát hoảng, mượn file của bác em chỉnh sửa chút (chỉ cần duy nhất 2 name), dung lượng file giảm đáng kể [từ 162 KB (166,400 bytes) giảm xuống còn 88.5 KB (90,624 bytes) ]

có thể dùng INDEX + MATCH, hoặc VLOOKUP, hoặc OFFSET
Có gì đâu mà hoảng bạn, tớ không thích show ra thì tớ nhé vào name, chẳng qua là cách sử dụng name của mỗi người thôi. Thực ra tớ ko thích dùng cột phụ ở sheet TH, mà ko có cột mã thì không thể VLOOKUP vì sẽ có trường hợp trùng họ tên. Dung lượng file của bạn có giảm nhưng có cái nó cũng giảm theo đấy. +-+-+-++-+-+-++-+-+-+. Tớ thì iu tiên tốc độ !

Không hiểu sao file của Boyxin chay nó cứ giật màn hình?
 
1*/ Sheet1.Range("C65000").End(xlUp).Row là hoàn toàn không dùng 1 lần đâu; Cứ sau mỗi lần lặp excel sẽ phải kiểm xem đã tới hạn chưa; nếu chưa thì làm tiếp (cũng giống nhu Do . . .Loop vậy thôi);
Nên ta phải
Dim DgCuoi As Long
DgCuoi = Sheet1.Range("C65000").End(xlUp).Row

Cảm ơn bác, cái vụ này để em xem lại vì chưa thử nghiệm lại xem cái For... Next (or Do...Loop) có tính lại giá trị sau To hay không. Nhưng chắc là Bác SA mà nói thì là có.
Dù sao cũng cảm ơn bác nhiều.

2*/ Câu lệnh mình đánh số 2 đó là BAP ta hại các bạn sau khi chạy macro cũa BAP đó!

Xin lỗi em nhầm (Trên và dưới, bác nhìn vào cũng biết mà). Đáng lý phải là

. . . .
Application.ScreenUpdating = False

.......
Application.ScreenUpdating = True
..................


Thân!
 
Mọi người hay ghê. Mấy cái vụ trích lọc bằng VBA thì mình chịu, chẳng biết đường nào mà làm.
Hỏi thêm boyxin cái này. Làm thế nào để tạo danh sách các lớp ở ô J6 như đã làm thế hè. Mình làm hoài chẳng được.
 
Cái ô J6 àh bạn ? click vào J6, chọn Data\Validation... Xem tham chiếu của List ở mục Source nhé. Thân !
 
Mọi người hay ghê. Mấy cái vụ trích lọc bằng VBA thì mình chịu, chẳng biết đường nào mà làm.
Hỏi thêm boyxin cái này. Làm thế nào để tạo danh sách các lớp ở ô J6 như đã làm thế hè. Mình làm hoài chẳng được.

Chọn vào cell J6 rồi vào Data \ validation... sẽ thấy mọi điều​
 

File đính kèm

  • boyxin Loc DS lop 01.rar
    13 KB · Đọc: 167
Web KT
Back
Top Bottom