Đánh dấu X ngâu nhiên (1 người xem)

  • Thread starter Thread starter Excel365
  • Ngày gửi Ngày gửi
Liên hệ QC

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

Excel365

Thành viên tích cực
Tham gia
29/10/10
Bài viết
865
Được thích
127
Giới tính
Nam
Nhờ 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
 

File đính kèm

Nhờ 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
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
 
Upvote 0
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
Chuẩ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.
 
Lần chỉnh sửa cuối:
Upvote 0
Trân trọng cảm ơn anh quanghai1969 và chuot0106 rất nhều.

Code này để em điền ngày công cho lương trách nhiệm xã hội đó anh.
 
Upvote 0
Chuẩ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
 
Lần chỉnh sửa cuối:
Upvote 0
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

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
 
Lần chỉnh sửa cuối:
Upvote 0
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?
 
Upvote 0
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?
1. Chưa có thời gian suy nghĩ
2. Chưa đủ khả năng
3. Giải quyết tạm cho người cần. Đối với người không biết thì code như thế là sướng lắm rồi >>> đủ mang lại niềm vui cho nhau...
 
Upvote 0
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

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...
 
Upvote 0
Một vấn đề "không nghiêm trọng" lắm là code dùng kỹ thuật random hơi lỏng:

1. Không có randomize thì random chỉ loà giả tạo. Thử: đóng Excel, mở ra, chạy lại sẽ thấy kết quả in hệt.

2. Dựa vào kỹ thuật đơn giản "đụng ô thì random ô khác" thì cũng hơi lỏng. Khi các ô gần đầy thì xác suất "đụng ô" càng cao, dẫn đến phải chạy vòng nhiều lần mới tìm được 1 ô. Nếu số ô cần đánh nhỏ so với số ô có thể đánh thì không sao, nhưng nếu tỷ số này lớn (1-1 chẳng hạn) thì có thể chạy hoài không dứt.

Thuật chọn ngẫu nhiên thường đi kèm với giải thuật giải quyết cách chọn số khác khi "đụng hàng"
 
Upvote 0
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.
 
Upvote 0
Upvote 0
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
 
Upvote 0
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
Dạ cám ơn anh nhiều, chúc anh ngày mới vui vẻ
 
Upvote 0
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn biết được chưa thì chạy thử chứ có gì khó:

Tạo một bảng khoảng 30 dòng

1. Thử xem code có chạy đúng: ghi số X's cần đánh và chạy thử. Xét kết quả có đúng như đièu kiện?

2. Thử xem code có còn bị lỗi trầm trọng (chạy hoài không dứt): ở một hai dòng nào đó, ghi thử số 50 và 100. Chạy thử xem kết quả như thế nào.

3. Thử xem code có còn bị lỗi nhẹ (đụng hàng): chọn khoảng 5 dòng, ghi số sao cho X đặc hêt và không chừa một VR nào. Chạy thử xem nó có bị chậm quá không (theo lý thuyết tôi nêu ra, càng đặc thì khả năng chạm càng cao, và chạy càng chậm)
 
Upvote 0
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
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.
Trân trọng cảm ơn
 
Upvote 0
Web KT

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

Back
Top Bottom