Xin giúp về Random trong VBA có điều kiện

Liên hệ QC

tiendat210

Thành viên mới
Tham gia
3/5/11
Bài viết
25
Được thích
5
Em không rành về VBA nên mong các bác giúp em viết code VBA như sau với ạ:
Cột A2:A10, tạo các số random từ 0 ->9
Cột B2:B10, tạo các số random từ 0 ->9
Cột C = A+B, với điều kiện: Nếu C luôn luôn <=12
Nếu lớn hơn 12 thì random lại Cột B
Em cảm ơn
 
Ra hàng thịt lợn/ heo rồi hỏi mua cá?

1632191781824.png

A2=RANDBETWEEN(0,9)
B2=RANDBETWEEN(0,12-A2)
 
Upvote 0
Em không rành về VBA nên mong các bác giúp em viết code VBA như sau với ạ:
Cột A2:A10, tạo các số random từ 0 ->9
Cột B2:B10, tạo các số random từ 0 ->9
Cột C = A+B, với điều kiện: Nếu C luôn luôn <=12
Nếu lớn hơn 12 thì random lại Cột B
Em cảm ơn
"A2:A10, tạo các số random từ 0 ->9" -> 9 ô chứa 10 số không trùng nhau à?
 
Upvote 0
"A2:A10, tạo các số random từ 0 ->9" -> 9 ô chứa 10 số không trùng nhau à?
Nếu không trùng nhau thì có cách khác:
cột A gõ 1:9 (hổng biết kéo thì thôi đừng dùng Excel nữa)
cột B gõ 11:3
cột C gõ =RAND()
Sort theo C
Xoá C

Cách ở trên giữ dữ liệu dạng cứng. Cách ở bài #2 giữ dữ liệu hơi mềm: kết quả sẽ thay đổi mỗi lần có biến động (hàm RANDBEETWEEN là hàm volatile).
 
Upvote 0
À, bác nào đi qua đi lại giúp em viết code VBA với ạ. Không yêu cầu về sự không trùng lặp ạ
 
Upvote 0
À, bác nào đi qua đi lại giúp em viết code VBA với ạ. Không yêu cầu về sự không trùng lặp ạ

Cho phép trùng nhau đấy nhé!
Rich (BB code):
Sub XYZ()
Dim arrKQ(), i&, k&, m&, Dau&, Cuoi&, endR&, LRw&
Dau = 0: Cuoi = 9
ReDim arrKQ(1 To 9, 1 To 3)
For i = 1 To 9
    Randomize
    k = Int((Cuoi - Dau + 1) * Rnd + Dau)
    arrKQ(i, 1) = k
T1: Randomize
    m = Int((Cuoi - Dau + 1) * Rnd + Dau)
    If m + k <= 12 Then
        arrKQ(i, 2) = m
        arrKQ(i, 3) = m + arrKQ(i, 1)
    Else
        GoTo T1
    End If
Next
Range("A2").Resize(9, 3) = arrKQ
End Sub
 
Upvote 0
Cho phép trùng nhau đấy nhé!
...
Nếu cho phép trùng nhau thì cần gì phải lặp tới lặp lui mệt vậy.
Cứ việc dùng 1 hàm random rồi lấy 9 chữ số đầu của phần thập phân.

Chú: code chỉ cần Randomize mọt lần, và một lần duy nhất thôi. Randomize nhiều lần là thừa, và có thể bị phản ứng phụ.
Randomize bảo hàm Rnd kế đó dùng ticks trong máy làm hạt nhân. Nếu code chạy nhanh quá, có thể lần Rnd kế tiếp hạt nhân chưa đủ tăng trên 16 chữ số để thay đổi Rnd.
 
Upvote 0
................
Mã:
Sub tong()
Dim ketqua(1 To 9, 1 To 3), k As Long
    Randomize
    For k = 1 To 9
        ketqua(k, 1) = Int(10 * Rnd)
        ketqua(k, 2) = Int((12 - ketqua(k, 1) + 1) * Rnd)
        ketqua(k, 3) = ketqua(k, 1) + ketqua(k, 2)
    Next
    Range("A2").Resize(9, 3) = ketqua
End Sub
 
Upvote 0
................
Mã:
Sub tong()
Dim ketqua(1 To 9, 1 To 3), k As Long
    Randomize
    For k = 1 To 9
        ketqua(k, 1) = Int(10 * Rnd)
        ketqua(k, 2) = Int((12 - ketqua(k, 1) + 1) * Rnd)
        ketqua(k, 3) = ketqua(k, 1) + ketqua(k, 2)
    Next
    Range("A2").Resize(9, 3) = ketqua
End Sub
Bác @batman1 ơi! Code hay quá.
 
Upvote 0
................
Mã:
Sub tong()
Dim ketqua(1 To 9, 1 To 3), k As Long
    Randomize
    For k = 1 To 9
        ketqua(k, 1) = Int(10 * Rnd)
        ketqua(k, 2) = Int((12 - ketqua(k, 1) + 1) * Rnd)
        ketqua(k, 3) = ketqua(k, 1) + ketqua(k, 2)
    Next
    Range("A2").Resize(9, 3) = ketqua
End Sub
(12 - ketqua(k, 1) + 1) có khả năng >10 :p
 
Upvote 0
(12 - ketqua(k, 1) + 1) có khả năng >10 :p
À đúng,đọc trước quên sau. Giới hạn đến 9 thì
Mã:
Sub tong()
Dim ketqua(1 To 9, 1 To 3), k As Long, can_tren As Long
    Randomize
    For k = 1 To 9
        ketqua(k, 1) = Int(10 * Rnd)
        can_tren = 12 - ketqua(k, 1) + 1
        If can_tren > 10 Then can_tren = 10
        ketqua(k, 2) = Int(can_tren * Rnd)
        ketqua(k, 3) = ketqua(k, 1) + ketqua(k, 2)
    Next
    Range("A2").Resize(9, 3) = ketqua
    
    can_tren = 12 - ketqua(k, 1) + 1
    If can_tren > 10 Then can_tren = 10
End Sub
 
Upvote 0
Mình chưa rõ tại sao trước hàm IIF() lại phải xài ngoặc đơn, nếu không kết quả không như hẹn!
PHP:
Sub Tong2OO2CotCungHang()
 Dim aKQ(1 To 9, 1 To 3), K As Long, W As Double
 Randomize
 For K = 1 To 9
    W = 1 + 9 * Rnd
    aKQ(K, 1) = W \ (IIf(W > 5, 2, 1))    '?!?  '
    aKQ(K, 2) = (1 + W) \ (IIf(W > 6, 2, 1))
    aKQ(K, 3) = aKQ(K, 2) + aKQ(K, 1)
 Next
 Range("A2").Resize(9, 3) = aKQ()
End Sub
 
Upvote 0
Mình chưa rõ tại sao trước hàm IIF() lại phải xài ngoặc đơn, nếu không kết quả không như hẹn!
PHP:
Sub Tong2OO2CotCungHang()
 Dim aKQ(1 To 9, 1 To 3), K As Long, W As Double
 Randomize
 For K = 1 To 9
    W = 1 + 9 * Rnd
    aKQ(K, 1) = W \ (IIf(W > 5, 2, 1))    '?!?  '
    aKQ(K, 2) = (1 + W) \ (IIf(W > 6, 2, 1))
    aKQ(K, 3) = aKQ(K, 2) + aKQ(K, 1)
 Next
 Range("A2").Resize(9, 3) = aKQ()
End Sub
Mình thử không thấy khác biệt
Mã:
Sub Tong2OO2CotCungHang()
 Dim aKQ(1 To 9, 1 To 7), K As Long, W As Double
 Randomize
 For K = 1 To 9
    W = 1 + 9 * Rnd
    aKQ(K, 1) = W \ (IIf(W > 5, 2, 1))
    aKQ(K, 5) = W \ IIf(W > 5, 2, 1)    '?!?  '
    aKQ(K, 2) = (1 + W) \ (IIf(W > 6, 2, 1))
    aKQ(K, 6) = (1 + W) \ IIf(W > 6, 2, 1) '?!?  '
    aKQ(K, 3) = aKQ(K, 2) + aKQ(K, 1)
    aKQ(K, 7) = aKQ(K, 5) + aKQ(K, 6)
 Next
 Range("A2").Resize(9, 7) = aKQ()
End Sub
 
Upvote 0
Luật chung cho hầu hết các trình dịch:
Cặp dấu ngoặc bảo đảm với trình dịch đây là một biểu thức trọn, phải tính nó trước khi gộp nó vào biểu thức khác.
Đối với một hàm thì trình dịch cũng đã phải tính trước khi gộp cho nên bao trong dấu ngoặc là không cần thiết. Chỉ không cần thiết thôi chứ về tính toán và lô gic hoàn toàn không có sự khác biệt (*1). (nếu có thì chỉ là vài phần tỷ giây cho trình dịch tạo token)
Chú: Với toán chia, một số người có thói quen đặt mẫu số bên trong dấu ngoặc để dễ kiểm soát sau này, nếu phải thêm bớt sửa đổi một vài con toán cũng dễ làm.

(*1) đây tôi nói về dấu ngoặc phân biệt biểu thức thôi. Với VBA, dấu ngoặc dùng trong lúc nạp tham số gọi hàm có ý nghĩa hơi đặc biệt khác.
 
Upvote 0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
aKQ(k,1)aKQ(k,2)WSub Tong2OO2CotCungHang()
347
3.1961​
Dim aKQ(1 To 9, 1 To 3), K As Long, W As Double
448
8.3714​
Randomize
347
6.8019​
For K = 1 To 9
268
5.0784​
W = 1 + 9 * Rnd: [F3].Value = W
459
4.2322​
aKQ(K, 1) = W \ IIf(W > 5, 2, 1)
235
1.7584​
aKQ(K, 2) = (1 + W) \ IIf(W > 6, 2, 1)
347
3.4049​
aKQ(K, 3) = aKQ(K, 2) + aKQ(K, 1)
336
6.2278​
Next
347
3.1593​
Range("A2").Resize(9, 3) = aKQ()
End Sub

Hình như vẫn đúng như Hiếu nói!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom