EXCEL VBA编写模拟器可以避免误操作导致的数据刷新(用excel拟合曲线)

网友投稿 923 2022-06-28

*实例*

抽奖编号:5位

在前文《EXCEL RAND、RANK、INDEX函数搞定年会抽奖器》,笔者利用EXCEL的函数制作了简单的模拟随机抽奖器。

该方法,具有明显的缺陷,就是“误操作会导致数据刷新”,本文使用EXCEL VBA进行简单模拟器编写:

更好地避免“误操作导致的数据刷新”

准确记录已经中奖的名单

支持10000条以内的“抽奖编号”数据添加

缺陷:抽奖编号只支持3-5位数,其它不能自适应,需修改代码

步骤一:界面设计

单元格B:C区域,输入“抽奖编号”数据,并为其分配自增的不重复编号(1-10003)

单元格E3:I3区域,为摇奖过程展示区域,点击【开始】按钮后,E3:I3区域会持续闪烁,点击【结束】,E3:I3停下,并将摇奖结果复制到L列

单元格L列,为【结束】后保存之前的摇奖结果,点击【重置】按钮,将清除E3:I3摇奖区域和L列的数据

步骤二:EXCEL VBA代码

===============开始================

Dim rollID() As String        '设定动态抽奖编号数组

Dim isScroll As Boolean    '设定控制结束的布尔值

Sub rollReward()

'为动态数组确定大小

Dim a As Integer

a = Application.WorksheetFunction.Max(Range("B3:B10003").Value)

'最多在B列支持10000条数据(年会抽奖,每次抽1人,足够了)

ReDim rollID(1 To a)

'为抽奖编号赋值

Dim i As Integer

For i = 1 To a Step 1

rollID(i) = Cells(2 + i, 3)

Next i

Randomize  '初始化随机数生成器

Dim j As Integer

j = Int(Rnd() * a + 1)

isScroll = False  '初始化“控制结束”标记为false

Dim rollstr As String

rollstr = rollID(j)

Range("E3").Value = Mid(rollstr, 1, 1) '抽奖编号第1位数组,填充在E3单元格

Range("E3").Interior.Color = RGB(Int(Rnd() * 255), Int(Rnd() * 255), Int(Rnd() * 255)) '随机填充颜色

Range("F3").Value = Mid(rollstr, 2, 1) '抽奖编号第2位数组,填充在F3单元格

用EXCEL VBA编写模拟器可以避免误操作导致的数据刷新(用excel拟合曲线)

Range("G3").Value = Mid(rollstr, 3, 1) '抽奖编号第3位数组,填充在G3单元格

Range("G3").Interior.Color = RGB(Int(Rnd() * 255), Int(Rnd() * 255), Int(Rnd() * 255)) '随机填充颜色

If Len(rollstr) >= 4 Then

Range("H3").Value = Mid(rollstr, 4, 1) '抽奖编号第4位数组,填充在H3单元格

End If

If Len(rollstr) >= 5 Then

Range("I3").Value = Mid(rollstr, 4, 1) '抽奖编号第4位数组,填充在I3单元格

Range("I3").Interior.Color = RGB(Int(Rnd() * 255), Int(Rnd() * 255), Int(Rnd() * 255)) '随机填充颜色

End If

DoEvents '释放程序控制权

Dim b As Integer

b = Range("K1").Value

If isScroll = True Then

b = b + 1

Range("K1").Value = b

Range("K" & b + 2).Value = b

Range("L" & b + 2).Value = rollID(j)

Exit Sub '判断控制结束的标记是否为true,是就跳出sub

End If

Call rollReward '调用程序自身,重新生成新的随机结果

End Sub

Sub gameover()

isScroll = True  '将控制结束的标记置为true

End Sub

'重置摇奖区和结果展示区数据

Sub resetGame()

Range("k1").ClearContents

Range("k3:K10003").ClearContents

Range("L3:L10003").ClearContents

Range("E3:I3").Interior.Color = RGB(255, 255, 255)

Range("E3:I3").Value = ""

End Sub

===============结束================

步骤三:测试3位、4位、3-5位抽奖编号表现

抽奖编号:3位

抽奖编号:4位

抽奖编号:3-5位

*方法局限*

只能支持3-5位抽奖编号

抽奖编号必须与实际参与者一一对应,且无法一次性抽多人

无法排除已经中奖的编号

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:被雪藏的datedif()函数的典型用法 适用最新版本的Excel(datedif函数的详细用法)
下一篇:WPS是崩溃没响应,使用格式刷的时候,和他自动保存备份的时候,老是突然就自动保存了,保存也就算了,他
相关文章