Xin VBA chọn ngẫu nhiên 10 số bất kỳ không trùng nhau trong list có sẵn (1 người xem)

Liên hệ QC

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

cuong003

Thành viên mới
Tham gia
5/10/10
Bài viết
33
Được thích
2
Giới tính
Nam
Kính chào GPE!
Em có 1 bài toán mà không biết phải làm thế nào.
Có 1 file excel như đính kèm, trong file đó có khoảng 100 sheet mỗi sheet tên khác nhau nhưng kết cấu giống nhau và số lượng mẫu lại khác nhau.
Vậy phải làm thế nào để trong mỗi sheet chọn được ra 10 người bất kỳ không trùng nhau theo số thứ tự trong danh sách như ở sheet "DS1".
Kính mong nhận được sự giúp đỡ của cộng đồng GPE!
 

File đính kèm

Mong muốn của mình là nhờ các bạn viết cho 1 macro để mình cho vào 1 file gốc như 1 add-in ấy. Lúc cần sử dụng thì mình bật các file cần chọn mẫu lên chọn thôi.
Viết cho bạn 1 Macro, bạn sử dụng cách nào thì tùy nhé, tôi không dám tạo 1 add-in.
PHP:
Public Sub GPE()
Dim Ws As Worksheet, sArr(), dArr(), I As Long, K As Long, R As Long
For Each Ws In ThisWorkbook.Worksheets
    With Ws
        sArr = .Range("A5", .Range("B5").End(xlDown)).Value
        R = UBound(sArr)
        ReDim dArr(1 To 10, 1 To 2)
        K = 0
        Randomize
            Do
                I = Int(Rnd * R) + 1
                If sArr(I, 1) > 0 Then
                    K = K + 1
                    dArr(K, 1) = sArr(I, 1)
                    dArr(K, 2) = sArr(I, 2)
                    sArr(I, 1) = 0
                End If
                If K = 10 Then Exit Do
            Loop
        .Range("D5").Resize(10, 2) = dArr
        .Range("D5").Resize(10, 2).Sort Key1:=.Range("D5"), Order1:=xlAscending
    End With
Next Ws
End Sub
 
Upvote 0
Viết cho bạn 1 Macro, bạn sử dụng cách nào thì tùy nhé, tôi không dám tạo 1 add-in.
PHP:
'...'
For Each Ws In ThisWorkbook.Worksheets
    With Ws
        sArr = .Range("A5", .Range("B5").End(xlDown)).Value
        R = UBound(sArr)
        ReDim dArr(1 To 10, 1 To 2)
        K = 0
        Randomize
'...'
Next Ws
End Sub

Chỉ cần Randomize 1 lần thôi. Đặt nó trước vòng lặp. Randomize bên trong vòng lặp có khi tạo ra kết quả bất ngờ: nếu code chạy nhanh quá, có thể gây ra hiệu ứng số ngẫu nhiên bị lặp lại.

Dạ em có nhiều files, mỗi file có 100 sheets. Mong muốn là như vậy không biết có cách nào làm đc hay hơn ko? Nếu có mong các bạn giúp đỡ!

Trường lớn cỡ này thì bảo Sinh Viên chúng tự làm lấy quy trình trực.

"đc hay hơn ko" là gì? Đặc hay hơn co?
 
Upvote 0
Chỉ cần Randomize 1 lần thôi. Đặt nó trước vòng lặp. Randomize bên trong vòng lặp có khi tạo ra kết quả bất ngờ: nếu code chạy nhanh quá, có thể gây ra hiệu ứng số ngẫu nhiên bị lặp lại.



Trường lớn cỡ này thì bảo Sinh Viên chúng tự làm lấy quy trình trực.

"đc hay hơn ko" là gì? Đặc hay hơn co?
Bác bắt bẻ em ghê quá @@. Chả biết lúc đó trong đầu nghĩ ngì nữa
Cảm ơn bác đã ghé thăm ^^
 
Upvote 0
Viết cho bạn 1 Macro, bạn sử dụng cách nào thì tùy nhé, tôi không dám tạo 1 add-in.
PHP:
Public Sub GPE()
Dim Ws As Worksheet, sArr(), dArr(), I As Long, K As Long, R As Long
For Each Ws In ThisWorkbook.Worksheets
    With Ws
        sArr = .Range("A5", .Range("B5").End(xlDown)).Value
        R = UBound(sArr)
        ReDim dArr(1 To 10, 1 To 2)
        K = 0
        Randomize
            Do
                I = Int(Rnd * R) + 1
                If sArr(I, 1) > 0 Then
                    K = K + 1
                    dArr(K, 1) = sArr(I, 1)
                    dArr(K, 2) = sArr(I, 2)
                    sArr(I, 1) = 0
                End If
                If K = 10 Then Exit Do
            Loop
        .Range("D5").Resize(10, 2) = dArr
        .Range("D5").Resize(10, 2).Sort Key1:=.Range("D5"), Order1:=xlAscending
    End With
Next Ws
End Sub
Cảm ơn bác đã giúp đỡ ! Em chỉ có mong muốn như vậy thôi ^^. Bác bonus cho em thêm dòng sắp lại danh sách theo số thứ tự em rất toai nguyện ko còn mong muốn j hơn nữa ^^
Một lần nữa xin cảm ơn các bạn đã giúp đỡ!
 
Upvote 0
Chỉ cần Randomize 1 lần thôi. Đặt nó trước vòng lặp. Randomize bên trong vòng lặp có khi tạo ra kết quả bất ngờ: nếu code chạy nhanh quá, có thể gây ra hiệu ứng số ngẫu nhiên bị lặp lại.



Trường lớn cỡ này thì bảo Sinh Viên chúng tự làm lấy quy trình trực.

"đc hay hơn ko" là gì? Đặc hay hơn co?

em cũng chưa rõ là gì ạ. Sao chép ỡ chỗ khác mà. -+*/-+*/
 
Upvote 0
em cũng chưa rõ là gì ạ. Sao chép ỡ chỗ khác mà. -+*/-+*/
Tôi biết là sao chép. Nhưng tôi không hỏi chỗ gốc vì lý do cá nhân.

Cũng như phần dưới đây tôi chỉ nói riêng với người viết code bài #21:
Code ấy chỉ áp dụng được 1 lần. Nếu chạy lần thứ nhì, code cần xét thêm phần đã lấy ra trong các lần trước. Chạy càng nhiều lần, xác suất chạm càng nhiều, và trên lý thuyết có thể chạy cả giờ.
Khi phải chạy nhiều lần thì cách dễ nhất là dùng cột phụ để chứa số ngẫu nhiên và sort.
1. copy dữ liệu ra bảng khác
2. đặt số ngẫu nhiên ở cột phụ
3. sắp xếp
4. lấy ra 10 dòng đầu
5. đánh dấu những dòng đã lấy ra (điển hình bằng cách đổi số ở cột phụ thành số âm)
6. lần kế tiếp chỉ việc lặp lại bước 4 (bắt đầu từ số dương)

Nếu có sự thêm ngừoi vào danh sách thì đặt số ngẫu nhiên cho các dòng mới đó. Và lặp lại bước 3 (bắt đầu từ số dương)
 
Upvote 0
Web KT

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

Back
Top Bottom