在活动中,我们常会有抽奖,抽奖箱准备繁琐,现在多采用线上抽奖方式,下面用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活动抽奖小程序的更多相关文章

  1. 用jquery实现抽奖小程序

    用jquery实现抽奖小程序 这些日子,到处都可以看到关于微信小程序的新闻或报到,在博客园中写关于微信小程序的也不少.但是今天我要说的不是微信小程序,而是用简单的jquery写的一个好玩的抽奖小程序. ...

  2. VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

    原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...

  3. 用 python 写一个年会抽奖小程序

    使用 pyinstaller 打包工具常用参数指南 pyinstaller -F demo.py 参数 含义 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe ...

  4. 抽奖小程序,js,canvas

    js写的网页抽奖小程序,先上截图 源码地址:https://github.com/xiachaoxulu/raffle

  5. Winform 随机抽奖小程序

    效果图: 主要代码: Form1.cs using System; using System.Drawing; using System.IO; using System.Runtime.Intero ...

  6. Java抽奖小程序

    package com.test; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; im ...

  7. c#自制抽奖小程序

    #region 第一部分界面设计 ; Button button = new Button(); Image[] images = new Image[N]; PictureBox[] picture ...

  8. 基于vs2012的C# winform抽奖小程序的总结

    哈希表的使用 Hashtable hashtable = new Hashtable(); hashtable.ContainsValue(tmp);//判断哈希表中有没有tmp hashtable. ...

  9. python——公司年会抽奖小程序

    张三科技有限公司有300名员工,开年会抽奖,奖项如下一等奖3名 : 泰国五日游二等奖6名 :iphone手机三等奖30名 :避孕套一盒规则:1.一共抽3次,第一次抽3等奖,第二次抽2等奖,第三次压轴抽 ...

随机推荐

  1. Zabbix5.0微信报警

    3.1.注测企业微信: 3.2.企业微信注册成功后进入后台管理: 3.3.添加一个部门,并记住部门id: #我这里添加的子部门ID为2 3.4.添加一个用户到上面创建的部门里面(这里采取直接将管理员添 ...

  2. FastDFS文件系统迁移和数据恢复

    迁移步骤 打包旧服务器文件的所有文件 定位到旧服务器的tracker和Storage目录,将整个文件夹打包 tar -zcf fdfs-storage-data.tar.gz /fastdfs/sto ...

  3. POJ 1775 Sum of Factorials 数论,基础题

    输入一个小于1000000的正整数,是否能表达成式子:a1!+a2!+a3!+...+an (a1~an互不相等). 因为10!>1000000,所以先打1~10的阶乘表.从a[10]开始递减判 ...

  4. 1.6Java语言规范、API、JDK、和IDE

    要点提示:Java语言规范定义了Java的语法,Java库则在JavaAPI中定义.JDK是用于开发和运行Java程序的软件.IDE是快速开发程序的集成开发环境. 计算机语言有严格的使用规范.

  5. centos 8.3系统调优参数配置

    临时设置 最大虚拟内存 [root@Sonnarqube-dev ~]# sysctl -w vm.max_map_count=262144 执行结果 vm.max_map_count = 26214 ...

  6. Java:Java实例化(new)过程

    实例化过程(new) 1.首先去JVM 的方法区中区寻找类的class对象,如果能找到,则按照定义生成对象,找不到 >>如下2.所示 2.加载类定义:类加载器(classLoader)寻找 ...

  7. Java:Java的堆区、栈区和方法区详解

    Java内存空间理解 堆:堆主要存放Java在运行过程中new出来的对象,凡是通过new生成的对象都存放在堆中,对于堆中的对象生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理.类的非 ...

  8. 阿里云ECS问题 Login Incorrect , all available gssapi merchanisms failed

    1.阿里云ECS无法登录 Login Incorrect 阿里云ECS密码包含2个密码: 1.重置密码(实例密码也就是我们SSH远程连接的密码): 2.修改远程连接密码(在阿里云网页控制台上远程连接的 ...

  9. ROS2学习之旅(15)——编写简单的服务和客户节点(C++)

    当节点使用服务进行通信时,发送数据请求的节点称为客户节点,响应请求的节点称为服务节点.请求和响应的结构由.srv文件决定. 本文的例子是一个简单的整数加法系统:一个节点请求两个整数的和,另一个节点响应 ...

  10. 源码解析Java Attach处理流程

    前言 当Java程序运行时出现CPU负载高.内存占用大等异常情况时,通常需要使用JDK自带的工具jstack.jmap查看JVM的运行时数据,并进行分析. 什么是Java Attach 那么JVM自带 ...