想要寫一個博客也有很久了,不過作為一個划水菜鳥對所學的東西都不夠深入,自覺沒啥能曬出來的文章。今天服務工程課老師建議大家寫寫自己的技術博客,干脆就這個機會開始,給程序員的成長歷程留點印記吧。
正好今天做了一個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然后選擇“移動或復制”,勾選“移至最后”和“建立副本”,就可以了。
