欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  Office

用EXCEL VBA编写模拟器可以避免误操作导致的数据刷新

程序员文章站 2021-12-18 17:12:48
*实例* 抽奖编号:5位 在前文《》,笔者利用EXCEL的函数制作了简单的模拟随机抽奖器。 该方法,具有明显的缺陷,就是“误操作会导致数据刷新...

*实例*

用EXCEL VBA编写模拟器可以避免误操作导致的数据刷新

抽奖编号:5位

在前文《》,笔者利用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单元格

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位抽奖编号表现

用EXCEL VBA编写模拟器可以避免误操作导致的数据刷新

抽奖编号:3位

用EXCEL VBA编写模拟器可以避免误操作导致的数据刷新

抽奖编号:4位

用EXCEL VBA编写模拟器可以避免误操作导致的数据刷新

抽奖编号:3-5位

*方法局限*

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

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

无法排除已经中奖的编号