Hỏi về code VBA phân phòng thi trong excel (1 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

2013myvietnam

Thành viên mới
Tham gia
5/6/23
Bài viết
14
Được thích
3
Em định viết code cho nút Thực hiện của Form CHIA PHONG như hình dưới. Em mong muốn: khi nhập số phòng vào Textbox và bấm nút thực hiện thì excel sẽ chia đều số thí sinh theo số lượng phòng. Nếu có thí sinh bị dư ra, sẽ tự động rải đều mỗi học sinh bị dư vào 1 phòng, bắt đầu từ phòng đầu tiên (Ví dụ: Danh sách trong file đính kèm có 179 thí sinh, chia làm 8 phòng thì: 3 phòng đầu có 23 thí sinh, 5 phòng sau có 22 thí sinh. Kí hiệu Phòng sẽ xuất hiện trong cột F).
Các Anh, Chị chỉ giúp em với, em xin chân thành cảm ơn!
chia phong.jpg
 

File đính kèm

Em định viết code cho nút Thực hiện của Form CHIA PHONG như hình dưới. Em mong muốn: khi nhập số phòng vào Textbox và bấm nút thực hiện thì excel sẽ chia đều số thí sinh theo số lượng phòng. Nếu có thí sinh bị dư ra, sẽ tự động rải đều mỗi học sinh bị dư vào 1 phòng, bắt đầu từ phòng đầu tiên (Ví dụ: Danh sách trong file đính kèm có 179 thí sinh, chia làm 8 phòng thì: 3 phòng đầu có 23 thí sinh, 5 phòng sau có 22 thí sinh. Kí hiệu Phòng sẽ xuất hiện trong cột F).
Các Anh, Chị chỉ giúp em với, em xin chân thành cảm ơn

Có phải bạn chỉ muốn điền P1 đến Pn trong cột F?
 
Upvote 0
Vâng ạ! Em chỉ cần điền kí hiệu Phòng vào cột F, còn tách phòng em sử dụng nút tách phòng rồi ạ!
Code này chưa test, bạn test thử:

Mã:
Private Sub CommandButton1_Click()

    Dim Arr, SoPhong As Long, aRow As Long, i As Long, k As Long
    Sheet2.Activate
    If Me.TextBox1 = "" Then Exit Sub
    If Me.TextBox1 <= 0 Then Exit Sub
    SoPhong = Me.TextBox1.Value
     With ActiveSheet 'Sheet DL_ToanTruong
        aRow = .Range("C" & .Rows.Count).End(xlUp).Row
        If aRow < 9 Then Exit Sub
        Arr = .Range("C9:C" & aRow).Value
        aRow = UBound(Arr, 1)
        k = 1
        For i = 1 To aRow
            Arr(i, 1) = "P " & k
             k = IIf(k = SoPhong, 1, k + 1)
        Next i
        .Range("F9").Resize(aRow, 1).Value = Arr
    MsgBox "Da chia phong thanh cong!", vbOKOnly + vbInformation, "Thong bao"
   
End Sub
 
Upvote 0
Code này chưa test, bạn test thử:

Mã:
Private Sub CommandButton1_Click()

    Dim Arr, SoPhong As Long, aRow As Long, i As Long, k As Long
    Sheet2.Activate
    If Me.TextBox1 = "" Then Exit Sub
    If Me.TextBox1 <= 0 Then Exit Sub
    SoPhong = Me.TextBox1.Value
     With ActiveSheet 'Sheet DL_ToanTruong
        aRow = .Range("C" & .Rows.Count).End(xlUp).Row
        If aRow < 9 Then Exit Sub
        Arr = .Range("C9:C" & aRow).Value
        aRow = UBound(Arr, 1)
        k = 1
        For i = 1 To aRow
            Arr(i, 1) = "P " & k
             k = IIf(k = SoPhong, 1, k + 1)
        Next i
        .Range("F9").Resize(aRow, 1).Value = Arr
    MsgBox "Da chia phong thanh cong!", vbOKOnly + vbInformation, "Thong bao"
  
End Sub
Em cảm ơn anh nhiều ạ! Em đã thử code anh viết giúp ở trên thì thấy: ví dụ trên excel đánh tên phòng Từ P 1 đến P 8 là 22 lần, lần cuối là từ P 1 đến P 3 nhưng danh sách em đã đánh số báo danh theo thứ tự từ nhỏ đến lớn (Tương ứng với cột tên đã sắp xếp từ A đến Z rồi) vậy em muốn excel đánh liền P 1 xong rồi mới đến P 2, -> P n được không ạ?
 
Upvote 0
Em cảm ơn anh nhiều ạ! Em đã thử code anh viết giúp ở trên thì thấy: ví dụ trên excel đánh tên phòng Từ P 1 đến P 8 là 22 lần, lần cuối là từ P 1 đến P 3 nhưng danh sách em đã đánh số báo danh theo thứ tự từ nhỏ đến lớn (Tương ứng với cột tên đã sắp xếp từ A đến Z rồi) vậy em muốn excel đánh liền P 1 xong rồi mới đến P 2, -> P n được không ạ?
Thử thay đổi như sau:

Mã:
Private Sub CommandButton1_Click()
    Dim Arr, SoPhong As Long, aRow As Long, i As Long, k As Long
    Dim n As Long, d As Long, SoTT As Long
    Sheet2.Activate
    If Me.TextBox1 = "" Then Exit Sub
    If Me.TextBox1 <= 0 Then Exit Sub
    SoPhong = Me.TextBox1.Value
     With ActiveSheet 'Sheet DL_ToanTruong
        aRow = .Range("C" & .Rows.Count).End(xlUp).Row
        If aRow < 9 Then Exit Sub
        Arr = .Range("C9:C" & aRow).Value
        aRow = UBound(Arr, 1)
        n = aRow \ SoPhong ' So thi sinh nguyen
        d = aRow Mod SoPhong 'So thi sinh le
        SoTT = 1
        k = 1
        For i = 1 To aRow
            Arr(i, 1) = "P " & SoTT
            k = k + 1
            If k > n Then
                If d > 0 Then
                    i = i + 1
                    Arr(i, 1) = "P " & SoTT
                    d = d - 1
                End If
                k = 1
                SoTT = SoTT + 1
            End If            
        Next i
        .Range("F9").Resize(aRow, 1).Value = Arr
    MsgBox "Da chia phong thanh cong!", vbOKOnly + vbInformation, "Thong bao"
   End With
End Sub
 
Upvote 0
Mượn code của bạn @Phuocam chỉnh lại tí
Mã:
Private Sub CommandButton1_Click()
    Dim Arr, SoPhong&, aRow&, i&, j&, k&, n&, d&
    
    Sheet2.Activate
    If Me.TextBox1 = "" Then Exit Sub
    If Me.TextBox1 <= 0 Then Exit Sub
    SoPhong = Me.TextBox1.Value

    aRow = Range("C" & Rows.Count).End(xlUp).Row
    If aRow < 9 Then Exit Sub
    Arr = Range("C9:C" & aRow).Value
    aRow = UBound(Arr, 1)
    n = aRow \ SoPhong + 1 ' So thi sinh nguyen
    d = aRow Mod SoPhong 'So thi sinh le

  For i = 1 To SoPhong
    If d = 0 Then n = n - 1
    For j = 1 To n
      k = k + 1
      Arr(k, 1) = "P " & i
    Next j
    d = d - 1
  Next i
    Range("h9").Resize(aRow, 1).Value = Arr
    MsgBox "Da chia phong thanh cong!", vbOKOnly + vbInformation, "Thong bao"
End Sub
 
Upvote 0
Mượn code của bạn @Phuocam chỉnh lại tí
Mã:
Private Sub CommandButton1_Click()
    Dim Arr, SoPhong&, aRow&, i&, j&, k&, n&, d&
   
    Sheet2.Activate
    If Me.TextBox1 = "" Then Exit Sub
    If Me.TextBox1 <= 0 Then Exit Sub
    SoPhong = Me.TextBox1.Value

    aRow = Range("C" & Rows.Count).End(xlUp).Row
    If aRow < 9 Then Exit Sub
    Arr = Range("C9:C" & aRow).Value
    aRow = UBound(Arr, 1)
    n = aRow \ SoPhong + 1 ' So thi sinh nguyen
    d = aRow Mod SoPhong 'So thi sinh le

  For i = 1 To SoPhong
    If d = 0 Then n = n - 1
    For j = 1 To n
      k = k + 1
      Arr(k, 1) = "P " & i
    Next j
    d = d - 1
  Next i
    Range("h9").Resize(aRow, 1).Value = Arr
    MsgBox "Da chia phong thanh cong!", vbOKOnly + vbInformation, "Thong bao"
End Sub
Code của bạn dùng 2 vòng For.
 
Upvote 0
Web KT

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

Back
Top Bottom