Excel VBA活动抽奖小程序
在活动中,我们常会有抽奖,抽奖箱准备繁琐,现在多采用线上抽奖方式,下面用Excel VBA写了一个简单的抽奖小程序
简单测试效果如下,可实现:
多次抽奖,且每次抽奖都不重复
抽奖界面滚动人员信息,点击抽奖按钮锁定中奖人员
中奖人员信息在右侧公示区域展示,最新中奖人员展示在最上方
设置了一部分误点、误操作提示,以及抽奖完成提示等
做了一个抽奖简单演示,演示GIF如下:

实现代码如下,按需自取,转载请备注出处:
'申明Flag、d、e三个模块变量,跨进程引用,实现滚动和抽奖数据传递
Dim Flag As Boolean '屏幕停止滚动并抽奖的判断参数
Dim d As Object '将随机抽取的中奖人员按自增键储存
Dim e As Object '将随机抽取的中奖人员按原键储存
Sub 重置()
'清空上次抽奖内容,将人员名单复制到辅助列
Application.ScreenUpdating = False '屏幕刷新禁用,不展示清空数据过程
Sheets("抽奖界面").Select
Sheets("抽奖界面").Range("E2") = 0
Sheets("抽奖界面").Range(Range("B6"), Range("F15")).ClearContents
Sheets("抽奖界面").Range(Range("J3"), Range("M3").End(xlDown)).ClearContents
Sheets("人员名单").Select
Sheets("人员名单").Range(Range("E2"), Range("F2").End(xlDown)).ClearContents
Sheets("人员名单").Range(Range("A2"), Range("B2").End(xlDown)).Copy Sheets("人员名单").Range("E2")
Sheets("抽奖界面").Select
Application.ScreenUpdating = True '屏幕刷新开启,为滚动抽奖做准备
End Sub
Sub 准备() '准备开始抽奖,灰色区域滚动更新中奖人员
Set d = Nothing
Set e = Nothing
text_level = Sheets("抽奖界面").Range("A2") '抽取奖项
lottery_target = Sheets("抽奖界面").Range("D2") '抽奖次数目标
'判断该奖项是否已经抽取过,当变更了抽取奖项时,自动重置已抽取次数为0
If Application.WorksheetFunction.CountIfs(Sheets("抽奖界面").Range("J:J"), text_level) = 0 Then
Sheets("抽奖界面").Range("E2") = 0
End If
'判断剩余参与人数是否足够抽奖
If Sheets("抽奖界面").Range("F2") < Sheets("抽奖界面").Range("C2") Then
MsgBox ("剩余参与人数不足,请修改抽奖参数或停止抽奖!!!")
Exit Sub
End If
'判断该奖项是否已抽取完,提示操作人员是选择加抽还是变更抽奖奖项
If Sheets("抽奖界面").Range("E2") >= lottery_target Then
QS_Return = MsgBox(text_level & "抽奖" & lottery_act & "已完成!" & Chr(10)
& "要变更奖项请选择是" & Chr(10) & "要再次抽取" & text_level
& "请选择否", vbYesNo + vbQuestion, "提示")
If QS_Return = vbYes Then
MsgBox (text_level & "抽奖已完成,重新选择奖项,输入抽奖次数和单次抽奖人数!")
Exit Sub
Else
Sheets("抽奖界面").Range("D2") = Sheets("抽奖界面").Range("D2") + Sheets("抽奖界面").Range("E2")
End If
End If
'清空抽奖滚动区域,定义变量
Sheets("抽奖界面").Range(Range("B6"), Range("F15")).ClearContents
Flag = True
Set dict_id = CreateObject("scripting.dictionary")
'变量、字典赋值
num_agent = Sheets("抽奖界面").Range("F2")
For i = 1 To num_agent
dict_id(i) = Sheets("人员名单").Cells(i + 1, 5)
Next
num = Sheets("抽奖界面").Range("C2")
'持续滚动抽奖界面,等待点击抽奖后停止
Do
Set d = CreateObject("Scripting.Dictionary")
Set e = CreateObject("Scripting.Dictionary")
For j = 1 To num
Do
a = Int(Rnd * num_agent) + 1
Loop Until Not e.Exists(a)
d(j) = dict_id(a)
e(a) = dict_id(a)
Next
For m = 1 To 10
For n = 1 To 5
If n + (m - 1) * 5 > num Then
Exit For
Else
Sheets("抽奖界面").Cells(m + 5, n + 1) = d(n + (m - 1) * 5)
DoEvents '将控制权传给操作系统,实现滚动的同时可以点击抽奖按钮,非常关键!!!
End If
Next
Next
Loop Until Flag = False
End Sub
Sub 抽奖()
Dim m As Integer
If Not Flag Then
MsgBox ("请先点击准备按钮,再开始抽奖!!!")
Exit Sub
End If
Flag = False '停止抽奖滚动,中奖人员确定
Set f = CreateObject("Scripting.Dictionary")
Set dict_agent = CreateObject("scripting.dictionary")
text_level = Sheets("抽奖界面").Range("A2")
Sheets("抽奖界面").Range("E2") = Sheets("抽奖界面").Range("E2") + 1 '已抽取次数+1
lottery_act = Sheets("抽奖界面").Range("E2") '已抽取次数,后面需要判断是否提示抽奖完成
num = Application.WorksheetFunction.CountA(Sheets("抽奖界面").Range("B6:F15"))
num_exist = Sheets("抽奖界面").Range("G2")
'将中奖人员名单加在公示区域最后面
For i = 1 To num
Sheets("抽奖界面").Cells(2 + num_exist + i, 10) = text_level
Sheets("抽奖界面").Cells(2 + num_exist + i, 11) = lottery_act
Sheets("抽奖界面").Cells(2 + num_exist + i, 12) = d(i)
Sheets("抽奖界面").Cells(2 + num_exist + i, 13) = Application.WorksheetFunction.VLookup(d(i), Sheets("人员名单").Range("E:F"), 2, False)
Next
'将后中奖人员调换至公示区域最上方,更新中奖人员公示名单
For i = 1 To num_exist + num
If i <= num Then
f(i) = Sheets("抽奖界面").Range(Cells(num_exist + i + 2, 10), Cells(num_exist + i + 2, 13))
Else
f(i) = Sheets("抽奖界面").Range(Cells(i + 2 - num, 10), Cells(i + 2 - num, 13))
End If
Next
Sheets("抽奖界面").Range(Cells(3, 10), Cells(num_exist + num + 2, 13)).ClearContents
For j = 1 To num_exist + num
Sheets("抽奖界面").Range(Cells(2 + j, 10), Cells(2 + j, 13)) = f(j)
Next
'奖项抽取完成后提示人员变更参数
If lottery_act = Sheets("抽奖界面").Range("D2") Then
MsgBox (text_level & "抽取" & lottery_act & "次已完成,请变更抽奖奖项和次数")
End If
'更新待抽奖人员名单,实现不重复抽奖
num_agent = Sheets("抽奖界面").Range("F2")
Application.ScreenUpdating = False '屏幕刷新禁用,不展示清空数据过程
Sheets("人员名单").Select
For k = 1 To num_agent
If Not e.Exists(k) Then
dict_agent(k) = Sheets("人员名单").Range(Cells(k + 1, 5), Cells(k + 1, 6))
End If
Next
Sheets("人员名单").Range(Cells(2, 5), Cells(num_agent + 1, 6)).ClearContents
m = 1
For Each Key In dict_agent
Sheets("人员名单").Range(Cells(m + 1, 5), Cells(m + 1, 6)) = dict_agent(Key)
m = m + 1
Next
Sheets("抽奖界面").Select
Application.ScreenUpdating = True '屏幕刷新开启,为下一轮滚动抽奖做准备
End Sub
Excel VBA活动抽奖小程序的更多相关文章
- 用jquery实现抽奖小程序
用jquery实现抽奖小程序 这些日子,到处都可以看到关于微信小程序的新闻或报到,在博客园中写关于微信小程序的也不少.但是今天我要说的不是微信小程序,而是用简单的jquery写的一个好玩的抽奖小程序. ...
- VSTO学习笔记(七)基于WPF的Excel分析、转换小程序
原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...
- 用 python 写一个年会抽奖小程序
使用 pyinstaller 打包工具常用参数指南 pyinstaller -F demo.py 参数 含义 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe ...
- 抽奖小程序,js,canvas
js写的网页抽奖小程序,先上截图 源码地址:https://github.com/xiachaoxulu/raffle
- Winform 随机抽奖小程序
效果图: 主要代码: Form1.cs using System; using System.Drawing; using System.IO; using System.Runtime.Intero ...
- Java抽奖小程序
package com.test; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; im ...
- c#自制抽奖小程序
#region 第一部分界面设计 ; Button button = new Button(); Image[] images = new Image[N]; PictureBox[] picture ...
- 基于vs2012的C# winform抽奖小程序的总结
哈希表的使用 Hashtable hashtable = new Hashtable(); hashtable.ContainsValue(tmp);//判断哈希表中有没有tmp hashtable. ...
- python——公司年会抽奖小程序
张三科技有限公司有300名员工,开年会抽奖,奖项如下一等奖3名 : 泰国五日游二等奖6名 :iphone手机三等奖30名 :避孕套一盒规则:1.一共抽3次,第一次抽3等奖,第二次抽2等奖,第三次压轴抽 ...
随机推荐
- 地图可视化神器keplergl新增对jupyter lab 3.0的支持
就在几天前,地图可视化神器kepler.gl面向Python的接口库keplergl迎来了新的0.3.0版本更新. 虽然官方文档还并未及时更新相关的内容说明,但我在快速地试用之后发现,现在的keple ...
- Flannel和Calico网络插件对比
1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...
- 诸多改进!Superset 1.2.0 正式发布!
Apache Superset 是一个现代的.企业级的轻量BI平台,提供了大量数据可视化组件. 距离superset上一个版本发布已经过了近三个月的时间,我们终于等到了1.2.0版本. 之前就曾提到过 ...
- [心得笔记]Java多线程中的内存模型
一:现代计算机的高速缓存 在计算机组成原理中讲到,现代计算机为了匹配 计算机存储设备的读写速度 与 处理器运算速度,在CPU和内存设备之间加入了一个名为Cache的高速缓存设备来作为缓冲:将运算需要 ...
- centos 安装es
第一步:必须要有jre支持 elasticsearch是用Java实现的,跑elasticsearch必须要有jre支持,所以必须先安装jre 第二步:下载elasticsearch 进入官方下载 h ...
- [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State
[源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State 目录 [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练 ...
- HAL库直流电机编码测速(L298N驱动)笔记
主函数开始后的处理流程: 1.外设初始化:HAL_Init() 2.系统时钟配置 RCC振荡器初始化:HAL_RCC_OsConfig() RCC时钟初始化:HAL_RCC_ClockConfig() ...
- Python----MongoDB数据库
什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...
- 「CF997E」 Good Subsegments
CF997E Good Subsegments 传送门 和 CF526F 差不多,只不过这道题是对多个子区间进行询问. 据说有一个叫析合树的东西可以在线做,不过有时间再说吧. 考虑离线询问,将每个询问 ...
- 「BZOJ 2956」模积和
「BZOJ 2956」模积和 令 \(l=\min(n,m)\).这个 \(i\neq j\) 非常不优雅,所以我们考虑分开计算,即: \[\begin{aligned} &\sum_{i=1 ...