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

Liên hệ QC

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

  • chon.xls
    20 KB · Đọc: 1,385
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

  • Rand.xls
    23.5 KB · Đọc: 2,465
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

  • GetRndList.xls
    22.5 KB · Đọc: 1,703
Đươ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

  • ma so doi chieu1.xls
    26.5 KB · Đọc: 251
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

  • GetRndList_2.xls
    37.5 KB · Đọc: 453
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

  • ma so doi chieu.rar
    593.3 KB · Đọc: 221
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

  • ma so doi chieu.rar
    596.8 KB · Đọc: 147
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

  • GetRndList_3.rar
    596.8 KB · Đọc: 547
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
Back
Top Bottom