Lọc HS: Lưuban-ThiLại-RènHK

Liên hệ QC

boyxin

Members actively
Tham gia
10/3/08
Bài viết
1,664
Được thích
2,335
Em loay hoay mãi mà chưa làm được. Nhờ các bác xem và xử lý giúp
Nếu dùng công thức thì hay, dung VBA cũng được (dùng VBA em chỉ ngại mấy chương trình diệt virus ở máy cơ quan nó gặm mất thì phí)

Vấn để của em đã nhận được sự giúp đỡ nhiệt tình của các bác trên GPE nên đã được giải quyết xong và được thể hiện trong phần " Hỗ trợ CNLớp THCS - XLHL theo QC 40". Chi tiết tại mục phần chữ ký của em

Nên em xóa tập tin dính kèm trong bài này để giải phóng tài nguyên​
 
Lần chỉnh sửa cuối:
Vấn đề em đưa ra khó quá hay sao mà không thấy ai lên tiếng giúp em 1 tay thế này
 
Nói thật tôi cũng muốn giúp lắm mà nhìn vào ko hiểu gì ráo trọi.. còn các bạn khác thế nào tôi ko biết!
ANH TUẤN
 
Nói thật tôi cũng muốn giúp lắm mà nhìn vào ko hiểu gì ráo trọi.. còn các bạn khác thế nào tôi ko biết!
ANH TUẤN

Thực ra nó là 1 phần trong phần Hỗ trợ công tác CNLớp THCS. Dùng công thức thuần túy cũng làm được nhưng phải làm nhiều cột phụ quá nên muốn nhờ các bác tren GPE giúp đỡ tìm công thức ngắn gọn hoặc dung VBA cũng được để sau này nếu quy chế có thay đổi thì chỉnh sửa dễ dàng hơn

T/B: Menu Sheet Hyperlink không hoạt động khi tên sheet có khoảng trống hoặc tiếng việt có dấu. Liệu có cách nào khắc phục được không?
 
Lần chỉnh sửa cuối:
T/B: Menu Sheet Hyperlink không hoạt động khi tên sheet có khoảng trống hoặc tiếng việt có dấu. Liệu có cách nào khắc phục được không?
Tất nhiên là dc.. cách sửa là làm thế nào đó thêm dấu nháy (') vào tên sheet.. Nhưng tôi khuyên bạn đừng bao giờ dùng cách đặt tên sheet và tên file kiểu vậy (Có khoảng trắng hoặc có dấu tiếng Việt)... Mai này bạn sẽ gặp ko ít rắc rối vì nó đấy!
ANH TUẤN
 
Xài AdvFilter - Trong file đính kèm

Vấn đề em đưa ra khó quá hay sao mà không thấy ai lên tiếng giúp em 1 tay thế này
Macro nó thế ni:
PHP:
Option Explicit
 Dim lRow As Long
 Dim Rng As Range, RngCr As Range, RngDes As Range
 Sub LapDSach()
  ' Macro recorded 4/5/2008 by SA_DQ (GPE.COM);'
  Dim DienHS As String, Xh As String
  Dim DesRow As Long
  
  Xh = Chr(10) & Chr(13):               Sheets("Ca Nam").Select
  lRow = Range("A65432").End(xlUp).Row
  Set Rng = Range("A2:U" & lRow):       Set RngDes = Range("W5:AB5")
  DienHS = "1: Luu Ban;" & Xh & "2: Thi Lai;" & Xh & "3: Ren Hanh Kiem;"
  Application.ScreenUpdating = False
  DienHS = InputBox(DienHS, "BAN CAN LAP DANH SACH NAO?", "1")
  Select Case DienHS
  Case 1
    Range("Z2") = "Y":      Range("AA2") = "Y"
    DesRow = 8:             Sheets("LbTlRhk").Range("C8:C20").ClearContents
  Case 2
    Range("Z2") = "<>Y":    Range("AA2") = "Y"
    DesRow = 24:             Sheets("LbTlRhk").Range("C24:C35").ClearContents
  Case 3
    Range("Z2") = "Y":    Range("AA2") = "<>Y"
    DesRow = 40:            Sheets("LbTlRhk").Range("C40:C49").ClearContents
  End Select
  Set RngCr = Range("W1:AB2")
  AdvFilter
  lRow = Range("X65432").End(xlUp).Row
  Range("X6:X" & lRow).Copy Destination:=Sheets("LbTlRhk").Range("C" & DesRow)
      
  Set Rng = Nothing
  Set RngCr = Nothing:          Set RngDes = Nothing
  Sheets("LbTlRhk").Select
 End Sub
PHP:
Sub AdvFilter()
 Rng.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=RngCr, CopyToRange:=RngDes, Unique:=False
End Sub
 

File đính kèm

  • SaDQ.rar
    19.3 KB · Đọc: 65
Chương trình của bạn chưa tổng quát lắm vì:
- không dùng được cho lớp 9 vì ở lớp 9, GVCN không xét hs ở lại, thi lại, rèn luyện hè...
- Không dùng cho nhiều lớp vì cách bố trí dữ liệu chỉ cho phép mỗi loại :10 hs. Có lớp con số này sẽ lớn hơn.
- không dùng cho nhiều trường vì có trường đòi hỏi báo cáo nhiều loại danh sách hơn. Ví dụ như danh sách học sinh giỏi, tiên tiến hoặc lên lớp thẳng...
Mình làm tạm theo sự bố trí dữ liệu của bạn. Có thể bỏ phần VBA đi, lọc dữ liệu theo công thức. Bạn nghiên cứu theo đường dẫn sau đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=9158
 

File đính kèm

  • LBTLRHKiem.rar
    16.9 KB · Đọc: 70
Bổ sung phần liệt kê các môn kiểm tra lại

PHP:
Option Explicit
 Dim lRow As Long
 Dim Rng As Range, RngCr As Range, RngDes As Range
 Sub LapDSach()
  ' Macro recorded 4/5/2008 by SA_DQ (GPE.COM);'
  Dim DienHS As String, Xh As String
  Dim DesRow As Long
  
  Xh = Chr(10) & Chr(13):               Sheets("Ca Nam").Select
  lRow = Range("A65432").End(xlUp).Row
  Set Rng = Range("A2:U" & lRow):       Set RngDes = Range("W5:AB5")
  DienHS = "1: Luu Ban;" & Xh & "2: Thi Lai;" & Xh & "3: Ren Hanh Kiem;"
  Application.ScreenUpdating = False
  DienHS = InputBox(DienHS, "BAN CAN LAP DANH SACH NAO?", "A")
  DienHS = UCase$(DienHS)
  Select Case DienHS
  Case "A"
    Range("Z2") = "Y":      Range("AA2") = "Y"
    DesRow = 8:             Sheets("LbTlRhk").Range("C8:C20").ClearContents
  Case "B"
    Range("Z2") = "<>Y":    Range("AA2") = "Y"
    DesRow = 24:             Sheets("LbTlRhk").Range("C24:C35").ClearContents
  Case "C"
    Range("Z2") = "Y":    Range("AA2") = "<>Y"
    DesRow = 40:            Sheets("LbTlRhk").Range("C40:C49").ClearContents
  End Select
  Set RngCr = Range("W1:AB2")
  Rng.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=RngCr, _
        CopyToRange:=RngDes, Unique:=False
        
2 'Chon Trong Cac Mon Kiem Tra Lai'
  Dim RowTL As Long, jW As Long, JZ As Long
  Dim MonThi As String, HoTen As String
  
  RowTL = Range("X65432").End(xlUp).Row
  If DienHS = "B" Then
    For jW = 6 To RowTL
        With Cells(jW, 24)
            HoTen = .Value
            For JZ = 3 To lRow
                If Cells(JZ, 2) = HoTen Then
                    Set Rng = Cells(JZ, 2).Offset(, 1).Resize(1, 13)
                    For Each RngDes In Rng
                        If RngDes < 5 Then _
                            MonThi = MonThi & Cells(2, RngDes.Column) & "; "
                    Next RngDes
                    .Offset(, 5) = MonThi:      MonThi = ""
                End If
                
            Next JZ
        End With
    Next jW
  End If
  
  Range("X6:X" & RowTL).Copy Destination:=Sheets("LbTlRhk").Range("C" & DesRow)
  If DienHS = "B" Then _
  Range("AC6:AC" & RowTL).Copy Destination:=Sheets("LbTlRhk").Range("E" & DesRow)
  Set Rng = Nothing
  Set RngCr = Nothing:              Set RngDes = Nothing
  Sheets("LbTlRhk").Select:         Range("C" & DesRow).Select
  
 End Sub
 
Chương trình của bạn chưa tổng quát lắm vì:
- không dùng được cho lớp 9 vì ở lớp 9, GVCN không xét hs ở lại, thi lại, rèn luyện hè...
- Không dùng cho nhiều lớp vì cách bố trí dữ liệu chỉ cho phép mỗi loại :10 hs. Có lớp con số này sẽ lớn hơn.
- không dùng cho nhiều trường vì có trường đòi hỏi báo cáo nhiều loại danh sách hơn. Ví dụ như danh sách học sinh giỏi, tiên tiến hoặc lên lớp thẳng...
Mình làm tạm theo sự bố trí dữ liệu của bạn. Có thể bỏ phần VBA đi, lọc dữ liệu theo công thức. Bạn nghiên cứu theo đường dẫn sau đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=9158

Rất cảm ơn bạn đã góp ý chân thành
- Đây chỉ là 1 phần Hỗ trợ cho GVCN THCS này thôi, mỗi lớp làm 1 file (không thiết kế 1 file cho nhiều lớp) nhưng các lớp 6-7-8-9 đều có thể dùng và GVCN rất nhàn đặc biệt là trong việc lập các biểu mẫu báo cáo
- Mình xét thấy 1 lớp ở THCS trong giai đoạn hiện nay mỗi loại hs ở lại, thi lại, rèn luyện hè để 10 HS là quá nhiều (nhưng vì để trang in đẹp nên làm vậy)
- Xin ghi nhận riêng trường hợp lớp 9, GVCN không xét hs ở lại, thi lại, rèn luyện hè... nhưng chỉ là vấn đề nhỏ (hầu như các trường đều tạo điều kiện cho HS lớp 9 đủ điều kiện xét TN)

... lọc dữ liệu theo công thức...
Hiện tại mình dùng công thức nhưng phải dùng nhiều cột phụ, khi quy ché thay đổi thì chỉnh sửa hơi ngại nên muốn len GPE nhờ mọi người giúp đỡ

t/b
- không dùng cho nhiều trường vì có trường đòi hỏi báo cáo nhiều loại danh sách hơn. Ví dụ như danh sách học sinh giỏi, tiên tiến hoặc lên lớp thẳng...
phần này sheet khenthuong
1- bạn xem qua phần này Hỗ trợ cho GVCN THCS rồi góp ý thêm cho mình để mình hoàn thiện tiếp nha
2- Mình muốn khi chọn sheet nào thì nó hiện, còn các sheet khác ẩn đi (trừ sheet đầu tiên) mà không ảnh hưởng đến truy xuất dữ liệu thì phải làm thế nào?
 
Lần chỉnh sửa cuối:
Không có số ngày nghĩ làm sao xét lên lớp, ở lại, thi lại ?
Mã:
Điều 14. Xét cho lên lớp hoặc không được lên lớp

1. Học sinh có đủ các điều kiện dưới đây [B]thì được lên lớp[/B]:
...
b) [B]Nghỉ không quá 45 buổi học trong một năm học[/B] (nghỉ có phép hoặc không phép, nghỉ liên tục hoặc nghỉ nhiều lần cộng lại).

2. Học sinh thuộc 1 trong các trường hợp dưới đây thì [B]không được lên lớp[/B]:(Lưu ban)
a) [B]Nghỉ quá 45 buổi học trong năm học[/B] (nghỉ có phép hoặc không phép, nghỉ liên tục hoặc nghỉ nhiều lần cộng lại);
...
 
Không có số ngày nghĩ làm sao xét lên lớp, ở lại, thi lại ?
Điều 14. Xét cho lên lớp hoặc không được lên lớp

1. Học sinh có đủ các điều kiện dưới đây thì được lên lớp:
...
b) Nghỉ không quá 45 buổi học trong một năm học (nghỉ có phép hoặc không phép, nghỉ liên tục hoặc nghỉ nhiều lần cộng lại).

2. Học sinh thuộc 1 trong các trường hợp dưới đây thì không được lên lớp:(Lưu ban)
a) Nghỉ quá 45 buổi học trong năm học (nghỉ có phép hoặc không phép, nghỉ liên tục hoặc nghỉ nhiều lần cộng lại);
...
Xin cảm ơn bạn đã góp ý

Bạn xem lại trong Hỗ trợ CNLớp THCS - XLHL theo QC 40 (vùng nông thôn) các sheet hocky1, hocky1,canam mình có để cột cuối để ghi số ngày nghỉ học đó mà. Bạn thử lấy 1 ví dụ rồi cho nó nghỉ học quá 45 ngày xem có được lên lớp không nhé
 
Lần chỉnh sửa cuối:
Em loay hoay mãi mà chưa làm được. Nhờ các bác xem và xử lý giúp
Nếu dùng công thức thì hay, dung VBA cũng được (dùng VBA em chỉ ngại mấy chương trình diệt virus ở máy cơ quan nó gặm mất thì phí)
Hàm xét lên lớp, xét danh hiệu
Mã:
Function XetLenLop(vang As Integer, hocluc As String, hanhkiem As String) As String
If vang > 45 Or hocluc = "Kém" Or (hocluc = "Y" And hanhkiem = "Y") Then
  XetLenLop = "L" & ChrW(432) & "u ban"
ElseIf hocluc = "Y" And (hanhkiem = "G" Or hanhkiem = "K" Or hanhkiem = "TB") Then
  XetLenLop = "Thi l" & ChrW(7841) & "i"
ElseIf hanhkiem = "Y" And (hocluc = "G" Or hocluc = "K" Or hocluc = "TB") Then
  XetLenLop = "RLHK"
Else
  XetLenLop = "Lên l" & ChrW(7899) & "p"
End If
End Function

Mã:
Function DanhHieu(vang As Integer, hocluc As String, hanhkiem As String) As String
If vang <= 45 And (hocluc = "G" Or hocluc = "K" Or hocluc = "TB") And (hanhkiem = "T" Or hanhkiem = "K" Or hanhkiem = "TB") Then
  If hocluc = "G" And hanhkiem = "T" Then
    DanhHieu = "HSG"
  ElseIf (hocluc = "G" Or hocluc = "K") And (hanhkiem = "T" Or hanhkiem = "K") Then
    DanhHieu = "HSTT"
  End If
End If
End Function
Chú ý các hàm này sử dụng font unicode

Loc danh sách lưu ban, thi lại, rèn luyện hạnh kiểm
Mã:
Sub LocDanhSach()
Dim cn As Object
Set cn = Sheets("Ca nam")
rc = cn.Cells(2, 1).End(xlDown).Row
Sheets("LuuBan-ThiLai-RenHK").Select
Range("B8:H17,B24:H33,B40:H49").ClearContents
rlb = 8
rtl = 24
rhk = 40
For r = 3 To rc
  loai = cn.Cells(r, 22)
  If loai <> "Len lop" Then
    Select Case loai
    Case "L" & ChrW(432) & "u ban"
      Cells(rlb, 2) = rlb - 7
      Cells(rlb, 3) = cn.Cells(r, 2)
      rlb = rlb + 1
    Case "Thi l" & ChrW(7841) & "i"
      diemtb = ""
      Cells(rtl, 2) = rtl - 23
      Cells(rtl, 3) = cn.Cells(r, 2)
      For c = 3 To 15
        dtb = cn.Cells(r, c)
        If dtb < 5 And dtb <> "" Then
          diemtb = diemtb & cn.Cells(2, c) & "  "
        End If
      Next
      Cells(rtl, 5) = diemtb
      rtl = rtl + 1
    Case "RLHK"
      a = 0
      Cells(rhk, 2) = rhk - 39
      Cells(rhk, 3) = cn.Cells(r, 2)
      rhk = rhk + 1
    End Select
  End If
Next
End Sub
 

File đính kèm

  • Help LocHS LuuBan-Thilai-RenHK.zip
    24.2 KB · Đọc: 45
Hàm xét lên lớp, xét danh hiệu
Mã:
Function XetLenLop(vang As Integer, hocluc As String, hanhkiem As String) As String
If vang > 45 Or hocluc = "Kém" Or (hocluc = "Y" And hanhkiem = "Y") Then
  XetLenLop = "L" & ChrW(432) & "u ban"
ElseIf hocluc = "Y" And (hanhkiem = "G" Or hanhkiem = "K" Or hanhkiem = "TB") Then
  XetLenLop = "Thi l" & ChrW(7841) & "i"
ElseIf hanhkiem = "Y" And (hocluc = "G" Or hocluc = "K" Or hocluc = "TB") Then
  XetLenLop = "RLHK"
Else
  XetLenLop = "Lên l" & ChrW(7899) & "p"
End If
End Function

Mã:
Function DanhHieu(vang As Integer, hocluc As String, hanhkiem As String) As String
If vang <= 45 And (hocluc = "G" Or hocluc = "K" Or hocluc = "TB") And (hanhkiem = "T" Or hanhkiem = "K" Or hanhkiem = "TB") Then
  If hocluc = "G" And hanhkiem = "T" Then
    DanhHieu = "HSG"
  ElseIf (hocluc = "G" Or hocluc = "K") And (hanhkiem = "T" Or hanhkiem = "K") Then
    DanhHieu = "HSTT"
  End If
End If
End Function
Chú ý các hàm này sử dụng font unicode

Loc danh sách lưu ban, thi lại, rèn luyện hạnh kiểm
Mã:
Sub LocDanhSach()
Dim cn As Object
Set cn = Sheets("Ca nam")
rc = cn.Cells(2, 1).End(xlDown).Row
Sheets("LuuBan-ThiLai-RenHK").Select
Range("B8:H17,B24:H33,B40:H49").ClearContents
rlb = 8
rtl = 24
rhk = 40
For r = 3 To rc
  loai = cn.Cells(r, 22)
  If loai <> "Len lop" Then
    Select Case loai
    Case "L" & ChrW(432) & "u ban"
      Cells(rlb, 2) = rlb - 7
      Cells(rlb, 3) = cn.Cells(r, 2)
      rlb = rlb + 1
    Case "Thi l" & ChrW(7841) & "i"
      diemtb = ""
      Cells(rtl, 2) = rtl - 23
      Cells(rtl, 3) = cn.Cells(r, 2)
      For c = 3 To 15
        dtb = cn.Cells(r, c)
        If dtb < 5 And dtb <> "" Then
          diemtb = diemtb & cn.Cells(2, c) & "  "
        End If
      Next
      Cells(rtl, 5) = diemtb
      rtl = rtl + 1
    Case "RLHK"
      a = 0
      Cells(rhk, 2) = rhk - 39
      Cells(rhk, 3) = cn.Cells(r, 2)
      rhk = rhk + 1
    End Select
  End If
Next
End Sub

Rất cảm ơn bác phamduylong đã giúp đỡ

- Phần trích ra HS thi lại, đã ghi được các môn có điểm TB < 5 rồi, có thể bổ xung cả điểm cụ thể được không? (mon1=ĐTBmôn1; mon2=ĐTBmon2 ...)
- Liệu có thể dùng hàm, công thức để trích rút ra HS lưuban-thilại-rènHK hay không? giống như hàm vlookup, index+match, offset ...
- Lọc thế này, mỗi khi có sự thay đổi lại phải chạy macro có vẻ như hơi phiền phức
 
Lần chỉnh sửa cuối:
. . . .
- Liệu có thể dùng hàm, công thức để trích rút ra HS lưuban-thilại-rènHK hay không? giống như hàm vlookup, index+match, offset ...

Có thể dùng hàm mảng tự tạo để rút ra các danh sách, hay danh sách toàn bộ nói trên; Hãy tìm kiếm loại hàm DVLOOKUP() trên diễn đàn để tham khảo nha! Nếu xuất hiện khó khăn sẽ có người giúp.
 
- Phần trích ra HS thi lại, đã ghi được các môn có điểm TB < 5 rồi, có thể bổ xung cả điểm cụ thể được không? (mon1=ĐTBmôn1; mon2=ĐTBmon2 ...)
Bạn thay đoạn code này:
Mã:
Case "Thi l" & ChrW(7841) & "i"
  diemtb = ""
  Cells(rtl, 2) = rtl - 23
  Cells(rtl, 3) = cn.Cells(r, 2)
  For c = 3 To 15
    dtb = cn.Cells(r, c)
    If dtb < 5 And dtb <> "" Then
      [COLOR=blue]diemtb = diemtb & cn.Cells(2, c) & "  "[/COLOR]
    End If
  Next
  Cells(rtl, 5) = diemtb
  rtl = rtl + 1
bằng đoạn này:
Mã:
Case "Thi l" & ChrW(7841) & "i"
  diemtb = ""
  Cells(rtl, 2) = rtl - 23
  Cells(rtl, 3) = cn.Cells(r, 2)
  For c = 3 To 15
    dtb = cn.Cells(r, c)
    If dtb < 5 And dtb <> "" Then
      [COLOR=red]diemtb = diemtb & cn.Cells(2, c) & ":" & dtb & "   "
[/COLOR]    End If
  Next
  Cells(rtl, 5) = diemtb
  rtl = rtl + 1
 
Bạn thay đoạn code này:
Mã:
Case "Thi l" & ChrW(7841) & "i"
  diemtb = ""
  Cells(rtl, 2) = rtl - 23
  Cells(rtl, 3) = cn.Cells(r, 2)
  For c = 3 To 15
    dtb = cn.Cells(r, c)
    If dtb < 5 And dtb <> "" Then
      [COLOR=blue]diemtb = diemtb & cn.Cells(2, c) & "  "[/COLOR]
    End If
  Next
  Cells(rtl, 5) = diemtb
  rtl = rtl + 1
bằng đoạn này:
Mã:
Case "Thi l" & ChrW(7841) & "i"
  diemtb = ""
  Cells(rtl, 2) = rtl - 23
  Cells(rtl, 3) = cn.Cells(r, 2)
  For c = 3 To 15
    dtb = cn.Cells(r, c)
    If dtb < 5 And dtb <> "" Then
      [COLOR=red]diemtb = diemtb & cn.Cells(2, c) & ":" & dtb & "   "[/COLOR]
    End If
  Next
  Cells(rtl, 5) = diemtb
  rtl = rtl + 1
Một lần nữa cảm ơn bác rất nhiều

Em khoái dùng hàm hơn dùng Macrô
vì dùng hàm thì dữ liệu cập nhật ngay còn Macrô thì sau khi chạy nó mới cho kết quả.
Bác có thể chuyển cái đoạn mã đó dưới dạng 1 Function được không?

Em đã viết được hàm hiện đủ tên rồi, nhưng còn phần liệt kê điểm thì thấy khó quá
Tập tin đính kèm: Download Here! <-Help me
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom