Dùng VBA tìm nhân viên may mắn

Liên hệ QC

vanphu_ht91

Thành viên mới
Tham gia
6/4/17
Bài viết
21
Được thích
0
Xin chào mọi người.
Mình có một bài tập tìm ra người may mắn ngẫu nhiên như sau.
Nhờ mọi người giúp viết code VBA chọn ngẫu nhiên người may mắn trúng giải nhất, giải nhì, giải ba,...
Điều kiện: Người trúng giải phải là duy nhất (1 người không thể trúng 2 giải)
Xin cảm ơn!
1664547383026.png
 

File đính kèm

  • Book1.xlsm
    14.5 KB · Đọc: 8
Xin chào mọi người.
Mình có một bài tập tìm ra người may mắn ngẫu nhiên như sau.
Nhờ mọi người giúp viết code VBA chọn ngẫu nhiên người may mắn trúng giải nhất, giải nhì, giải ba,...
Điều kiện: Người trúng giải phải là duy nhất (1 người không thể trúng 2 giải)
Xin cảm ơn!
View attachment 281556
Làm cái hàm random từ 1 đến 9 và mảng 1 đến,9 để,kiểm soát trùng lặp là ok.
 
Upvote 0
Mình cũng nghĩ là dùng random between từ 1 đến 9.
Nhưng làm thế nào để không bị lặp lại nhỉ.
Thì bạn thử lặp từ 0 cho đến 10 mũ 9
Hay từ 0 cho đến chín vạn; Sau đó phân đoạn giữa 9 van & 0 là OK thôi.

(Mình đoán là lấy ngẫu nhiên 9 số như vậy thì hiếm khi trùng!)
 
Upvote 0
Viết 1 đoạn code thực hiện random cho đến khi h4,h5,h6 không trùng
Mã:
Sub TinhToanLai()

    Do Until [H4] <> [H5] And [H4] <> [H6] And [H6] <> [H5]
        ThisWorkbook.Worksheets("Sheet1").Columns(8).Calculate
    Loop

End Sub
 

File đính kèm

  • Quay so khong trung.xlsm
    16.6 KB · Đọc: 14
Upvote 0
Viết 1 đoạn code thực hiện random cho đến khi h4,h5,h6 không trùng
Mã:
Sub TinhToanLai()

    Do Until [H4] <> [H5] And [H4] <> [H6] And [H6] <> [H5]
        ThisWorkbook.Worksheets("Sheet1").Columns(8).Calculate
    Loop

End Sub
Cũng là cách nhưng có vẻ hơi cồng kềnh bác ạ. Vừa phải F9, vừa phải chạy code, vừa phải công thức nữa
 
Upvote 0
Bài tập chảnh. Tiếng Tây tiếng U tùm lum.

Loại bài này thì giải thuật là nguyên tắc sắp xếp ngẫu nhiên. Có hai cách:

1. Giải thuật bốc lô tô. Bốc ngẫu nhiên và hoán vị từ vị trí 1 đến n.

2. Giải thuật gán số ngẫu nhiên và sắp xếp theo số này.

Cả hai kiểu này ở đây có cả đống.
 
Upvote 0
Bài tập chảnh. Tiếng Tây tiếng U tùm lum.

Loại bài này thì giải thuật là nguyên tắc sắp xếp ngẫu nhiên. Có hai cách:

1. Giải thuật bốc lô tô. Bốc ngẫu nhiên và hoán vị từ vị trí 1 đến n.

2. Giải thuật gán số ngẫu nhiên và sắp xếp theo số này.

Cả hai kiểu này ở đây có cả đống.
Về ý tưởng thì mình có, căn bản tại mình mới học nên chưa làm tốt việc biến ý tưởng thành code ấy.
 
Upvote 0
Về ý tưởng thì mình có, căn bản tại mình mới học nên chưa làm tốt việc biến ý tưởng thành code ấy.
Ý tưởng với ý ẹ. Làm tốt với làm xấu.
Đã muốn học thì việc đầu tiên là học cách "Tìm kiếm".
Code ở đây có cả đống.

Nguyên tắc quan trọng nhất là phải hiểu rằng mình chẳng phải gì đặc biệt. Bất cứ vấn đề gì của mình người khác đều đã trải qua. Bây giờ chỉ cần tìm xem họ giải quyết cách nào.
Những người lúc nào cũng cho mình là đặc biệt, vấn đề của mình là đặc thù, thì đâu có chú tâm tìm những đáp án đã có sẵn.
 
Upvote 0
Mình cũng nghĩ là dùng random between từ 1 đến 9.
Nhưng làm thế nào để không bị lặp lại nhỉ.
Cái thứ 2 bạn khai báo 1 mảng ví dụ dieukien(1 to 9) as Boolean.Khi nào tìm được vị trí nào từ 1 đến 9 thì dieukien(so)=true xét điều kiện để vào được đây là dieukien(so)=False.Nếu không bạn dùng Dictionary cũng được.Nếu ít nữa thì dùng hàm instr cũng lọc trùng được.
 
Upvote 0
Xin chào mọi người.
Mình có một bài tập tìm ra người may mắn ngẫu nhiên như sau.
Nhờ mọi người giúp viết code VBA chọn ngẫu nhiên người may mắn trúng giải nhất, giải nhì, giải ba,...
Điều kiện: Người trúng giải phải là duy nhất (1 người không thể trúng 2 giải)
Xin cảm ơn!
View attachment 281556
Thử code này.
Mã:
Sub abc()
    Dim i As Long, arr, kq, a As Integer, b As Integer, c As Integer
    With Sheets("sheet1")
    arr = .Range("B3:E11").Value
    b = UBound(arr)
    ReDim kq(1 To 3, 1 To 4)
    Do
      a = Fix(Rnd() * b) + 1
      If Not arr(a, 1) = "Da co" Then
         c = c + 1
         kq(c, 1) = c
         kq(c, 2) = arr(a, 2)
         kq(c, 3) = arr(a, 3)
         kq(c, 4) = arr(a, 4)
         arr(a, 1) = "Da co"
         If c = 3 Then Exit Do
      End If
    Loop
    .Range("h4:k6").Value = kq
    End With
End Sub
 
Upvote 0
Cái thứ 2 bạn khai báo 1 mảng ví dụ dieukien(1 to 9) as Boolean.Khi nào tìm được vị trí nào từ 1 đến 9 thì dieukien(so)=true xét điều kiện để vào được đây là dieukien(so)=False.Nếu không bạn dùng Dictionary cũng được.Nếu ít nữa thì dùng hàm instr cũng lọc trùng được.
Bốc ngẫu nhiên N từ K:
Giải thuật lọc trùng không đúng lắm.
Thứ nhất, theo lý thuyết, khi N tiến gần K thì khả năng "đụng hàng" tăng. Có thể xảy tình trạng chạy quanh quẩn. Tuy trên nthực tế hiếm khi xảy ra.
Thứ hai, nguyên tắc của "bốc lô tô" là số nào bốc rồi là bỏ ra ngoài, lượt kế tiếp bốc số còn lại trong túi. Giải thuật lọc trùng là bỏ số trở lại túi, lỡ bốc nhằm lần thứ nhì thì lại bỏ vào bốc tiếp.

1664645776865.png

1664645913191.png
 
Upvote 0
Thêm 1 cách khác:
PHP:
Sub NhatNhiBa()
 Dim Rws As Long, DD As Byte, J As Long, SoNgau As Integer, VTr As Integer, Dem As Byte
 Dim StrC As String
 
 Rws = [C654321].End(xlUp).Row:          DD = Len([C3].Value)
 Randomize:                             [I4:I6].ClearContents
 For J = 3 To Rws
    SoNgau = 1 + 9999 * Rnd() \ 1
    If SoNgau Mod 2 = 0 Then
        StrC = StrC & "@" & CStr(Cells(J, "C").Value)
    Else
        StrC = CStr(Cells(J, "C").Value) & "@" & StrC
    End If
 Next J
 For J = 1 To 99
    SoNgau = 1 + DD * Rnd() \ 1
    VTr = InStr(SoNgau * (DD + 1), StrC, "@")
    If SoNgau Mod 6 = 0 And VTr > 0 Then
        [I4].Offset(Dem).Value = Mid(StrC, 1 + VTr, DD)
        Dem = Dem + 1
        StrC = Mid(StrC, VTr + DD + 1, Len(StrC)) & Left(StrC, VTr - 1)
    ElseIf VTr > 0 Then
        StrC = Mid(StrC, VTr, Len(StrC)) & Left(StrC, VTr - 1)
    End If
    If Dem = 3 Then Exit For
 Next J
 MsgBox J
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bốc ngẫu nhiên N từ K:
Giải thuật lọc trùng không đúng lắm.
Thứ nhất, theo lý thuyết, khi N tiến gần K thì khả năng "đụng hàng" tăng. Có thể xảy tình trạng chạy quanh quẩn. Tuy trên nthực tế hiếm khi xảy ra.
Thứ hai, nguyên tắc của "bốc lô tô" là số nào bốc rồi là bỏ ra ngoài, lượt kế tiếp bốc số còn lại trong túi. Giải thuật lọc trùng là bỏ số trở lại túi, lỡ bốc nhằm lần thứ nhì thì lại bỏ vào bốc tiếp.

View attachment 281585

View attachment 281586
Bạn này chắc chắn là siêu lắm đây.
Tư duy khác quá, mình mới học nên còn gà lắm.
Với lại chắc cũng học để phục vụ công việc thôi chứ không chuyên sâu được như bạn.
 
Upvote 0
Bạn này chắc chắn là siêu lắm đây.
Tư duy khác quá, mình mới học nên còn gà lắm.
Với lại chắc cũng học để phục vụ công việc thôi chứ không chuyên sâu được như bạn.
"siêu" thì còn tùy nhận định người khác.
Nhưng kỹ lưỡng thì tôi chắc: ở trên bài #1 thì nói là bài tập. Đến đây thì thành học để phục vụ công việc.
 
Upvote 0
Web KT
Back
Top Bottom