Chia lớp theo học lực
Hiện tại e đang phải làm công tác trộn một danh sách học sinh khối 6 cũ thành 7 lớp mới khác nhau sao cho mỗi lớp đều có HS có học lực Giỏi, Khá, TB đều nhau (Các loại học lực không giống nhau với lớp cũ). Mong được sự giúp đỡ của anh chị chứ e ngồi làm thủ công biết khi nào xong. Em cám ơn trước.
Bạn thử code này.
Option Explicit
Private Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long)
On Error Resume Next
If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
With CreateObject("Scripting.Dictionary")
Do
.Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
Loop Until .Count = Amount
UniqueRandomNum = .Keys
End With
End Function
Private Function LayDS(Rng As Range, Optional aCot = 5, Optional LOAI As String = "Trung bình")
Dim aRow%, aCol%, i&, j&, k&
Dim Arr, TempDes, Des, TT
aRow = Rng.Rows.Count: aCol = Rng.Columns.Count
Arr = Rng.Value
aRow = UBound(Arr, 1): aCol = UBound(Arr, 2)
ReDim TempDes(1 To aRow, 1 To aCol + 2)
For i = 1 To aRow
If Arr(i, aCot) = LOAI Then
k = k + 1: TempDes(k, 1) = k
For j = 1 To aCol
TempDes(k, j + 1) = Arr(i, j)
Next j
End If
Next i
If k = 0 Then Exit Function
TT = UniqueRandomNum(1, k, k)
ReDim Des(1 To k, 1 To aCol + 2)
aCol = UBound(TempDes, 2)
For i = 1 To k
For j = 1 To aCol
If j = aCol Then
Des(i, j) = TT(i - 1)
Else
Des(i, j) = TempDes(i, j)
End If
Next j
Next i
LayDS = Des
End Function
Private Function WorksheetExists(shtName As String, Optional wb As Workbook) As Boolean
Dim sht As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set sht = wb.Sheets(shtName)
On Error GoTo 0
WorksheetExists = Not sht Is Nothing
End Function
Private Function TachDS(DS, SL As Integer, aIndex As Integer, TT As Integer)
Dim i%, j%, k%, Max%, Des
k = 0: Max = SL + aIndex - 1
If Max > UBound(DS, 1) Then Max = UBound(DS, 1)
ReDim Des(1 To (Max - aIndex + 1), 1 To UBound(DS, 2))
For i = aIndex To Max
k = k + 1: Des(k, 1) = TT + k - 1
For j = 2 To UBound(DS, 2)
Des(k, j) = DS(CInt(DS(i, 7)), j - 1)
Next j
Next i
TachDS = Des
End Function
Sub ChiaLop()
Const SOLOP = 7
Dim sh As Worksheet, DS(1 To 3) As Variant, TENLOP, LOAI, i%, j%
Dim Rng As Range, SoHS%, ViTri%, TT%, TTLoai%, aStep%
Dim Tach_DS
TENLOP = Array("LOP1", "LOP2", "LOP3", "LOP4", "LOP5", "LOP6", "LOP7")
LOAI = Array("Gi" & ChrW(7887) & "i", "Khá", "Trung bình")
Set Rng = Sheet1.Range("C10:G" & Sheet1.Range("G10000").End(xlUp).Row)
SoHS = Rng.Rows.Count SOLOP
For i = 1 To 3
DS(i) = LayDS(Rng, , CStr(LOAI(i - 1)))
Next i
For i = LBound(TENLOP) To UBound(TENLOP)
If WorksheetExists(CStr(TENLOP(i))) Then
Application.DisplayAlerts = False
ThisWorkbook.Sheets(CStr(TENLOP(i))).Delete
Application.DisplayAlerts = True
End If
ThisWorkbook.Sheets("Sheet1").Copy after:=Sheets(Sheets.Count)
Set sh = ThisWorkbook.Sheets(Sheets.Count)
sh.Name = CStr(TENLOP(i))
sh.Range("A10:G10").Resize(Rng.Rows.Count).ClearContents
TT = 1
For j = 1 To 3
ViTri = UBound(DS(j), 1) SOLOP
TTLoai = ViTri: aStep = ViTri
If UBound(DS(j), 1) Mod SOLOP > i Then
ViTri = i * (ViTri + 1) + 1
TTLoai = TTLoai + 1
Else
ViTri = i * (ViTri + 1)
End If
Tach_DS = TachDS(DS(j), TTLoai, ViTri, TT)
If IsArray(Tach_DS) Then
sh.Range("A9:G10").Offset(TT).Resize(UBound(Tach_DS, 1)).Value = Tach_DS
TT = TT + UBound(Tach_DS, 1)
End If
Next j
Next i
End Sub
Còn vụ Nam Nữ thì đợi anh @bebo021999 giúp vậy.
www.giaiphapexcel.com/diendan/threads/chia-l%E1%BB%9Bp-theo-h%E1%BB%8Dc-l%E1%BB%B1c.161575/#post-1079214
Bạn siêu thật. Ngần ấy giải thuật và code mà hoàn thành dưới 10 phút. :p
Giải thuật làm tay (dùng để viết code cũng được)
Bước 1: Tạo danh sách A gồm tất cả học sinh lớp 6 cũ gồm mã, tên, học lực, giới tính (và cả tiêu chí "cân bằng" khác)
Bước 2: Sort danh sách A theo tuần tự các tiêu chí "cân bằng": học lực, giới tính
Bước 3: Filter học lực giỏi + nam, đếm. Kết quả đếm chia 7 lấy tròn được n
Bước 4: copy n dòng đầu bỏ vào lớp 7-1, n dòng kế vào lớp 7-2, … còn bao nhiêu dồn hết cho 7-7
Bước 5: Filter học lực giỏi + nữ, lại đếm, lại chia, lại copy paste
Các bước tiếp theo: tương tự Bước 3 và 4 với học lực khá + nam, học lực khá + nữ, học lực TB + nam, học lực TB + nữ, … đến hết
————Tôi viết bài này mất dưới 10 phút, làm tay cũng dưới 10 phút, nhưng nếu viết code, test tiếc cẩn thận nhiều trường hợp, … sẽ mất 60 phút trở lên. Thế nên tôi không viết code vì 1 giờ của tôi giá bèo bèo cũng 200.000 đVN, đủ uống cafe và thuốc lá 5 ngày.
Giải thuật của tôi thì vầy:
1. Sort theo học lực.
2. Rải random 1-7 vào 1 cột phụ. Cứ hết 7 dòng thì lại rải tiếp 7 dòng kế.
3. Sort theo cột phụ.
4. Lấy ra: 1 là lớp 1, 2 là lớp 2, … đến lớp 7
Bảo đảm gần như xếp theo ngẫu nhiên, không phân biệt giới tính. Nếu muốn giới tính thì cộng 1/10 điểm học lực cho Nữ.
"Rải" random có vẻ đơn giản như rải thóc ra sân cho gà ăn nhỉ?
Làm cái Random mà không bị trùng là cả 1 vấn đề.
Còn giải thuật của tôi thì như vậy:
1. Rải Rand() trên cột phụ.
2. Sort theo học lực, giới tính, cột phụ
3. Xóa Rand. Rải lần lươt 1-7 vào 1 cột này. Cứ hết 7 dòng thì lại rải tiếp 7 dòng kế.
4. Sort theo cột phụ.
Xong.
Giải thuật nào cũng phải test nhiều trường hợp: Đơn cử trường hợp học sinh yếu chỉ có 3 (hoặc số bất kỳ <7), trường hợp 3 học sinh yếu này lại có toàn nam/ nữ hoặc 1 nam 4 nữ, 1 nữ 5 nam, … Thậm chí số lớn hơn 7 (trong khoảng 8 – 15) nhưng nam 12, nữ 3, …
Trường hợp khác là thêm tiêu chí phân lớp như yêu/ ghét 2 cấp độ, giàu/ nghèo 3 cấp độ. Lỡ 3, 4 em "chết tiệt con" cùng học lực, cùng giới tính dồn hết vào 1 lớp.
Cho nên viết code thì dễ, test mới khó. Mà test xong có khi phải viết lại code từ đầu!
Tương đối thôi. Chứ khó nhìn trước mọi khía cạnh.
Test thì cũng phải biết mình muốn (tránh) cái gì. Vả lại, dữ liệu học kỳ này đâu giống kỳ tới. Người không có kinh nghiệm test có thể thấy code rất ngon lần này nhưng lần tới thì bét nhè.
Điển hình, điều kiện tên đâu có hề được xét. Việc lớp 1 có 5 tên Hùng và lớp 2 có 7 tên Dũng rất có thể xảy ra.
Tôi vào trường Pétrus Ký vào khoảng giữa thập niên 60's. Phải nói là Ban Giám Hiệu trường lúc ấy xếp 11 lớp đệ Thất (lớp 6 bi giờ) quá hay. Cũng rải đều điểm thi vào trường, cũng chia tên cho đều. Thời ấy làm quái gì có máy tính, chỉ dùng mấy mẫu giấy ghi tên và điểm mà chả thấy ai than "thủ công". Vấn đề chỉ là biết cách làm hay không thôi.
Họ cũng phải có 1 thuật toán.
Hình như trước 75, trường công luôn luôn là trường 1 giới tính thì phải. Lúc tôi thi lớp 6 (1972), Hồ Ngọc Cẩn, Võ Trường Toản, là trường toàn nam sinh. Nữ sinh thì thi Gia Long và Trưng Vương.
Cách khác xét trùng tên
1. Tạo cột phụ là tên học sinh.
2. Sort theo học lực, giới tính, cột phụ
3. Xóa tên, rải Rand 1-7 vào 7 dòng đầu cột phụ. Cứ hết 7 dòng thì lại rải tiếp 7 dòng kế.
4. Sort theo cột phụ.
Cảm ơn bác nhiều nhé, Code chạy quá OK.
Nếu như muốn chia 6 lớp thì sửa code sao bác?1. Thường thường chứ không hẳn luôn luôn.
– Trường Mạc Đỉnh Chi là Nam Nữ.
– Ngày xưa, Ban Toán gọi là Ban B. Không phải trường nữ nào cũng có Ban B ở lớp 12. Trưng Vương nổi tiếng là do người ta "gán" cái mã "Bắc kỳ". Chứ thực sự thì trường này không lớn lắm. Không có Ban B cho lớp 12 (*1). Tôi nhớ thì còn nhỏ hơn Lê Văn Duyệt. Chú thích: trường "đối" với Trưng Vương là Chu Văn An – người ta thậm chí còn đồn rằng nó là trường Bưởi ngoài ấy.
– Ngày xưa học xong lớp 11 (tiếng cũ gọi là đệ Nhị) thì thi Tú tài 1. Đậu xong bằng Tú tài 1 này thì người ta có thể chuyển trường để học tiếp lớp 12 (đệ Nhất). Điển hình Ban D (Cổ Văn) chỉ dạy ở trường Pétrus Ký. Nam nữ gì muốn học đều phải chuyển qua trường này.
– Nhiều trường nữ ở tỉnh thành thiếu lớp. Điển hình ở Mỹ tho, các nữ sinh Lê Ngọc Hân muốn học lên cao thì phải chuyển sang học chung với nam, trường Nguyễn Đình Chiểu.(*1) Mấy năm cuối thập niên 60's. Mấy chị Trưng Vương vẫn tranh đấu đòi mở thêm lớp 12 cho ban B. Nhưng mấy chị vẫn không đạt đủ con số đỗ Tú tài 1 Ban B để mở lớp. Ngày xưa đậu Tú tài khó giàn trời. Quên mất qua thập niên 70's thì đạt chưa.
Bài 1 "thành 7 lớp mới", giờ biến thànhh 6 rồi.
———
Bài 7 tưởng hỏi vô nghĩa (hỏi "số lớp vẫn không đổi đúng không?") trong khi bài 1 yêu cầu rõ là "7 lớp mới", té ra lại là câu tiên đoán đúng phóc.
Không hẳn luôn cố định bạn. Tuỳ trường hợp do quy định mà nhà trường đó vẫn giữ nguyên số lớp (7->7), hoặc phải ép lớp (7->6) hoặc giãn lớp (6->7).
Trong yêu cầu mong muốn của mình là chia thành 7 lớp bảy mới, nhưng mình đã quên mất là lớp 6A1 mình đã bỏ ra ngoài danh sách trên rồi (vì lớp này giữ nguyên không trộn với các lớp khác) nên chỉ có từ 6A2–>6A7 thôi (6 lớp mới+6A1 là 7 lớp).
Mong các bác thông cảm vì sự cố nhầm lẫn này (Chắc do hậu Covid. Hihi).
6 lớp 7 mới + 7A1 chứ? Lại nhầm lẫn rồi.
Lớp 6A1 lên 7A1 không trộn chắc con nhà đặc biệt à?
BX mình là GV nên hiểu chuyện này.
Mỗi khối đều có lớp chọn, gọi là "gà".
Dùng để khi có đoàn kiểm tra cấp trên xuống dự giờ thì đem gà ra đá.
Ở Việt Nam có thể đối phó kiểu đó chứ ở nơi khác thì khó. Vợ tôi cũng là giáo viên. Có 2 "cấp" kiểm tra: ban giám hiệu kiểm tra giáo viên bất kỳ, và thanh tra cấp trên kiểm tra lớp bất kỳ với giáo viên bất kỳ. Ban giám hiệu nhà trường đầu năm làm một danh sách cần kiểm tra những giáo viên nào trong năm học. Các giáo viên được gọi tên phải làm việc với ban giám hiệu và thống nhất ngày giờ dự lớp. Cấp nữa là đại diện của đơn vị giám sát (không là bộ phận của UBND mà là bộ phận của hệ thống giáo dục). Thanh tra có quyền chọn lớp bất kỳ. Vậy là không thể có gà được. Thanh tra mà vào đúng lớp có học sinh hư thì lộ ra hết bởi nhiều học sinh này cố tình "chứng tỏ mình" bằng cách "hư" khi thanh tra dự lớp: nói chuyện, nghịch di động, ném giấy, thậm chí đánh bạn. Những học sinh này tất nhiên sẽ nhận được điểm đánh giá trong "học bạ" kém, nhưng chả đứa nào ngại. Kiểu như phạm nhân ấy: càng nhiều "chiến tích" thì càng được các bạn tù nể phục và tôn là đại ca. 😀
Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM
Khóa học “Thiết kế Tổng phần thưởng (Total Reward) chuẩn khung SHRM” giúp bạn nắm vững toàn bộ hệ thống đãi ngộ theo chuẩn...
Xem khóa học
Bình luận