Tạo nhóm ngẫu nhiên theo nhiều điều kiện

Liên hệ QC

nguyen6571gpex

Thành viên thường trực
Tham gia
22/4/11
Bài viết
270
Được thích
79
Nghề nghiệp
Dạy học
Chào các bạn thành viên GPE! Chúc các bạn ngày mới an lành!
Nhờ các bạn code như sau:
Mình có một danh sách học sinh (khoảng 150 học sinh) với một số trường dữ liệu (sheet TachHoTen). Dữ liệu được thống kê và chia ra theo bảng thống kê . Số liệu thống kê có thể được thay đổi tùy theo từng đợt khác nhau. Mong muốn tạo nhóm ngẫu nhiên theo số liệu thống kê cho trước (chi tiết cụ thể trong file đính kèm)
Trân trọng cảm ơn!
 

File đính kèm

  • Chia lop 1_GPE.xlsx
    76 KB · Đọc: 27
Chào các bạn thành viên GPE! Chúc các bạn ngày mới an lành!
Nhờ các bạn code như sau:
Mình có một danh sách học sinh (khoảng 150 học sinh) với một số trường dữ liệu (sheet TachHoTen). Dữ liệu được thống kê và chia ra theo bảng thống kê . Số liệu thống kê có thể được thay đổi tùy theo từng đợt khác nhau. Mong muốn tạo nhóm ngẫu nhiên theo số liệu thống kê cho trước (chi tiết cụ thể trong file đính kèm)
Trân trọng cảm ơn!
Chào các bạn thành viên GPE! Chúc các bạn ngày mới an lành, nhiều năng lượng tốt!
Mình hỏi câu này không có ý thúc giục nhé. Bài toán này không biết liệu có lời giải không?
 
Upvote 0
Chào các bạn thành viên GPE! Chúc các bạn ngày mới an lành, nhiều năng lượng tốt!
Mình hỏi câu này không có ý thúc giục nhé. Bài toán này không biết liệu có lời giải không?
Theo như chỉ dẫn trong file: số liệu trong các bảng của sheet "Chia" là được cho trước à bạn?

Số lượng học sinh toàn bộ có thể là bao nhiêu?
 
Upvote 0
Chào các bạn thành viên GPE! Chúc các bạn ngày mới an lành!
Nhờ các bạn code như sau:
Mình có một danh sách học sinh (khoảng 150 học sinh) với một số trường dữ liệu (sheet TachHoTen). Dữ liệu được thống kê và chia ra theo bảng thống kê . Số liệu thống kê có thể được thay đổi tùy theo từng đợt khác nhau. Mong muốn tạo nhóm ngẫu nhiên theo số liệu thống kê cho trước (chi tiết cụ thể trong file đính kèm)
Trân trọng cảm ơn!
Kiểm tra lại . . .
Mã:
  Option Explicit
  Option Compare Text
  Dim arr(), aLop(), aBT(), res(), sRow&, n&
 
Sub xyz()
  Dim aDB(), i&, j&, dt$

  With Sheets("TachHoTen")
    arr = .Range("I5:O" & .Range("F" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 1)
  With Sheets("Chia")
    aLop = .Range("B3:L3").Value
    aBT = .Range("B5:L13").Value
    aDB = .Range("B16:L20").Value
  End With
  n = 0
  For i = 1 To UBound(aDB) 'Doi tuong dac biet
    dt = Trim(aDB(i, 1))
    Call Db(aDB, dt, i, 1, 7) 'xep Nu HS
    Call Db(aDB, dt, i, 0, 7) 'xep HS
  Next i
  For i = 1 To UBound(aBT) 'Doi tuong bình thuong
    dt = Trim(aBT(i, 1))
    Call Db(aBT, dt, i, 1, 4) 'xep Nu HS
    Call Db(aBT, dt, i, 0, 4) 'xep HS
  Next i
  Sheets("TachHoTen").Range("Q5").Resize(sRow, 1).ClearContents
  If n = sRow Then Sheets("TachHoTen").Range("Q5").Resize(sRow, 1) = res
End Sub

Sub Db(aT, dt, i, ByVal d&, ByVal col&)
  Dim S, a, hs$, r&, r2&, j&, c&, k&, id&
 
  For r = 1 To sRow
    If Trim(arr(r, col)) = dt Then
      If d = 0 Or arr(r, 1) = 1 Then hs = hs & "," & r
    End If
  Next r
  If hs <> Empty Then
    S = Split(hs, ",")
    a = UniqueRand(UBound(S))
    For j = 4 + d To UBound(aT, 2) Step 2
      If aT(i, j) > 0 Then
        For c = 1 To aT(i, j)
          If k < UBound(S) Then k = k + 1 Else k = 1
          id = S(a(k))
          If col = 7 Then 'Doi tuong dac biet
            For r2 = 1 To UBound(aBT)
              If aBT(r2, 1) = arr(id, 4) Then
                If aBT(r2, j) > 0 Then
                  n = n + 1
                  res(id, 1) = aLop(1, j - d)
                  arr(id, col) = Empty:              arr(id, 4) = Empty
                  aBT(r2, j) = aBT(r2, j) - 1
                  If d = 1 Then 'HS Nu
                    aT(i, j - 1) = aT(i, j - 1) - 1
                    aBT(r2, j - 1) = aBT(r2, j - 1) - 1
                  End If
                  Exit For
                End If
              End If
            Next r2
          Else 'Doi tuong bình thuong
            If aBT(i, j) > 0 Then
              aBT(i, j) = aBT(i, j) - 1
              If d = 1 Then aBT(i, j - 1) = aBT(i, j - 1) - 1 'HS Nu
              arr(id, 4) = Empty
              res(id, 1) = aLop(1, j - d)
              n = n + 1
            End If
          End If
        Next c
      End If
    Next j
  End If
End Sub

Private Function UniqueRand(ByVal n As Long) As Variant
  Dim arr() As Long, i&, RndNum&, tmp&
  ReDim arr(1 To n)
  For i = 1 To n
    RndNum = Int(n * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(n) = 0 Then arr(RndNum) = n Else arr(RndNum) = arr(n)
    arr(n) = tmp
    n = n - 1
  Next i
  UniqueRand = arr
End Function
 
Upvote 0
Theo như chỉ dẫn trong file: số liệu trong các bảng của sheet "Chia" là được cho trước à bạn?

Số lượng học sinh toàn bộ có thể là bao nhiêu?
Cảm ơn bạn đã quan tâm!
Đúng vậy: Số liệu vùng C5:D13 và C16:D20 là được thống kê từ sheet TachHoTen. Sau đó chia ra (thủ công) vào vùng E5:L13 và E16:L20 để rải tương đối đều các HS về các lớp để đảm bảo số HS và số nữ tương đối bằng nhau, số HS diện đặc biệt cũng tương đối đều nhau. Dựa vào số liệu đã chia đó để lấy ngẫu nhiên HS theo yêu cầu bảng chia ra.
Số lượng HS toàn bộ khoảng 150 HS.
 
Upvote 0
Kiểm tra lại . . .
Mã:
  Option Explicit
  Option Compare Text
  Dim arr(), aLop(), aBT(), res(), sRow&, n&
 
Sub xyz()
  Dim aDB(), i&, j&, dt$

  With Sheets("TachHoTen")
    arr = .Range("I5:O" & .Range("F" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 1)
  With Sheets("Chia")
    aLop = .Range("B3:L3").Value
    aBT = .Range("B5:L13").Value
    aDB = .Range("B16:L20").Value
  End With
  n = 0
  For i = 1 To UBound(aDB) 'Doi tuong dac biet
    dt = Trim(aDB(i, 1))
    Call Db(aDB, dt, i, 1, 7) 'xep Nu HS
    Call Db(aDB, dt, i, 0, 7) 'xep HS
  Next i
  For i = 1 To UBound(aBT) 'Doi tuong bình thuong
    dt = Trim(aBT(i, 1))
    Call Db(aBT, dt, i, 1, 4) 'xep Nu HS
    Call Db(aBT, dt, i, 0, 4) 'xep HS
  Next i
  Sheets("TachHoTen").Range("Q5").Resize(sRow, 1).ClearContents
  If n = sRow Then Sheets("TachHoTen").Range("Q5").Resize(sRow, 1) = res
End Sub

Sub Db(aT, dt, i, ByVal d&, ByVal col&)
  Dim S, a, hs$, r&, r2&, j&, c&, k&, id&
 
  For r = 1 To sRow
    If Trim(arr(r, col)) = dt Then
      If d = 0 Or arr(r, 1) = 1 Then hs = hs & "," & r
    End If
  Next r
  If hs <> Empty Then
    S = Split(hs, ",")
    a = UniqueRand(UBound(S))
    For j = 4 + d To UBound(aT, 2) Step 2
      If aT(i, j) > 0 Then
        For c = 1 To aT(i, j)
          If k < UBound(S) Then k = k + 1 Else k = 1
          id = S(a(k))
          If col = 7 Then 'Doi tuong dac biet
            For r2 = 1 To UBound(aBT)
              If aBT(r2, 1) = arr(id, 4) Then
                If aBT(r2, j) > 0 Then
                  n = n + 1
                  res(id, 1) = aLop(1, j - d)
                  arr(id, col) = Empty:              arr(id, 4) = Empty
                  aBT(r2, j) = aBT(r2, j) - 1
                  If d = 1 Then 'HS Nu
                    aT(i, j - 1) = aT(i, j - 1) - 1
                    aBT(r2, j - 1) = aBT(r2, j - 1) - 1
                  End If
                  Exit For
                End If
              End If
            Next r2
          Else 'Doi tuong bình thuong
            If aBT(i, j) > 0 Then
              aBT(i, j) = aBT(i, j) - 1
              If d = 1 Then aBT(i, j - 1) = aBT(i, j - 1) - 1 'HS Nu
              arr(id, 4) = Empty
              res(id, 1) = aLop(1, j - d)
              n = n + 1
            End If
          End If
        Next c
      End If
    Next j
  End If
End Sub

Private Function UniqueRand(ByVal n As Long) As Variant
  Dim arr() As Long, i&, RndNum&, tmp&
  ReDim arr(1 To n)
  For i = 1 To n
    RndNum = Int(n * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(n) = 0 Then arr(RndNum) = n Else arr(RndNum) = arr(n)
    arr(n) = tmp
    n = n - 1
  Next i
  UniqueRand = arr
End Function
Cảm ơn bạn!
Mình đã kiểm tra lại và thấy kết quả đã đúng mong muốn.
Xin trân trọng cảm ơn bạn và cảm ơn các bạn của GPE. Chúc các bạn mạnh khỏe, hanh phúc, thành công!
 
Upvote 0
Web KT
Back
Top Bottom