点击上方蓝色文字关注我们吧
大家好!早起例行上知乎,突然发现最热门的话题之一竟然又是“摸鱼”!
简单浏览一下内容,大意就是老板担心员工上班时假装工作、实则偷偷看小说打游戏,所以趁夜半无人潜入自家公司、“偷走”了所有键盘的alt键 ,让大家无法随意在小说窗口和Office窗口间来回切换 ……
老板的苦衷我们都很理解,不过“摸鱼”多少也算是人类天性,毕竟谁不想一边看着小说一边就把工资挣了呢?所以很多网友在这个新闻的评论中,提到了下面这种专业摸鱼的“单行阅读器”,没有alt键也不怕老板发现:
大家都知道,杨老师也是一名资深的摸鱼技术爱好者。之所以多年来一直宣传非计算机专业人士更应该学编程,就是希望大家能够提高工作效率、用1小时完成8小时工作,然后就可以拿出剩下的7小时合法摸鱼 ……
所以今天这个摸鱼神器自然引起我极大的兴趣,也十分佩服开发者的创意,尽管这个软件似乎是在降低工作效率,与我们学编程的目标完全相悖。
不过百度一下发现,这个软件因为内置功能非常全面,所以是使用C# 开发、打包成exe文件下载安装。然而很多公司禁止在工作电脑上安装可执行文件,而且很多使用过苹果电脑mac系统办公的朋友,恐怕也没法安装 exe 文件。
所以杨老师也突发奇想:咱们能不能直接使用Office自带的VBA实现类似的功能,也在办公文件里偷偷看小说?而且更进一步 —— 前面的演示都是用word,我们这次把它直接藏到平时更常用的Excel中!
想想似乎不难,于是杨老师拿了点时间,做出一个“单格阅读器”原型。像下面这样,只要在任意一个单元格上单击右键,它就可以自动翻页显示小说:
而且随便我们怎样调整单元格列宽,字数都会自动适应:
播放期间,还可以装作正在工作的样子随意操作其他单元格,不会影响小说翻页:
等到全文播放完毕,它还会贴心的帮我们把这个单元格恢复到摸鱼之前的内容,雁过无痕:
更贴心的是,我们可以随时更改显示小说的单元格,阅读进度会自动延续、不被打断。这样偶尔拖一拖滚动条变换一下页面,老板更不容易发现了:
怎么样,看到这里是不是有点动心?那么编写这样一个摸鱼神器是不是很复杂呢?其实杨老师只用了4个判断、1个循环,有效代码不过二十行左右,主要技巧也都是我们《全民一起VBA》讲过的四个知识点:文本文件、Range对象、工作表事件、定时器设置。
为了让大家更清晰的看懂代码,我把主要变量和函数都以中文命名,方便大家理解。完整代码如下,这里我分块简单介绍一下,有兴趣的同学可以参照代码中的注释详细研究:
第一件事,就是在工作簿中创建与一个标准模块,我们主要的代码都将写在这里。在演示案例中,杨老师把这个模块命名为 “Fishing” :
然后,在Fishing模块里定义几个全局变量,详细用途见代码注释:
接下来就是主要的两个子过程。首先是 “开始摸鱼” ,功能是在用户选择一个单元格开始播放后,执行(1)初始化小说内容(2)保存该单元格原始信息(3)设定当前播放位置 三个任务:
完成初始化工作后,上面的“开始摸鱼” 就会调用“显示下一页” 子过程。这个子过程是虽然代码很短,但却是整个阅读器的核心模块,重点解决了四个问题:
(1) 使用我们在《全民一起VBA 实战篇》中介绍的“定时器” —— Application.OnTime方法,实现每隔1秒钟就重新调用一次 “显示下一页” 、从而实现自动播放的效果;
(2) 每次执行“显示下一页”时,都会根据当前单元格的宽度与当前单元格的字体,计算本次显示多少个字;
(3) 使用字符串函数,从小说正文中取出指定位置开始的指定字数放到单元格中,实现“翻页”效果;
(4) 每次显示一页后,都检查是否已经达到小说结尾。如果是,则使用《实战篇》介绍的方法、配合全局变量 ClockTime 注销计时器,并且将单元格内容恢复为原始信息。
详细代码和注释如下:
好,核心代码到此结束!接下来我们只要在工作表模块中添加一个“右键单击”事件的响应代码,让用户每次右键点击一个单元格时都能够自动调用前面这个子过程、也就是标准模块Fishing中的“开始摸鱼”,整个程序就算大功告成:
实际效果怎么样呢?按捺不住激动的心情,亲自试验了一下!果然,单元格虽小但乐趣无穷,头一次觉得满屏数字竟也如此妩媚 ……
于是杨老师对着Excel盯了整整一个下午,从未担心过被老板发现、而且还重温到上学时偷看武侠小说的兴奋感,亲测有效!
等一下,好像有点不对劲 …… 我的老板?那不是我自己么 ……
所以,如果本周课程没有及时发布,还请各位读者原谅 ……
本文中心思想总结:“摸鱼”应当是在完成所有工作之后、仍无法离开公司时的无奈之举,而不应该与正常工作混在一起、拖延效率,这也是我们非计算机人士学习程序设计的正确目标,请大家不要效仿杨老师 ……