Câu lệnh VBA lấy ngẫu nhiên 10 số trong 500 số

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

hic1802

Thành viên tiêu biểu
Tham gia
16/2/13
Bài viết
545
Được thích
34
Giới tính
Nam
Xin chào mọi người trên GPE,
Mọi người giúp đỡ tạo code khi chạy code sẽ xuất ra ngẫu nhiên 10 hoặc 20 số (số lượng số có thể tự chọn được thì càng tốt) trong 500 số. Nếu thay số bằng 500 dòng ký tự (ví dụ từ B2-B501) thì có lấy được ngẫu nhiên n dòng được không?
Lấy ví dụ ở file đính kèm phía dưới.
 

File đính kèm

Chủ đề này quá nhiều rồi sao vẫn có người đăng bài hỏi nhỉ?
 
Xin chào mọi người trên GPE,
Mọi người giúp đỡ tạo code khi chạy code sẽ xuất ra ngẫu nhiên 10 hoặc 20 số (số lượng số có thể tự chọn được thì càng tốt) trong 500 số. Nếu thay số bằng 500 dòng ký tự (ví dụ từ B2-B501) thì có lấy được ngẫu nhiên n dòng được không?
Lấy ví dụ ở file đính kèm phía dưới.
Bạn phải xác định cho rõ:
1> Bạn muốn lấy ngẫu nhiên 20 giá trị trong khoảng 1 đến 500
2> Bạn muốn lấy ngẫu nhiên 20 giá trị trong vùng dữ liệu A2:A501
2 chuyện là hoàn toàn khác nhau. Bạn chọn cái nào?
 
Bạn phải xác định cho rõ:
1> Bạn muốn lấy ngẫu nhiên 20 giá trị trong khoảng 1 đến 500
2> Bạn muốn lấy ngẫu nhiên 20 giá trị trong vùng dữ liệu A2:A501
2 chuyện là hoàn toàn khác nhau. Bạn chọn cái nào?
Dạ em muốn cả 2 trường hợp trên bác ơi
 
Dạ em muốn cả 2 trường hợp trên bác ơi
Gợi ý cho bạn trong trường hợp thứ 2:
- Ở cột B bạn gõ công thức =RAND() vào B2 rồi kéo fill xuống
- Quét chọn 2 cột A và B, sort tăng dần theo cột B. Khi ấy vùng dữ liệu cột A sẽ bị xáo trộn
- Bạn cứ lấy đại vùng A2:A21, đó chính là 20 giá trị ngẫu nhiên bạn cần
 
Thử cái cùi bắp này xem:
PHP:
Sub LayNgauNhien1DaySo()
 Dim StrC As String
 Dim Num As Integer, J As Long, Tmp As Integer

 [G1].Resize(500).ClearContents:            Randomize
 Num = InputBox("Nhâp Sô Cân Láy: ", "GPE.COM", 35)
 For J = 1 To 500
    If J Mod 2 = 0 Then
        StrC = Right("00" & CStr(J), 3) & StrC
    Else
        StrC = StrC & Right("00" & CStr(J), 3)
    End If
 Next J
 ReDim Arr(1 To Num, 1 To 1) As Integer
 J = 0
 Do
    Tmp = 200 + (299 * Rnd()) \ 1
    If Tmp Mod 3 = 1 Then
        J = J + 1:          If J > Num Then Exit Do
        Arr(J, 1) = Mid(StrC, Tmp, 3)
        StrC = Left(StrC, J - 1) & Mid(StrC, J + 3, Len(StrC))
    End If
 Loop
 [G1].Resize(J - 1).Value = Arr()
End Sub
 
Thử cái cùi bắp này xem:
PHP:
Sub LayNgauNhien1DaySo()
Dim StrC As String
Dim Num As Integer, J As Long, Tmp As Integer

[G1].Resize(500).ClearContents:            Randomize
Num = InputBox("Nhâp Sô Cân Láy: ", "GPE.COM", 35)
For J = 1 To 500
    If J Mod 2 = 0 Then
        StrC = Right("00" & CStr(J), 3) & StrC
    Else
        StrC = StrC & Right("00" & CStr(J), 3)
    End If
Next J
ReDim Arr(1 To Num, 1 To 1) As Integer
J = 0
Do
    Tmp = 200 + (299 * Rnd()) \ 1
    If Tmp Mod 3 = 1 Then
        J = J + 1:          If J > Num Then Exit Do
        Arr(J, 1) = Mid(StrC, Tmp, 3)
        StrC = Left(StrC, J - 1) & Mid(StrC, J + 3, Len(StrC))
    End If
Loop
[G1].Resize(J - 1).Value = Arr()
End Sub
Cảm ơn bác, e có test thử mà thấy trong n số random ngẫu nhiên có số trùng lặp, có thể lấy số ngẫu nhiên mà không có số nào trùng lại không a?
Với lại nó không lấy các số từ 1 đến 99
 
Lần chỉnh sửa cuối:
Ờ hen, vậy thử với cái ni:
PHP:
Sub LayNgauNhien1DaySo()
 Dim StrC As String
 Dim Num As Integer, J As Long, Tmp As Integer

 [g1].Resize(500).ClearContents
 Num = InputBox("Nhâp Sô Cân Láy: ", "GPE.COM", 35)
 For J = 1 To 500
    If J Mod 2 = 0 Then
        StrC = Right("00" & CStr(J), 3) & StrC
    Else
        StrC = StrC & Right("00" & CStr(J), 3)
    End If
    Randomize
    If J > 21 Then
        Tmp = 9 + 9 * Rnd() \ 1
        If Tmp Mod 3 = 1 Then
            StrC = Mid(StrC, Tmp, Len(StrC)) & Left(StrC, Tmp - 1)
        End If
    End If
 Next J
 ReDim Arr(1 To Num, 1 To 1) As Integer
 Tmp = 0
 For J = 1 To 3 * Num Step 3
    Tmp = Tmp + 1:                  Arr(Tmp, 1) = Mid(StrC, J, 3)
 Next J
 [g1].Resize(Num).Value = Arr()
End Sub
 
Ờ hen, vậy thử với cái ni:
PHP:
Sub LayNgauNhien1DaySo()
Dim StrC As String
Dim Num As Integer, J As Long, Tmp As Integer

[g1].Resize(500).ClearContents
Num = InputBox("Nhâp Sô Cân Láy: ", "GPE.COM", 35)
For J = 1 To 500
    If J Mod 2 = 0 Then
        StrC = Right("00" & CStr(J), 3) & StrC
    Else
        StrC = StrC & Right("00" & CStr(J), 3)
    End If
    Randomize
    If J > 21 Then
        Tmp = 9 + 9 * Rnd() \ 1
        If Tmp Mod 3 = 1 Then
            StrC = Mid(StrC, Tmp, Len(StrC)) & Left(StrC, Tmp - 1)
        End If
    End If
Next J
ReDim Arr(1 To Num, 1 To 1) As Integer
Tmp = 0
For J = 1 To 3 * Num Step 3
    Tmp = Tmp + 1:                  Arr(Tmp, 1) = Mid(StrC, J, 3)
Next J
[g1].Resize(Num).Value = Arr()
End Sub
Chuẩn rồi bác ơi.
Cơ mà e không hiểu tí code nào để học lỏm được a :v :v :v
Bác có thể share ý tưởng viết code được không?
 
. . . . bác ơi. Cơ mà e không hiểu tí code nào để học lỏm được a :v :v :v
Bác có thể share ý tưởng viết code được không?
Ý tưởng là vầy:

1./ Tạo vòng lặp từ 1 đến 500 (con số cực đại do bạn nêu)
Biến các số đang duyệt thành chuỗi & nối lần lượt vô biến đã khai báo
1.1./ Trong quá trình nối ta tranh thủ xáo trộn chuỗi đã nối được tại vị trí ngẫu nào đó;

2. Ta băm chuỗi đó theo 3 kí số cho vô mảng;
2.1./ Khi nào đạt số lượng theo iêu cầu (đã đề ra) thì chép hay cho hiện lên ở 1 cột định sẵn.
 
Nói thật là đọc bài trên e đau đầu quá như vào mê cung vậy :v :v :v
Em không buồn học lỏm code luôn
Code tôi viết thường chỉ có mấy dòng, có phải chuyện cao siêu gì đâu bạn. Lại có cả file minh họa, bạn còn đòi gì nữa đây?
Giả sử đọc hoài vẫn không hiểu, ta còn lựa chọn khác là "thây kệ nó đi", cứ biết cách áp dụng là được rồi
(giống như không cần biết sửa xe nhưng ít nhất cũng biết lái)
 
Nói thật là đọc bài trên e đau đầu quá như vào mê cung vậy :v :v :v
Em không buồn học lỏm code luôn
Thông thường thì vấn đề phức tạp mà code ngắn thì muốn hiểu được chỉ có nước đoán từng dòng và debug lần hồi. Nếu code sử dụng mảng hay cấu trúc gì đó (ví dụ Dictionary) thì chia buồn, chịu khó tự viết lấy một sub chuyên môn debug mảng.
Học lỏm code là chơi dại. Người học lập trình chỉ học giải thuật thôi.
Rất tiếc là ở diễn đàn này người ta chỉ thích biểu diễn code chứ không thích bỏ thì giờ chỉ dẫn giải thuật. (đáng lẽ thì tối thiểu cũng viết chú thích trong code)
 
Nói thật là đọc bài trên e đau đầu quá như vào mê cung vậy :v :v :v
Em không buồn học lỏm code luôn
Vậy đọc cái này xem dễ hiểu hơn không?
PHP:
Sub LayNgauNhien1DaySo()
 Dim StrC As String
 Dim Num As Integer, J As Long, Tmp As Integer, W As Integer

 [g1].Resize(500).ClearContents
 Num = InputBox("Nhâp Sô Cân Láy: ", "GPE.COM", 35)
 For J = 1 To 500
    If J Mod 2 = 0 Then
        StrC = Right("00" & CStr(J), 3) & StrC
    Else
        StrC = StrC & Right("00" & CStr(J), 3)
    End If
 Next J
 Randomize
 ReDim Arr(1 To Num, 1 To 1) As Integer
 For J = 1 To 500
    Tmp = 3 + Len(StrC) * Rnd() \ 1
    If Tmp > Len(StrC) Then Tmp = Tmp - Len(StrC)
    If Tmp Mod 3 = 0 Then Tmp = Tmp + 1
    If Tmp Mod 3 = 2 Then Tmp = Tmp - 1
    W = W + 1:              Arr(W, 1) = Mid(StrC, Tmp, 3)
    If W = Num Then Exit For
    StrC = Mid(StrC, Tmp + 3, Len(StrC)) & Left(StrC, Tmp - 1)
 Next J
 [g1].Resize(Num).Value = Arr()
End Sub
 
Web KT

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

Back
Top Bottom