Thủ tục tạo số ngẫu nhiên
Quả thật, bài toán bạn đưa ra không đơn giản chút nào. Nó cần bạn đưa vào 2 đối số:
1. Số chữ số cần ghi. Ví dụ 3 chữ số thì các số nằm trong phạm vi 100 < số ghi <=999.
2. Ghi vào bao nhiêu chữ số. Số lần ghi này phải thỏa mãn <= 999-100+1. Ngoài ra nếu ghi theo dòng từ trên xuống, nó còn lệ thuộc ô đầu tiên ghi ở dòng nào ? Ví dụ nếu ô đầu ở dòng 65.500 thì số cần ghi không quá 36 số.
Để giải quyết bài toán này, cần phải có 1 thủ tục trong đó kiểm tra 2 đối số đưa vào có thỏa mãn điều kiện trên không, nếu thỏa mãn tiến hành tạo số ngẫu nhiên. Mỗi số tạo ra trước khi ghi vào ô lại phải kiểm tra đã có chưa ? Nếu chưa ghi vào ô, nếu đã có phải tạo lại cho đến khi thỏa mãn.
Tôi viết Sub SoNgauNghien để làm các công việc đó. Bạn có thể tải về tập tin SoNgauNhien.zip về chạy thử.
Tiến trình của thủ tục này như sau:
1. Ghi 2 giá trị dòng, cốt vào 2 biến rd, c
2. Nhập số chữ số cần ghi vào biến sonhap qua hộp thoại. Do Excel chỉ hiển thị đúng số nhập là 15 chữ số. Nếu sonhap > 15 sẽ báo lỗi.
3. Tính số nhỏ nhất vào biến somin, số lớn nhất vào biến somax. Số lần ghi vào biến solanmax. Kiểm tra xem từ ô đang chọn cho đến ô cuối cùng của bảng tính (dòng 65536) có đủ ô ghi không ? Nếu không đủ tính lại solanmax.
4. Nhập số cần ghi vào biến sonhap qua hộp thoại. Nếu sonhap > solanmax sẽ báo lỗi.
5. Tạo vòng lặp For r = rd To rc để ghi các số ngẫu nhiên từ ô đầu rd đến ô cuối rc. Mỗi số trước khi ghi được kiểm tra bằng cách đếm trong vùng sẽ ghi có số này chưa qua biến laplai. Nếu biến laplai=0 thì ghi, nế laplai>0 thì tạo số mới cho đến khi nào thỏa mãn laplai=0.
‘==========
Sub SoNgauNghien()
Dim MyRange As Object
rd = ActiveCell.Row
c = ActiveCell.Column
sonhap = Application.InputBox("So co bao nhieu chu so ? (0 < sochuso <=15)", "So ngau nhien", 3, , , , , 1)
If sonhap = 0 Or sonhap > 15 Then GoTo baoloi
somin = 10 ^ (sonhap - 1)
somax = Val(String(sonhap, "9"))
solanmax = somax - somin + 1
If rd + solanmax - 1 > 65536 Then
solanmax = 65536 - rd + 1
End If
sonhap = Application.InputBox("Ghi vao bang tinh bao nhieu so ?" & Chr(13) & "<=" & solanmax, "So ngau nhien", solanmax, , , , , 1)
If sonhap = 0 Or sonhap > solanmax Then GoTo baoloi
rc = rd + sonhap - 1
Set MyRange = Range(Cells(rd, c), Cells(rc, c))
MyRange.ClearContents
For r = rd To rc
Do
ngaunhien = Int((somax - somin + 1) * Rnd + somin)
laplai = Application.WorksheetFunction.CountIf(MyRange, ngaunhien)
If laplai = 0 Then
Cells(r, c) = ngaunhien
Exit Do
End If
Loop
Next
Exit Sub
baoloi:
MsgBox "So nhap " & sonhap & " . Ngoai pham vi xu ly !", vbOKOnly, "So ngau nhien"
End Sub