Excel có hàm chọn ngẫu nhiên trong vùng cho trước không? Nhờ chỉ giúp. (11 người xem)

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

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

tuanfkt

Thành viên chính thức
Tham gia
22/9/06
Bài viết
69
Được thích
8
Nghề nghiệp
Kế toán
Giả sử tôi có danh sách học sinh (B2:B30), ở ô C1 tôi muốn chọn ngẫu nhiên tên học sinh có trong danh sách đó được không? Đại khái như là phải trả bài ngày hôm đó. Rất mong mọi người giúp đỡ.
Rất cảm ơn!
 

File đính kèm

Giả sử tôi có danh sách học sinh (B2:B30), ở ô C1 tôi muốn chọn ngẫu nhiên tên học sinh có trong danh sách đó được không? Đại khái như là phải trả bài ngày hôm đó. Rất mong mọi người giúp đỡ.
Rất cảm ơn!
Bạn dùng hàm sau:
PHP:
=INDEX($B$2:$B$17,INT(RAND()*16)+1)
Cứ bấm F9 sẽ thấy nó chọn ngẩu nhiên
 
Giả sử tôi có danh sách học sinh (B2:B30), ở ô C1 tôi muốn chọn ngẫu nhiên tên học sinh có trong danh sách đó được không? Đại khái như là phải trả bài ngày hôm đó. Rất mong mọi người giúp đỡ.
Rất cảm ơn!
Bạn sử dụng Index() kết hợp với hàm Rand(). Xem cách dùng trong file nha.
 

File đính kèm

Hi,

Theo chủ đề này thì cho em hỏi, nếu phải lấy danh sách ngẫu nhiên từ 1 danh sách thì làm thế nào?

Thanks
 
Hi,

Theo chủ đề này thì cho em hỏi, nếu phải lấy danh sách ngẫu nhiên từ 1 danh sách thì làm thế nào?

Thanks
Đương nhiên là được! Giả sử bạn có 1 danh sách đặt tại A1:A30 (tức 30 phần tử)... Để lấy ra 1 danh sách ngẫu nhiên 10 phần tử từ danh sách trên thì giải thuật sẽ thế này:
- Tạo 10 số ngẫu nhiên không trùng từ 1 đến 30 (tạm gọi là số thứ tự)
- Dùng hàm INDEX, lọc trong danh sách 30 phần tử theo chỉ số dòng chính là số thứ tự vừa tìm
----------------
Về việc tạo dãy số ngẫu nhiên không trùng ta dùng lập trình VBA đề tạo! Xem chi tiết tại đây: http://www.giaiphapexcel.com/forum/showthread.php?27286-Tạo-dãy-số-ngẫu-nhiên-không-trùng
Giờ tôi làm thử cho bạn 1 file như yêu cầu (lấy 10 người ngẫu nhiên trong danh sách 30 người) ---> Xem thế nào nhé
 

File đính kèm

Đương nhiên là được! Giả sử bạn có 1 danh sách đặt tại A1:A30 (tức 30 phần tử)... Để lấy ra 1 danh sách ngẫu nhiên 10 phần tử từ danh sách trên thì giải thuật sẽ thế này:
- Tạo 10 số ngẫu nhiên không trùng từ 1 đến 30 (tạm gọi là số thứ tự)
- Dùng hàm INDEX, lọc trong danh sách 30 phần tử theo chỉ số dòng chính là số thứ tự vừa tìm
----------------
Về việc tạo dãy số ngẫu nhiên không trùng ta dùng lập trình VBA đề tạo! Xem chi tiết tại đây: http://www.giaiphapexcel.com/forum/showthread.php?27286-Tạo-dãy-số-ngẫu-nhiên-không-trùng
Giờ tôi làm thử cho bạn 1 file như yêu cầu (lấy 10 người ngẫu nhiên trong danh sách 30 người) ---> Xem thế nào nhé

Em đã đọc theo link kia rồi, nhưng do trình kém nên hok hiểu...nếu như file của em thế này thì bốc ra 10 số bất kỳ cho giải nhất, 10 số bất kỳ cho giải nhì thì làm sao anh nhỉ?
 

File đính kèm

Em đã đọc theo link kia rồi, nhưng do trình kém nên hok hiểu...nếu như file của em thế này thì bốc ra 10 số bất kỳ cho giải nhất, 10 số bất kỳ cho giải nhì thì làm sao anh nhỉ?
Dữ liệu của bạn bố trí theo kiểu khác nên có lẽ phải viết cho bạn 1 hàm để phục vụ riêng
PHP:
Function GetRngList(SourceRange As Range, Amount As Long)
  Dim TmpArr, Tmp, Item, ul As New Collection, n As Long
  Application.Volatile '<--- Neu muon ket qua thay doi khi bam F9
  TmpArr = SourceRange.Value
  GetRngList = ""
  Set ul = New Collection
  On Error Resume Next
  If Amount > SourceRange.Count Then Amount = SourceRange.Count
  With CreateObject("Scripting.Dictionary")
    For Each Item In TmpArr
      If Not IsEmpty(Item) Then ul.Add Item, CStr(Item)
    Next
    If ul.Count = 0 Then Exit Function
    If Amount > ul.Count Then Amount = ul.Count
    Do
      n = Int(Rnd() * ul.Count) + 1
      Tmp = ul.Item(n)
      If Not .Exists(Tmp) Then .Add Tmp, ""
    Loop Until .Count = Amount
    GetRngList = WorksheetFunction.Transpose(.Keys)
  End With
End Function
Xem file
 

File đính kèm

Lần chỉnh sửa cuối:
Dữ liệu của bạn bố trí theo kiểu khác nên có lẽ phải viết cho bạn 1 hàm để phục vụ riêng
PHP:
Function GetRngList(SourceRange As Range, Amount As Long)
  Dim TmpArr, Tmp, Item, ul As New Collection, n As Long
  Application.Volatile '<--- Neu muon ket qua thay doi khi bam F9
  TmpArr = SourceRange.Value
  GetRngList = ""
  Set ul = New Collection
  On Error Resume Next
  If Amount > SourceRange.Count Then Amount = SourceRange.Count
  With CreateObject("Scripting.Dictionary")
    For Each Item In TmpArr
      If Not IsEmpty(Item) Then ul.Add Item, CStr(Item)
    Next
    If ul.Count = 0 Then Exit Function
    If Amount > ul.Count Then Amount = ul.Count
    Do
      n = Int(Rnd() * ul.Count) + 1
      Tmp = ul.Item(n)
      If Not .Exists(Tmp) Then .Add Tmp, ""
    Loop Until .Count = Amount
    GetRngList = WorksheetFunction.Transpose(.Keys)
  End With
End Function
Xem file

tại sao em lam giống vậy thì bị lỗi "#Name?" ?
 

File đính kèm

sao attach file ko dc nhi?

Thế anh ndu96081631 bốc 10 số trong file zip trước em gửi dc hok? tại em cung làm mà bi lỗi mà ko save lai, bay h thì e ko attach file dc.
Đương nhiên là được rồi ---> Cứ đưa code vào rồi gõ công thức như file cũ thôi
(File của bạn vừa nhiều lại toàn là công thức nên sẽ nặng lắm đấy nhé)
 

File đính kèm

Tôi sửa lại code ở bài trên để cho tốc độ nhanh hơn:
PHP:
Function GetRngList(SrcRng As Range, Amount As Long)
  Dim Tmp, ul As New Collection, n As Long
  Application.Volatile '<--- Neu muon ket qua thay doi khi bam F9
  GetRngList = ""
  Set ul = New Collection
  On Error Resume Next
  If Amount > SrcRng.Count Then Amount = SrcRng.Count
  With CreateObject("Scripting.Dictionary")
    Do
      n = Int(Rnd() * SrcRng.Count) + 1
      Tmp = SrcRng(n).Value
      ul.Add Tmp, SrcRng(n).Address
      If Not .Exists(Tmp) And Not IsEmpty(Tmp) Then .Add Tmp, ""
      If ul.Count = SrcRng.Count Then Exit Do
    Loop Until .Count = Amount
    If .Count Then GetRngList = WorksheetFunction.Transpose(.Keys)
  End With
End Function
Code này nhanh hơn code cũ ít nhất từ 5 đến 10 lần ---> Với dữ liệu 6000 dòng, 26 cột (tương đương 156000 cell) khi bấm F9 để cập nhật, kết quả ra ngay lập tức
 

File đính kèm

Tôi sửa lại code ở bài trên để cho tốc độ nhanh hơn:
PHP:
Function GetRngList(SrcRng As Range, Amount As Long)
  Dim Tmp, ul As New Collection, n As Long
  Application.Volatile '<--- Neu muon ket qua thay doi khi bam F9
  GetRngList = ""
  Set ul = New Collection
  On Error Resume Next
  If Amount > SrcRng.Count Then Amount = SrcRng.Count
  With CreateObject("Scripting.Dictionary")
    Do
      n = Int(Rnd() * SrcRng.Count) + 1
      Tmp = SrcRng(n).Value
      ul.Add Tmp, SrcRng(n).Address
      If Not .Exists(Tmp) And Not IsEmpty(Tmp) Then .Add Tmp, ""
      If ul.Count = SrcRng.Count Then Exit Do
    Loop Until .Count = Amount
    If .Count Then GetRngList = WorksheetFunction.Transpose(.Keys)
  End With
End Function
Code này nhanh hơn code cũ ít nhất từ 5 đến 10 lần ---> Với dữ liệu 6000 dòng, 26 cột (tương đương 156000 cell) khi bấm F9 để cập nhật, kết quả ra ngay lập tức

Em có tải file anh về nhưng ko biết sao nó lại báo lỗi "#name?". không biết có cần phải chỉnh gì lại ko a?
 
Bạn cho mình hỏi tại sao lại không *17 mà phải +1 vậy?
Thì cứ tính đi sẽ biết
- RAND()*16 sẽ cho 1 số ngẫu nhiên trong khoảng từ 0 đến số < 16
- RAND()*16 + 1 sẽ cho 1 số ngẫu nhiên trong khoảng từ 1 đến số < 17
- INT(RAND()*16 + 1) sẽ cho 1 số nguyên ngẫu nhiên trong khoảng từ 1 đến 16
Còn nếu là:
- RAND()*17 thì sẽ cho 1 số ngẫu nhên trong khoảng từ 0 đến số <17
- INT(RAND()*17) sẽ cho 1 số ngẫu nhiên trong khoảng từ 0 đến 16
Hai cách cho kết quả khác nhau
 
Chào mọi người, mọi người giúp em với ạ.
Trong 1 dãy số từ 0 đến 9. Em muốn liệt kê tất cả các số. Số này phải có tối thiểu 4 chữ số và tối đa 8 chữ số, bao gôm cả số trùng lặp. Vậy phải dùng hàm nào ạ?
Mục đích là muốn lấy lại password cho điện thoại thôi ạ.
 
Chào mọi người, mọi người giúp em với ạ.
Trong 1 dãy số từ 0 đến 9. Em muốn liệt kê tất cả các số. Số này phải có tối thiểu 4 chữ số và tối đa 8 chữ số, bao gôm cả số trùng lặp. Vậy phải dùng hàm nào ạ?
Mục đích là muốn lấy lại password cho điện thoại thôi ạ.
Lấy được rồi thì sẽ LIỆT KÊ vào đâu? Trên Excel chăng?
Nên nhớ trên Excel chỉ có tối đa 1,048,576 dòng thôi nha (Excel 2003 còn ít hơn)
 
Web KT

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

Back
Top Bottom