Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 9187|回复: 10

[已解决]随机数生成,抽签

[复制链接]
发表于 2014-6-12 13:29 | 显示全部楼层 |阅读模式
1、单击对应姓名后的单元格,生成随机数,随机整数范围(1-16),然后再C列对应的单元格自动生成奖品。
2、随机数要求,当点击数小于17,无重复数,大于等于17时,生成的随机数最大重复次数最小。玩具
sheet2中是奖品表

请论坛的老师帮助解答,谢谢! 抽签程序.rar (11.86 KB, 下载次数: 88)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-6-12 16:40 | 显示全部楼层
2、随机数要求,当点击数小于17,无重复数,大于等于17时,生成的随机数最大重复次数最小。

你这个要求是多余的。只要满足条件-1就一定满足条件-2
回复

使用道具 举报

发表于 2014-6-12 16:50 | 显示全部楼层
回复

使用道具 举报

发表于 2014-6-12 16:58 | 显示全部楼层    本楼为最佳答案   
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.     If Target.Column <> 2 And Target.Row < 3 Or Target.Count > 1 Then Exit Sub
  3.     arr = Sheet2.[a1].CurrentRegion
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Set d1 = CreateObject("scripting.dictionary")
  6.     For i = 3 To UBound(arr)
  7.         d(arr(i, 1)) = arr(i, 2) & "," & arr(i, 3)
  8.     Next
  9.    
  10.     brr = [a1].CurrentRegion
  11.     For i = 3 To UBound(brr)
  12.         If Len(brr(i, 2)) > 0 Then
  13.             n = n + 1   '记录总抽奖次数
  14.             d1(brr(i, 2)) = d1(brr(i, 2)) + 1   '记录每种奖品出现次数
  15.         End If
  16.     Next
  17.    
  18.     Randomize
  19.     If n < 16 Then   '总次数小于16次,取唯一值
  20. aa:        R = Int(16 * Rnd) + 1
  21.         If d1.exists(R) Then GoTo aa
  22.     Else   '总次数大于16次,取最小值
  23.         xmin = Application.WorksheetFunction.Min(d1.items)
  24. bb:        R = Int(16 * Rnd) + 1
  25.         If d1(R) > xmin Then GoTo bb
  26.     End If
  27.     Target = R
  28.     Target.Offset(0, 1).Resize(1, 2) = Split(d(R), ",")
  29. End Sub
复制代码
回复

使用道具 举报

发表于 2014-6-12 17:00 | 显示全部楼层
请看附件。另外第2句改成:
If Target.Column <> 2 Or Target.Row < 3 Or Target.Count > 1 Then Exit Sub

抽签程序.rar

15.55 KB, 下载次数: 46

回复

使用道具 举报

发表于 2014-6-12 17:12 | 显示全部楼层
奖品能重复吗?
回复

使用道具 举报

发表于 2014-6-12 17:50 | 显示全部楼层
看看是不是你想要的

抽签程序.rar

11.86 KB, 下载次数: 42

回复

使用道具 举报

发表于 2014-6-12 18:10 | 显示全部楼层
电子表 发表于 2014-6-12 16:50
谢谢!能否帮忙

电子表,你有几个用户名呀?
回复

使用道具 举报

发表于 2014-6-12 18:12 | 显示全部楼层
  1. Dim n%, brr(1 To 16)
  2. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  3.     Dim irow%, arr, i%, iRnd%, temp%, dic1 As Object, dic2 As Object
  4.     Set dic1 = CreateObject("scripting.dictionary")
  5.     Set dic2 = CreateObject("scripting.dictionary")
  6.     arr = Sheets("sheet2").Range("A3:C18")
  7.     For i = 1 To UBound(arr)
  8.         dic1(arr(i, 1)) = arr(i, 2)
  9.         dic2(arr(i, 1)) = arr(i, 3)
  10.     Next
  11.     If n = 0 Then
  12.         For i = 1 To 16
  13.             brr(i) = i
  14.         Next
  15.     End If
  16.     If Target.Row <= 25 And Target.Row >= 3 And Target.Column = 2 And Target.Cells.Count = 1 And VBA.IsEmpty(Target.Value) Then
  17.         VBA.Randomize
  18.         iRnd = Int(Rnd() * (16 - n)) + 1
  19.         Target.Value = brr(iRnd)
  20.         Target.Offset(0, 1) = dic1(Target.Value)
  21.         Target.Offset(0, 2) = dic2(Target.Value)
  22.         temp = brr(iRnd)
  23.         brr(iRnd) = brr(16 - n)
  24.         brr(16 - n) = temp
  25.         n = n + 1
  26.         If n = 16 Then n = 0
  27.     End If
  28. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-6-12 18:29 | 显示全部楼层
谢谢朋友们的热心解答,获益良多.初学VBA,向你们学习了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 00:19 , Processed in 0.395141 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表