Thử code nàyNhờ các anh, chị giúp em viết code đánh x ngẫu nhiên vào vùng dữ liệu sao cho Tổng x = Tổng (cho trước) cần đánh dấu x
Trân trọng
Sub NgauNhien()
Dim nguon(), tam, I, J, n
[B6:AE10000].ClearContents
nguon = Range([A4], [A65536].End(3)).Resize(, 31).Value
For I = 3 To UBound(nguon)
Do
tam = Int((30 * Rnd) + 2)
If nguon(1, tam) <> "CN" Then
If nguon(I, tam) = "" Then
n = n + 1
nguon(I, tam) = "X"
End If
End If
Loop Until n = nguon(I, 1)
n = 0
Next
[A4].Resize(I - 1, 31) = nguon
End Sub
Chuẩn luôn anh ạ.Thử code này
PHP:Sub NgauNhien() Dim nguon(), tam, I, J, n [B6:AE10000].ClearContents nguon = Range([A4], [A65536].End(3)).Resize(, 31).Value For I = 3 To UBound(nguon) Do tam = Int((30 * Rnd) + 2) If nguon(1, tam) <> "CN" Then If nguon(I, tam) = "" Then n = n + 1 nguon(I, tam) = "X" End If End If Loop Until n = nguon(I, 1) n = 0 Next [A4].Resize(I - 1, 31) = nguon End Sub
Em làm phiền anh chút nữa nheChuẩn luôn anh ạ.
Nếu không nhầm thì tác giả định làm lười viết code để điền số ngày nghỉ của học sinh vào sổ cái thì phải.
Em làm phiền anh chút nữa nhe
Em muốn đánh ngẫu nhiển VR, hoặc Ô vào những ô trống không đánh x, nhưng không đánh vào những ngày Chủ nhật. Nhưng Tổng x = Tổng số ngày đã cho ban đầu
Trân trọng cám ơn
P/s: Nếu dữ liệu nhiều thì có cách nào để code xử lý nhanh không anh
Sub NgauNhien()
Dim nguon(), tam, I, J, n
[B6:AE1000].ClearContents
nguon = Range([A4], [A65536].End(3)).Resize(, 31).Value
For I = 3 To UBound(nguon)
If nguon(I, 1) > 0 Then
Do
tam = Int((30 * Rnd) + 2)
If nguon(1, tam) <> "CN" Then
If nguon(I, tam) = "" Then
n = n + 1
nguon(I, tam) = "X"
End If
End If
Loop Until n = nguon(I, 1)
n = 0
End If
Next
For I = 3 To UBound(nguon)
If nguon(I, 1) > 0 Then
For J = 2 To 31
If nguon(1, J) <> "CN" Then
If nguon(I, J) = "" Then
nguon(I, J) = "VR"
End If
End If
Next
End If
Next
[A4].Resize(I - 1, 31) = nguon
End Sub
1. Chưa có thời gian suy nghĩTại sao không đánh dấu "X" và "VR" trong cùng một lúc duyệt hàng mà lại phải dùng 2 vòng lặp riêng?
PHP:Sub NgauNhien() Dim nguon(), tam, I, J, n [B6:AE1000].ClearContents nguon = Range([A4], [A65536].End(3)).Resize(, 31).Value For I = 3 To UBound(nguon) If nguon(I, 1) > 0 Then Do tam = Int((30 * Rnd) + 2) If nguon(1, tam) <> "CN" Then If nguon(I, tam) = "" Then n = n + 1 nguon(I, tam) = "X" End If End If Loop Until n = nguon(I, 1) n = 0 End If Next For I = 3 To UBound(nguon) If nguon(I, 1) > 0 Then For J = 2 To 31 If nguon(1, J) <> "CN" Then If nguon(I, J) = "" Then nguon(I, J) = "VR" End If End If Next End If Next [A4].Resize(I - 1, 31) = nguon End Sub
Vậy anh Ndu96081631 và VetMini có thể giúp em làm code mới nhe.Code này có 1 lỗi rất nghiêm trọng: Ông nào "tưng" lên, gõ vào cell A6 số 33 (hoặc gõ 1 ký tự tào lao nào đó) rồi bấm chạy code thì... ôi thôi, chờ đến tận thế
Thậm chí cũng khỏi Ctrl + Break được luôn ---> Buộc Ctrl + Alt + Del để End Excel process mới mong "bình tỉnh" trở lại
Ẹc... Ẹc...
Vậy anh Ndu96081631 và VetMini có thể giúp em làm code mới nhe.
Vậy anh Ndu96081631 và VetMini có thể giúp em làm code mới nhe.
Sub NgauNhien()
Dim nguon(), tam, I, J, n
[B6:AE1000].ClearContents
nguon = Range([A4], [A65536].End(3)).Resize(, 31).Value
For I = 3 To UBound(nguon)
If IsNumeric(nguon(I, 1)) Then
If nguon(I, 1) > 0 Then
If nguon(I, 1) < 27 Then
Do
tam = Int((30 * Rnd) + 2)
If nguon(1, tam) <> "CN" Then
If nguon(I, tam) = "" Then
n = n + 1
nguon(I, tam) = "X"
End If
End If
Loop Until n = nguon(I, 1)
n = 0
End If
End If
End If
Next
For I = 3 To UBound(nguon)
If nguon(I, 1) > 0 Then
If nguon(I, 1) < 27 Then
If IsNumeric(nguon(I, 1)) Then
For J = 2 To 31
If nguon(1, J) <> "CN" Then
If nguon(I, J) = "" Then
nguon(I, J) = "VR"
End If
End If
Next
End If
End If
End If
Next
[A4].Resize(I - 1, 31) = nguon
End Sub
Dạ cám ơn anh nhiều, chúc anh ngày mới vui vẻTạm thời khống chế những lỗi mà anh NDU đề cập. Bạn xài tạm trong khi chờ đợi code khác hay hơn
Code mình viết thì loạn cào cào thế nhưng vẫn có thể chữa cháy lúc cần thiết.
PHP:Sub NgauNhien() Dim nguon(), tam, I, J, n [B6:AE1000].ClearContents nguon = Range([A4], [A65536].End(3)).Resize(, 31).Value For I = 3 To UBound(nguon) If IsNumeric(nguon(I, 1)) Then If nguon(I, 1) > 0 Then If nguon(I, 1) < 27 Then Do tam = Int((30 * Rnd) + 2) If nguon(1, tam) <> "CN" Then If nguon(I, tam) = "" Then n = n + 1 nguon(I, tam) = "X" End If End If Loop Until n = nguon(I, 1) n = 0 End If End If End If Next For I = 3 To UBound(nguon) If nguon(I, 1) > 0 Then If nguon(I, 1) < 27 Then If IsNumeric(nguon(I, 1)) Then For J = 2 To 31 If nguon(1, J) <> "CN" Then If nguon(I, J) = "" Then nguon(I, J) = "VR" End If End If Next End If End If End If Next [A4].Resize(I - 1, 31) = nguon End Sub
Tránh lỗi do ndu đưa ra:
- Chạy một vòng duyệt dòng đầu. Đếm những cột có CN. Gọi số này là m
- Đặt m = 31 - m - 1 là giới hạn số X có thể đánh được ở mỗi dòng (trù 1 bời vì không đánh ô đầu)
- Sửa điều kiện ghi thành
IF nguon(I, 1) > 0 AND nguon(I, 1) <= m Then
tb. để tránh đọc các dòng mảng 2 lần, đem vòng lặp For J = 2 To 31 (ghi VR) đặt ngay sau lệnh Loop Until... của vòng lặp ghi X.QUOTE]
Anh xem dùm em. Vậy phải ko anh
PHP:Sub NgauNhien() Dim nguon(), tam, I, J, n, m [B6:AE1000].ClearContents m = Selection.FormulaArray = "=COUNTIF(RC[1]:RC[30],""CN"")" m = 31 - m - 1 nguon = Range([A4], [A65536].End(3)).Resize(, 31).Value For I = 3 To UBound(nguon) If IsNumeric(nguon(I, 1)) Then If nguon(I, 1) > 0 And nguon(I, 1) <= m Then If nguon(I, 1) < 27 Then Do tam = Int((30 * Rnd) + 2) If nguon(1, tam) <> "CN" Then If nguon(I, tam) = "" Then n = n + 1 nguon(I, tam) = "X" End If End If Loop Until n = nguon(I, 1) n = 0 End If End If End If Next For I = 3 To UBound(nguon) If nguon(I, 1) > 0 And nguon(I, 1) <= m Then If nguon(I, 1) < 27 Then If IsNumeric(nguon(I, 1)) Then For J = 2 To 31 If nguon(1, J) <> "CN" Then If nguon(I, J) = "" Then nguon(I, J) = "VR" End If End If Next End If End If End If Next [A4].Resize(I - 1, 31) = nguon End Sub
Cho em hỏi, trường hợp tổng số ngày là số lẻ (26,5, 20,5, hoặc 28,5), thì sẽ đánh x/2. thì code mình sẽ chỉnh sữa lại như thế nào vậy anh.PHP:Sub NgauNhien() Dim nguon(), tam, I, J, n [B6:AE1000].ClearContents nguon = Range([A4], [A65536].End(3)).Resize(, 31).Value For I = 3 To UBound(nguon) If nguon(I, 1) > 0 Then Do tam = Int((30 * Rnd) + 2) If nguon(1, tam) <> "CN" Then If nguon(I, tam) = "" Then n = n + 1 nguon(I, tam) = "X" End If End If Loop Until n = nguon(I, 1) n = 0 End If Next For I = 3 To UBound(nguon) If nguon(I, 1) > 0 Then For J = 2 To 31 If nguon(1, J) <> "CN" Then If nguon(I, J) = "" Then nguon(I, J) = "VR" End If End If Next End If Next [A4].Resize(I - 1, 31) = nguon End Sub