Bài tập VBA: tạo một dãy số sao cho các số không trùng nhau??

Liên hệ QC

Quy Vu

Thành viên chính thức
Tham gia
4/8/17
Bài viết
65
Được thích
4
Giới tính
Nam
Chào các anh chị trong diễn đàn,
Em có một bài tập muốn nhờ các anh chị giúp đỡ, mong được hỗ trợ ạ
- Điền một số ngẫu nhiên từ 1 tới 59 vào 6 ô liền nhau bất kì như dưới, sao cho 6 số này không số nào trùng nhau?

- 215890
 
Chào các anh chị trong diễn đàn,
Em có một bài tập muốn nhờ các anh chị giúp đỡ, mong được hỗ trợ ạ
- Điền một số ngẫu nhiên từ 1 tới 59 vào 6 ô liền nhau bất kì như dưới, sao cho 6 số này không số nào trùng nhau?

- View attachment 215890
Bạn sử dụng code bác @ndu96081631 thử nếu muốn thay đổi nhấn F9

Mã:
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long)
  Application.Volatile
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
  End With
End Function
 

File đính kèm

  • Book1.xlsm
    14.2 KB · Đọc: 14
Upvote 0
Bạn sử dụng code bác @ndu96081631 thử nếu muốn thay đổi nhấn F9

Mã:
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long)
  Application.Volatile
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
  End With
End Function

Mình cũng có file này, chưa kịp gửi là Bác gửi trước rồi.
 
Upvote 0
Mình cũng có file này, chưa kịp gửi là Bác gửi trước rồi.
Vậy thời buổi này đua nhau tìm kiếm và copy paste chỉnh sửa cho phù hợp với dữ liệu rồi lưu gửi file qua, suy cho cùng diễn đàn vô cùng tài nguyên hay được đóng góp từ các chú đi trước, tuổi trẻ chỉ cần hưởng thụ thành quả mà thôi. haha
 
Upvote 0
Code ấy xưa rồi. Nó thuộc về cái thời mà câu lệnh "On Error Resume Next" còn được coi là câu thần chú giúp cho vượt qua mọi cửa ải.
Thời buổi bi giờ, code với câu ấy được coi là loại code lười biếng.
 
Upvote 0
Vậy thời buổi này đua nhau tìm kiếm và copy paste chỉnh sửa cho phù hợp với dữ liệu rồi lưu gửi file qua, suy cho cùng diễn đàn vô cùng tài nguyên hay được đóng góp từ các chú đi trước, tuổi trẻ chỉ cần hưởng thụ thành quả mà thôi. haha
Bác biết code thì còn sửa được, em không biết nên cái nào tương tự thì mới làm được thôi.
 
Upvote 0
Chào các anh chị trong diễn đàn,
Em có một bài tập muốn nhờ các anh chị giúp đỡ, mong được hỗ trợ ạ
- Điền một số ngẫu nhiên từ 1 tới 59 vào 6 ô liền nhau bất kì như dưới, sao cho 6 số này không số nào trùng nhau?

- View attachment 215890
Nếu dùng hàm thì thử cái này, chưa kiểm tra có trùng không?
ấn Ctrl + Shift + Enter vì là công thức mảng
Mã:
=IFERROR(LARGE(ROW(INDIRECT(1&":"&59))*NOT(COUNTIF($B$7:B7,ROW(INDIRECT(1&":"&59)))),RANDBETWEEN(1,59-1-ROW(A1)+2)),"")
 

File đính kèm

  • Book1.xlsm
    15.4 KB · Đọc: 7
Upvote 0
Vậy thời buổi này đua nhau tìm kiếm và copy paste chỉnh sửa cho phù hợp với dữ liệu rồi lưu gửi file qua, suy cho cùng diễn đàn vô cùng tài nguyên hay được đóng góp từ các chú đi trước, tuổi trẻ chỉ cần hưởng thụ thành quả mà thôi. haha
Bạn haha hơi sớm. Tuổi trẻ chỉ cần hưởng thụ thì chỉ được cái phần thô sơ và lỗi thời của bọn đi trước thôi.
Lúc tìm kiếm và copy paste chỉnh sửa cho phù hợp, "tuổi trẻ" cũng cần phải tìm hiểu nguyên lý, và như vậy mới có thể cải tiến theo thời đại.

Code ở bài #2 phải dùng On Error là vì lúc viết code đó, người viết chưa nắm hết cách hoạt động của Dictionary.
Đơn giản là hàm add bị lỗi nếu key đã có sẵn, và vì vậy phải bẫy lỗi.
Mấy năm sau này, GPE rành hơn về Dictionary nên biết rằng hàm gán item cho key có thể mặc định add nếu key chưa có.
Vì vậy, nếu sửa dòng:
.Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
Thành:
.Item( Int(Rnd() * (Top - Bottom + 1)) + Bottom) = ""
Thì sẽ không phải bẫy lỗi.
 
Upvote 0
Bạn haha hơi sớm. Tuổi trẻ chỉ cần hưởng thụ thì chỉ được cái phần thô sơ và lỗi thời của bọn đi trước thôi.
Lúc tìm kiếm và copy paste chỉnh sửa cho phù hợp, "tuổi trẻ" cũng cần phải tìm hiểu nguyên lý, và như vậy mới có thể cải tiến theo thời đại.

Code ở bài #2 phải dùng On Error là vì lúc viết code đó, người viết chưa nắm hết cách hoạt động của Dictionary.
Đơn giản là hàm add bị lỗi nếu key đã có sẵn, và vì vậy phải bẫy lỗi.
Mấy năm sau này, GPE rành hơn về Dictionary nên biết rằng hàm gán item cho key có thể mặc định add nếu key chưa có.
Vì vậy, nếu sửa dòng:
.Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
Thành:
.Item( Int(Rnd() * (Top - Bottom + 1)) + Bottom) = ""
Thì sẽ không phải bẫy lỗi.
Cho nên được học như bài 8 của bác
 
Upvote 0
Bạn haha hơi sớm. Tuổi trẻ chỉ cần hưởng thụ thì chỉ được cái phần thô sơ và lỗi thời của bọn đi trước thôi.
Lúc tìm kiếm và copy paste chỉnh sửa cho phù hợp, "tuổi trẻ" cũng cần phải tìm hiểu nguyên lý, và như vậy mới có thể cải tiến theo thời đại.

Code ở bài #2 phải dùng On Error là vì lúc viết code đó, người viết chưa nắm hết cách hoạt động của Dictionary.
Đơn giản là hàm add bị lỗi nếu key đã có sẵn, và vì vậy phải bẫy lỗi.
Mấy năm sau này, GPE rành hơn về Dictionary nên biết rằng hàm gán item cho key có thể mặc định add nếu key chưa có.
Vì vậy, nếu sửa dòng:
.Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
Thành:
.Item( Int(Rnd() * (Top - Bottom + 1)) + Bottom) = ""
Thì sẽ không phải bẫy lỗi.
cái này C++ 5 dòng là chạy như Vietlot luon.
 
Upvote 0
Code vẫn trả ra giá trị trùng do chưa loại bỏ giá trị tạo ra trước đó trên bảng tính.
 
Upvote 0
cái này C++ 5 dòng là chạy như Vietlot luon.
Xin chân thành cảm ơn = Xin chân thành cảm ơn + X ( X mình sẽ công bố sau )
Lời hứa gió bay.

Thực ra tôi cũng chả quan tâm chuyện công bố X nhưng rất dị ứng với những người tung một vấn đề rồi bỏ đấy. Không nói A (Vấn đề đã được giải quyết. Nhờ Admin xóa hộ chủ đề) mà cũng chả nói B (Không chạy, không nhẩy, không bay, không động đậy)
 
Upvote 0
Bài toán này, nếu là mình thì áp dụng cách thủ công sẽ là:
Tạo vòng lặp (từ 1 tới 60)
Biến chúng thành 1 chuỗi: "010203. . . . 5960"
Tạo vòng lặp băm & nối ở vị trí lẽ ngẫu nhiên chuỗi này
Cuối cùng thái chuỗi này như thái chuối để chọn 6 số đang đứng ở đâu đó trong chuỗi

Các bạn nào mới gia nhập VBA thử sức xem sao?!?

Chúc thành công.
 
Upvote 0
Gò mãi mới về được 9 dòng. Hóng code 5 dòng
Mã:
Sub A_9Dong()
Dim i, Chuoi As String
Randomize
Do While UBound(Split(Application.Trim(Chuoi))) < 5
    i = Fix(Rnd() * 60)
    If InStr(" " & Chuoi & " ", " " & i & " ") = 0 Then Chuoi = Chuoi & " " & i
Loop
Range("A1").Resize(1, 6) = Split(Application.Trim(Chuoi))
End Sub
 
Upvote 0
Web KT
Back
Top Bottom