Điền giá trị ngẫu nhiên theo số lượng cho trước.

Chia sẻ bởi:hrspring.tides
★★★★★
Quảng cáo

Em có bài toán sau nhờ các bác giúp đỡ với a.

Em có 11 con số tương ứng với số lần xuất hiện ngẫu nhiên vào một vùng có 10 hàng 10 cột.

Tao nut Click de moi lan Click se cho ra ket qua ngau nhien khac nhau.

Rất mong các bác viết code VBA giúp em ạ.

Em xin chân thành cảm ơn.!

1. Chuẩn bị: Tạo ra file có 2 sheet. Một sheet để ghi kết quả. Một sheet để nháp. Tên sheet ghi tùy ý. Sheet 1 là nơi tôi ghi kết quả. Sheet 2 là nơi tôi nháp.
Mình nghĩ nếu thao tác trên mảng thì nhanh hơn, nhưng thiếu trực quan với người mới học. Bản thân mình code cũng còn yếu. Vì vậy xin phép đi theo hướng này.
2. Thiết kế form:

2214
Trên ô C3 tôi dùng công thức SUM kiểm tra đầu vào có phải là 100 số hay không.
Nếu không phải thì thoát.

Tôi nghĩ code sẽ chặt chẽ hơn nếu kiểm tra xem có số nào có số lần là 0 hay không. Tuy nhiên việc này rườm rà mất thời gian, nên tôi mặc định số lần luôn là số nguyên dương.

3. Thuật toán:
Tôi đơn giản ghi các số theo số lần xuất hiện lên cột A của sheet 2.

2213
Cột B là nơi tôi tạo ra các số ngẫu nhiên.
Cột C là nơi tôi xếp thứ hạng từ cao xuống thấp dựa vào dãy số ngẫu nhiên trên cột B.
Dựa vào dữ liệu cột C tôi sẽ ghi kết quả số tương ứng ở cột A vào bảng kết quả.
Ví dụ: Dòng 19.
Số 0 có thứ hạng 73. Tôi mong mốn xếp số 0 này vào hàng 7, cột 3 trên bảng kết quả.
Kết quả:
2212
Để kiểm tra tính ngẫu nhiên, tôi chạy lại một lần nữa:
2211

4. Code:

Sub DienSoNgauNhien()
    Dim i   As Long, j As Long, cnt As Long
    Dim n   As Long
    Dim rend    As Long
    Dim arr
    Dim rng As Range
    Dim r As Long, r1 As Long, c As Long

Dim myDic As Object
    On Error Resume Next

With ThisWorkbook.Sheets(1)
        n = .Cells(1, 3) 'C1
        rend = .Cells(.Rows.Count, 1).End(3).Row
        arr = .Range(.Cells(2, 1), .Cells(rend, 2)).Value
    End With
    On Error GoTo 0
    If n <> 100 Then
        MsgBox "Kiem tra gia tri o C1"
        Exit Sub 'khong phai la 100 thi thoat
    End If

If rend < 2 Then
        MsgBox "Khong co du lieu tren cot A"
        Exit Sub
    End If

Set myDic = CreateObject("Scripting.Dictionary")

For i = LBound(arr, 1) To UBound(arr, 1) Step 1
        If Not myDic.Exists(arr(i, 1)) Then
            myDic.Add arr(i, 1), arr(i, 2)
        Else
            myDic.Item(arr(i, 1)) = myDic.Item(arr(i, 1)) + arr(i, 2)
        End If
    Next i
    'Xep ngau nhien
    arr = myDic.Keys
    cnt = 0
    On Error GoTo tiep
    With ThisWorkbook.Sheets(2)
        For i = LBound(arr) To UBound(arr) Step 1
            For j = 1 To myDic.Item(arr(i)) Step 1
                cnt = cnt + 1
                    .Cells(cnt, 1) = arr(i)
            Next j
tiep:
        Next i
    On Error GoTo 0
        If cnt = 0 Then Exit Sub
        Call Randomize 'Reset ngau nhien
        For i = 1 To cnt Step 1
            .Cells(i, 2) = Rnd
        Next i
        Set rng = .Range(.Cells(1, 2), .Cells(cnt, 2))
        For i = 1 To rng.Rows.Count
            .Cells(i, 3) = WorksheetFunction.Rank(.Cells(i, 2), rng)
        Next i
        arr = .Range(.Cells(1, 1), .Cells(cnt, 3)).Value
    End With
    'Ghi ket qua:
    With ThisWorkbook.Sheets(1)
        For i = LBound(arr, 1) To UBound(arr, 1) Step 1
            n = arr(i, 3)
            c = n Mod 10
            If c = 0 Then
                r1 = n / 10
                If r1 = 0 Then r1 = 1
            Else
                r1 = Int(n / 10) + 1
            End If

r = r1 + 1
            If c = 0 Then
                c = 13
            Else
                c = c + 3
            End If
            .Cells(r, c) = arr(i, 1)
        Next i
    End With
End Sub
Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 2 ▥ 0
Quảng cáo

Bạn nên đọc

2 Responses

  1. trandominhtrang says:

    rất hay, cảm ơn bạn đã chia sẻ!

  2. trandominhtrang says:

    bạn ơi, bạn hướng dẫn giúp m với, m không làm dc

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm