本篇的目的以及需要解决的问题:
已知错误的分析和排查
如何一次抽取多名获奖者
把抽奖PPT修改成“一页抽一个奖项”(像篇一的头图那样)
如何把篇一中的白底文本框变成透明文本框
简单探讨如何把某一奖项指定给某一个人或某几个人
目前来看,大家碰到最多的问题是“Cannot find the name list file”,当然主要原因是我的代码不够严谨或者说容错机制不够。
文件名中包含“.txt”导致跟扩展名组成了“.txt.txt”
有时候我们的系统设置了“隐藏扩展名”,所以在保存这个namelist.txt的时候要注意选择“所有文件 (*.*)”,有些人可能习惯在桌面上右击新建一个文本文件再重命名,在隐藏扩展名的情况下,重命名应该改成“namelist”而不是“namelist.txt”,因为后一种情况下,它的实际文件名就是“namelist.txt.txt”导致找不到文件了。
抽奖PPT所在的完整路径中包含抽奖PPT的名称
听起来有点绕,举个例子。比如你的抽奖PPT名称是“2019年会抽奖.ppt”,然后它所在的目录是“D:2019年会抽奖.ppt”,换句话说它的完整路径是“D:Working2019年会抽奖.ppt2019年会抽奖.ppt”,这种情况下也会报找不到namelist.txt,因为在代码里使用了下面这段高亮的代码,程序会去尝试寻找“D:Workingnamelist.txtnamelist.txt”这个文件,当然就会报错了。解决的办法就是——确保抽奖PPT所在的目录结构中,没有哪一层目录名称包含PPT名称(含扩展名)。
OneDriver同步目录中的抽奖PPT
这是一个比较奇怪的现象,如果你使用Office 365套件或者OneDriver个人版,把抽奖PPT放到一个被同步到OneDriver云端的目录中,会无法获取正确的“ActivePresentation.FullName”属性,也会导致寻找namelist.txt失败。在这种情况下,“ActivePresentation.FullName”可能是一个网络路径,具体我也没去细细研究,只要知道解决办法就行了——把抽奖PPT和namelist.txt放到一个没有被同步到OneDriver的目录。换句话说,如果它们已经在OneDriver目录里了,把它们拷贝到另一个本地目录就行了。
用户定义类型未定义”的编译错误。
这种情况都是看文章不认真导致的
最后还要添加一个引用项,点击VBA窗口的菜单“工具引用”,勾选“Microsoft ing Runtime”,然后点击确定。
最后还要添加一个引用项,点击VBA窗口的菜单“工具引用”,勾选“Microsoft ing Runtime”,然后点击确定。
我暂时能想到的常见错误就这些了,如果还有其它的可以在评论区提出。另外还有一点需要注意——Office里面的VBA部分还是有点bug的,而且这种bug相对来说比较难调试,所以有两个建议:
确保在最终运行该抽奖PPT的电脑上进行抽奖PPT的制作和调试,千万不要在电脑A(Office版本a)上制作,然后到电脑B(Office版本b)上面去运行,电脑之间的差异可能无关紧要,但不同版本的Office之间很可能有意想不到的差异。
在保证上述第1条的前提下,尽可能使用最新版本的Office。
在保证上述2条的前提下,尽可能使用最新的文件格式(如.pptm),不要选择兼容模式。
在具体实现之前,让我们先把篇一中的基础功能版抽奖PPT做一些小的调整。首先,现在很多的电子屏幕都是16:9的宽屏了,为了投屏的时候有更好的效果,把PPT的页面调整为16:9。然后,再换一个合适的背景图片。最后再把控件的位置稍微调整一下。最终得到这样一样基础版PPT,本文的所有改动都基于这个基础版。
事实上在下图中的这个方法中本来就留有“一次获取多个随机值”的接口,只要给它传一个参数即可。比如一次抽取5名,则调用这个方法的时候用GetRandomString(5),它的返回是由逗号分隔的5个随机值组成的字符串。
具体来说,修改代码段C,改成这样。
因为上面修改了LoopString的调用方法,所以还要修改LoopString方法。找到代码段E,改成这样。
需要注意的是,这样修改之后,理论上“缺席”按钮已经不能再用了,因为现实中不太可能出现“5个人同时缺席”这种情