2010年2月7日

[Excel VBA] 將重複的機械化工作自動化-自製「Mark Answers as Black」、「Mark Answers as White」按鈕

今天分享一下最近用 excel VBA 做的小功能,在整理題庫的時候發現,想要把原本有題目&解答的word檔拆成兩份,一份仍然維持原本的格式,有題目&解答:

Q_And_A

另一份只要有題目就好:

Only_Q

這樣在練習解題的時候可以看第二份檔案,要查答案再看第一份檔案,那麼問題就來了:這份題庫一共有 15 章,每章有 60~80 題不等,總題數大約超過 1000 題!要怎樣在短時間內輕鬆的做出第二份檔案呢?

我想到幾個方法:

  1. 手動用滑鼠反白選取「Answer:」那行文字,然後用滑鼠點選文字顏色的設定,設成白色 –> 真的要這樣幹的話,大概直接點到中風比較快?!
  2. 手動用滑鼠移到「Answer:」那行文字之前,然後用「shift+end」選取整行文字,把顏色設成白色,之後再把滑鼠移到下一行「Answer:」文字之前,按F4重複上述設定顏色為白色的動作 –> 嗯,有用到 F4 來啟動 word 自動錄下的 macro,稍微有點進步,但是很不幸的,這份題庫的總題數大約超過 1000 題!所以還是放棄!
  3. 改進第二個作法,設法讓「再把滑鼠移到下一行「Answer:」文字之前,按F4重複上述設定顏色為白色的動作」可以自動化的對整份文件的內容執行,最好是可以按一個鍵就把整份文件的格式調整好,那麼就愉快了!

經過一番嘗試,完整的程式碼如下 (範例 word 檔可至這裡下載):

VBA_Code

最後的成果,左邊是有答案的版本,右邊只剩下題目,超過1000題只花了我10分鐘左右:

MIS_Answers

要實作這樣的功能並不困難,可歸納為以下幾個步驟:

  1. 先觀察一下要做的事情,如果是不斷重複的機械化動作,就要想到:應該可以用 excel 內建的 function / VBA 來完成
  2. 整理出一個可重複執行的流程 (如上述第二點),以程式的觀點來看就是每次跑迴圈時要執行的動作
  3. 以錄製巨集 (macro) 的方式,錄下手動操作一次該流程所產生的程式碼
  4. (視情況) 清掉錄到的程式碼中沒有用的東西 (可能是不小心手殘多按到無關的功能等等)
  5. 在這段程式碼之外加上一個迴圈
  6. test、test、test
  7. 加上註解,讓下次有需要使用的時候可以快速回憶

follow以上的流程,就可以大大簡化繁瑣的重複性工作,節省可觀的時間,心情也會比較好!聽說日本的上班族很會用 excel 的 function /VBA 來簡化例行性的工作,與大家共勉之 :p

補充:設定讓 Developer (開發人員) Ribbon 永遠顯示在工具列 (以 Word 2010 為例)

在 File –> Options 中,勾選 Developer:

Word2010_Options_DeveloperRibbon

在 Developer 這個 ribbon 內就可以編修、錄製 macro 囉:

Word2010_DeveloperRibbon

回頭爬了一下 blog 上面的文章,上一次寫跟 VBA 有關的文章居然已經是快要一年半之前了 (第一次認真寫 VBA - -> Report Generator),真是時光飛逝阿!

2 則留言:

坎尼 提到...

所以說你一點也不認真寫 VBA (誤

學好 VBA 在工作很有幫助
它可以幫忙處理很多小事 (比方講這篇 XD

我以前上班時常用 Excel + VBA 來處理資料,最後再用 SQL Server 的 SSIS 功能匯入資料庫,十分簡便 :D

Unknown 提到...

我哪有不認真寫 VBA,起碼現在對怎樣寫迴圈很熟 XD 我覺得這幾個步驟蠻好用的啦,照著走一遍就可以解決大部分的問題

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D