想要写一个博客也有很久了,不过作为一个划水菜鸟对所学的东西都不够深入,自觉没啥能晒出来的文章。今天服务工程课老师建议大家写写自己的技术博客,干脆就这个机会开始,给程序员的成长历程留点印记吧。
正好今天做了一个Excel投票的小工具,就这个开始吧。
那么按照套路先来说说背景故事。国人自小经历了大大小小的投票,写得一手好正字,这里不禁想到苏格兰公投一溜的竖线。不过涉及到统票的时候,一但人多票多,为了节省版面票根往往很小,字更小,数起来不免眼花,而且重复的统计稍一走神就不知道这一笔是画了还是没画,虽然未必对最终结果有什么巨大影响,但强迫症的我还是会觉得很难受,于是不禁萌生了写个投票工具的想法。鉴于每次投票的情形不尽相同,自由度很高,做个图形界面什么的太费事。在网上搜了下觉得用Excel来做很不错,修改也很方便。
说下整个过程吧。先来一张预览图:
这个表的结构就是使用了前三列,第一列是候选人的名单,第二列是得票数,第三列是按钮,点谁加谁,右边附了一个统计图。解决方案的思路参考了百度知道的问答,我对它进行了易用性上的扩展。
这个工具的主要技术点在于按钮的宏。主要步骤如下:
(1)建立一个Excel表,表头格式和图中一致,也就是说我们指定的计数范围是B2开始的B列。
(2)在Excel菜单栏的空白处双击,选择自定义快速访问工具栏。从“所有命令”中选择“控件”,然后添加、保存。
(3)到这一步的时候标题栏的位置就出现了一个小工具箱的图标,点击它插入ActiveX控件,选择按钮。
(4)调整按钮的大小和位置到你想要的地方,这里我们放置在了C列的第二格。(点之前的工具箱图标进入设计模式可以调整按钮的格式)
(5)使用填充命令将其下的列填上按钮,根据实际需求选择按钮的数量。
(6)默认情况下这些按钮的名字依次是“CommandButton1”、“CommandButton2”……下面按 Alt + F11 进入本sheet的宏编辑界面。
(7)对于投票这个系统,宏命令很简单,直接为对应格的数值加1,这里根据之前的设定代码如下:
1 Private Sub CommandButton1_Click() 2 [B2] = [B2] + 1 3 End Sub 4 Private Sub CommandButton2_Click() 5 [B3] = [B3] + 1 6 End Sub
(8)接下来算是一点小技巧吧。比如我有百八十个候选人,每一个按钮的宏结构是一样的,但脚标还有按钮编号都不一样,手动改自然很费事。所以下面提供一个文本处理的小程序,输入候选人数量,就可以生成宏文档了:
1 #include<iostream> 2 #include<fstream> 3 4 using namespace std; 5 6 int main() 7 { 8 int i,n; 9 10 cout << "Please input the number of total candidates:" << endl; 11 cin >> n; 12 13 ofstream fin("dest.txt"); 14 15 if(fin) 16 { 17 for(i = 0;i < n;i++) 18 fin << "Private Sub CommandButton" << i + 1 << "_Click()\n[B" << i + 2 << "] = [B" << i + 2 << "] + 1\nEnd Sub\n"; 19 } 20 21 return 0; 22 }
这样单个页面的设置及按需扩展基本没有问题了。画图表借助Excel的工具很容易完成。
最后再补充一点吧,现实的情况是这次投票不止一个项目,也就是说我需要多个sheet来记录多组投票的情况。理想化地全选粘贴了一下,果然不行。这个时候发现sheet自己带了复制功能,右击sheet1然后选择“移动或复制”,勾选“移至最后”和“建立副本”,就可以了。