2008年10月6日

第一次認真寫 VBA --> Report Generator

本篇範例可以到這裡下載。裡面的程式才是最正確的,下面抓的圖有點舊XD
由於最近公司要辦活動,必須統計每堂課的報名狀況,
無奈報名系統產出的 Excel 太過基本,無法快速產出老闆想要的報表,
因此開始試圖用 VBA 自動完成一些重複性高的手動作業
也是我第一次撰寫簡單的 VBA 應用程式,過程還蠻好玩的 (雖然害我少睡很多)
因此以下按照報表產生的步驟來介紹一些我用到的方法和心得:
  1. 首先我做了一張 sheet (Settings),裡面放了一些 Report 的相關設定,
    未來可以繼續擴充,目前最重要的設定是課程名稱和 Worksheet Name的對應,
    例如「A_Very_Long_Name_About_SaaS」對應到「SaaS」,像下面這樣:
    Blog_Set_Worksheet_Name
  2. 接下來是將報名系統產生的 Excel 資料貼到 "Original Data"中,
    並且調整適當的標題,做好資料的排序,再加上「統計資訊」的區塊: 
    Blog_Original_Data_Sortedjpg 
    其中在統計資訊的部分,公式長的像這樣:COUNTIF(D:D,J2)

    這樣的原始資料的問題在於,由於在報名過程中每天的報名人數都會變化,
    如果要用這張 Worksheet 來統計每日 (或每堂課)的報名人數,
    就必須每天調整公式中的 Range
    因此最好是能將每堂課的資訊各自獨立到一張 Worksheet 中,
    如此統計資訊的公式中的 Range 就可以使用整個「欄」, (像上面那樣)
    而不用根據每天的資料筆數來調整公式中的 Range。

    而上述這個「將每堂課的資訊各自獨立到一張 Worksheet 中」的動作,
    如果要每天手動去複製就相當的麻煩,而且複製前還必須要先刪掉舊資料,
    因此如果能透過 VBA 自動將每天報表中的每堂課的資料抽出來放到相對應的 Worksheet 中,統計的公式就會自動計算出最後結果,省時省力。

  3. 在主要的 VB Sub Routine 中,首先會先 loop 過整個 Workbook 內的 Worksheet,
    並且將目前 Worksheet 中已經存在的舊資料刪除,程式像下面這樣:
    Blog_Clean_Worksheet_Data 

  4. 若是第一次執行這個 Sub,要把以下的註解取消,以便根據 Worksheet 名稱來新增 Worksheet,如同註解中說的,看來 VBA 不支援 Try Catch
    Blog_Add_Worksheet
  5. 接下來就會抓取步驟一中設定的對應關係,並且將"Original Data"的標題以及統計資料列複製到每堂課程的 sheet中 (如此每張 sheet 的 Layout 都會是相同的):
    Blog_Main_Process

    其實以上就是這個 Sub 最主要的內容了,接下來會解釋「CopyTitleAndStatistics」和「ProcessData」做的事情。

  6. 實際上執行「複製標題列及統計資訊」的是「CopyTitleAndStatistics」,
    主要的程式像這樣:
    Blog_Copy_Title

  7. 而「ProcessData」則是分成兩段,首先要根據課程名稱,在 HR 原始報表中找出該課程的相關資料(With 區塊主要參考 Excel 內建的範例程式):
    Blog_Search_Source_Data_Area
  8. 接下來則是計算要負制的範圍,並且根據資料筆數來計算 Target Worksheet 要貼上的範圍:
    Blog_Calc_Targt_Data_Aea
  9. 最後產出的報表長的像這樣:
    Blog_Report

    在 "Original Data" 之後已經依據 "Settings" 內的設定自動產生好相對應的 Worksheet,並且將該堂課程的資訊貼進去,這樣就可以檢視每堂課的報名人數統計了。 

  10. 另外我還手動作了一張 "Report Overview" 的 Worksheet,有 summary 的功效:
    Blog_Overview
經過這次的練習,我有以下的心得:
  • 首先要先想好最終要產出的文件到底長甚麼樣子,才能分析裡面有哪些東西可以透過程式自動幫你完成 (或者透過痛苦的反覆人工作業來了解XD)
  • 其實 VBA 還蠻方便的,最大的好處是卡住的時候只要錄個巨集,就能很快的了解狀況,因此說明文件雖然不如 MSDN 好用,但還不致於會造成太大困擾。
  • VBA 也提供方便的 Debug 功能,像是即時運算視窗監看式等等,
    雖然用起來不太習慣,也有一些限制,但還是比 ASP 好太多了
Future Work:
  • 註解裡面有些記錄到嘗試失敗的部分,有空的時候可以再努力看看
  • 目前的 Report_Overview 中的儲存格內容是手動一格格設定的,應該VBA也辦的到
  • 在產生每堂課的 Worksheet 時,可以間隔的設定索引標籤顏色,這樣可讀性更高
平常實在沒甚麼機會接觸 VBA,除非遇到像這種久久才用到一次的報表,希望下次還有其他機會可以練習 :p

沒有留言:

Google Spreadsheet 裡用規則運算式

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