ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5079|回复: 5

[求助] 滚动抽奖的停止按钮事件对textbox显示有影响吗?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-9-30 17:26 | 显示全部楼层 |阅读模式
下图是个滚动抽奖的程序,左侧显示滚动抽奖的结果,点击开始按钮开始滚动,点击停止按钮停止滚动;然后延迟数秒,将抽奖结果汇集到右侧的奖区。
但发现前后的左、右侧的抽奖结果不一致。
QQ截图20160930172243.jpg

依次逐等抽奖并集中抽奖结果-h.rar

56.38 KB, 下载次数: 110

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-30 17:27 | 显示全部楼层
  1. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '参数是长整形(毫秒数)。Lib “kernel32”标明这个函数是引用kernel32.dll提供的函数。Kernel32.dll是windows的四个核心库之一。是用来延时n毫秒的?
  2. Dim s As New Collection, f As Boolean, j%, n%, temp                                    '接受函数返回数组的temp不能 As String;不关闭ppt,上次的arr将一直存在,这是与在下面声明的差异
  3. Private Sub CommandButton1_Click()
  4. Dim i%, r%
  5. If s.Count < 50 And j = 0 Then               '不能用s.Count=0,连续调试时避免中断执行造成少于50个元素存在,一开始就无法进行j=1的初始化
  6.    TextBox2.Text = ""                        '清除界面的上次奖等数据
  7.    TextBox4.Text = ""
  8.    TextBox5.Visible = False
  9.    TextBox6.Visible = False
  10.    TextBox7.Visible = False
  11.    TextBox8.Visible = False
  12.    TextBox5.Text = ""
  13.    TextBox6.Text = ""
  14.    TextBox7.Text = ""
  15.    TextBox8.Text = ""
  16.    Set s = Nothing
  17.    For i = 1 To 50                           '抽奖号码准备
  18.        s.Add 800 + i, CStr(800 + i)
  19.    Next
  20.    j = 1                                     '抽奖序次初始化
  21.    TextBox4.Text = "三等奖"
  22. End If
  23. f = False
  24. If Me.CommandButton1.Caption = "停止" Then
  25.    Me.CommandButton1.Caption = "开始"
  26.    f = True
  27.    '勿将汇奖区的操作代码置于此处,否则可能出现抽奖区的号码与汇奖区的号码不一致(因为开始和停止按钮起发的两个过程会出现随机的时差错位),而应将其同置于抽奖代码周边,只是将其用if f控制好
  28. Else
  29.    Me.CommandButton1.Caption = "停止"
  30.    'MsgBox f & j                             '因只能在放映模式使用按钮,调试时变量监控点
  31.    n = --Mid(3321, j, 1)                     '抽取奖等的个数
  32.    Do
  33.       If f Then
  34.          Select Case j                       '操作汇奖区
  35.                 Case 1
  36.                      TextBox5.Text = s(--temp(0)) & " " & s(--temp(1)) & " " & s(--temp(2))
  37.                      TextBox5.Visible = True
  38.                      Sleep 800               '延时让抽中号码有机会显示在抽奖区,而非一闪而过飘到汇奖区,调试改为800
  39.                      TextBox1.Text = ""
  40.                      TextBox2.Text = ""
  41.                      TextBox3.Text = ""
  42.                 Case 2
  43.                      TextBox6.Text = s(--temp(0)) & " " & s(--temp(1)) & " " & s(--temp(2))
  44.                      TextBox6.Visible = True
  45.                      Sleep 800
  46.                      TextBox1.Text = ""
  47.                      TextBox2.Text = ""
  48.                      TextBox3.Text = ""
  49.                 Case 3
  50.                      TextBox7.Text = s(--temp(0)) & " " & s(--temp(1))
  51.                      TextBox7.Visible = True
  52.                      Sleep 800
  53.                      TextBox1.Text = ""
  54.                      TextBox3.Text = ""
  55.                 Case 4
  56.                      TextBox8.Text = s(--temp(0))
  57.                      TextBox8.Visible = True
  58.          End Select
  59.          'MsgBox n & j                         '调试时变量监控点
  60.          j = j + 1
  61.          If j = 5 Then
  62.             MsgBox "抽奖完毕!"
  63.             j = 0
  64.             Exit Sub
  65.          Else
  66.             For i = 0 To n - 1
  67.                 s.Remove (s(--temp(i)) & "")    '滤除已抽取号码
  68.             Next
  69.          End If
  70.          TextBox4.Text = Mid("三二一特", j, 1) & "等奖" '显示待抽的下一奖等
  71.          Exit Do
  72.       Else
  73.          temp = choose(50 - Mid("0368", j, 1), n) '扣减已抽取样本数量,50-Mid("0368", j, 1)选n
  74.          Select Case n                            '下框的抽奖区即时显示具体抽中号码
  75.                 Case 3
  76.                   TextBox1.Visible = True      '因上次抽特等奖时将其隐藏
  77.                   TextBox3.Visible = True
  78.                   TextBox1.Text = s(--temp(0)) 'choose作为字典的key已置为文本
  79.                   TextBox2.Text = s(--temp(1))
  80.                   TextBox3.Text = s(--temp(2))
  81.                 Case 2
  82.                   TextBox1.Text = s(--temp(0))
  83.                   TextBox2.Visible = False
  84.                   TextBox3.Text = s(--temp(1))
  85.                 Case 1
  86.                   TextBox1.Visible = False
  87.                   TextBox2.Visible = True
  88.                   TextBox3.Visible = False
  89.                   TextBox2.Text = s(--temp(0))
  90.          End Select
  91.       End If
  92.       Sleep 30
  93.       DoEvents
  94.    Loop
  95. End If
  96. End Sub
  97. Function choose(m%, n%)             '传回数组的函数不能声明为String,必须为vaiant
  98. Dim i%, dt
  99. Set dt = CreateObject("Scripting.Dictionary")
  100. Randomize
  101. Do
  102.    i = Int(Rnd * (m - 1)) + 1
  103.    dt(i & "") = ""                  '用字典的key来确保不重复抽取
  104. Loop Until dt.Count = n
  105. choose = dt.keys
  106. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-1 08:39 | 显示全部楼层
本过程采用一个在“开始”与“停止”之间切换的按钮(自然,两种按钮事件都指向了同一过程,用的是If Me.CommandButton1.Caption来控制所应进入的代码分支),用逻辑值f来控制无尽头的抽奖循环结束与否。
在开始按钮所激发的过程仍在运行(瞬时sleep转让控制权,让操作系统有机会接受停止按钮的指令取改变f值)时,可二次进入该过程执行“停止”按钮所引发的事件代码。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-1 20:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
下面是抽取三等奖是左右侧显示号码不同的屏幕捕捉图:
按下“停止”按钮后立即显示是图1;稍过一会儿(故意加语句sleep 800,让图1清晰可见),则显示为图2。很明显,抽取结果有变动,这究竟基于怎样的机理,如何避免呢?
图1.jpg
图2.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-1 20:43 | 显示全部楼层
上面恰巧有1个数字相同,但也会有三个数字不同;当然也会出现左右侧显示号码相同的情况。
经测试确有4个奖项左右都相同的情形,但测来测去总不时会出现有一个奖项左右不一致的!

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-12-4 10:27 | 显示全部楼层
删除集合元素代码有误,特此纠正:

依次逐等抽奖并集中抽奖结果--h.rar

73.93 KB, 下载次数: 170

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

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 19:40 , Processed in 0.043179 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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