我在企業斷斷續續寫了三年半的 VBA 所學到的事

筆者在實習生時以 VBA 編寫員的身份進入 IT 業界,並慢慢成為軟件工程師。雖然是最讓人討厭的程式語言之一,但VBA 或許在意外的地方有所幫助。正值開學季節,也在此分享在企業進行 VBA 開發的感想和心得。

3LexW
6 min readSep 20, 2023

意想不到的入行方法

筆者是從大三上半年突然想轉跑道當 IT 方面的工作,而在那之前都是在讀金融和小量電腦的人,接觸過的程式語言就只有 VBA 和基本的 C++。雖然 VBA 成績不錯,但在網絡上的 IT 從業員都非常討厭 VBA 的情況下,筆者卻成為了企業財務部的 VBA 開發員。

什麼是 VBA?

VBA,全名 Visual Basic For Application,是主要圍繞 Microsoft Office 生態圈專用的程序語言。透過 VBA 自動化,用家可以在 Office 上執行自動化腳本,並有效提高效率。

很多用家以為 VBA 只是操作 Excel 試算表用,但這是錯誤描述:雖然 Excel 可以說是 VBA 的主戰場,但其實 VBA 可以同時操作 Word, PowerPoint, Outlook 等等 Microsoft 的軟件,並達到 Office 生態的自動化。

不被喜愛的程式語言

VBA 被 IT 社群視為最不受喜愛的程式語言,VBA 在 Stack Overflow 上面只有 20% 左右的人喜歡,更有 80% 受訪者害怕 VBA

簡單而論,VBA 被討厭的主因就是 Microsoft Office:

  • 想要學習一套程式語言而獲得更多的機會(例如可以開始學寫 Web App),VBA 顯然不是一個很好的選擇
  • Microsoft Office 作為運作平台令 VBA 的效能無法達到現代標準
  • VBA 的開發體驗並不友善(相對如 VS Code, IntelliJ 等的開發平台)
  • VBA 的執行環境並不一致(最簡單就是電腦語言和時間格式會影響輸出)
  • 前置成本( 特別在 Google Sheet 等出現後)
  • 線性執行腳本
  • 等等……

VBA 是(自成一國的)最強程式語言

不過,在為企業開發的環境中,VBA 卻成為了其中一個筆者的主要開發武器,而主因也非常簡單 — Microsoft Office:

  • 如果只需要在 Office 的環境中進行開發,VBA 的開發環境是最順暢的
  • VBA 的學習難度低,起手容易(只要安裝了 Office,VBA 的程式庫就隨之而來,不需額外安裝 package)
  • Office 內置的功能和函式庫都非常好用
  • Office 內置的功能都可以在 VBA 找到對應的程式碼,對 Office 的熟悉度越高,VBA 能夠提供的威力越強。
  • Microsoft 致力提高 VBA 的文件的易讀性,用家只需要簡單搜尋就可以輕易找到所需的函式(function),進階開發的難度亦很低。
  • VBA 可以進行輕易的檔案管理,並可以透過執行 Command Line 來進行延伸工作

總括而言,如果企業的生產力工具是以 Microsoft Office 為主的話,VBA 就可以有效地將生產力最大化。

試想像你的工作流程是從 Outlook 拿取帶附件的電郵,在 Excel 進行資料整理和分析,並將圖表製作出來之後送到 PowerPoint 時可以用一份 VBA 腳本可以完成,但在 Python 可能就要先使用 imap , pandas , matplotlib 三個模組包,然後還可能沒有辦法直接輸出成為一份 PowerPoint 檔案。

VBA 值得學嗎?

Stack Overflow 用家把 VBA 視為最恐懼的程式語言,其中主因是因為 Stack Overflow 的用家並不太會大量使用 Microsoft Office,又或者說,不至於會在 Office 上進行大量高重覆性工作,導致 VBA 的學習回報較低。

但筆者在會計部門進行 VBA 開發時,做的是會計部門的每日報表,每月報表,每季報表等等的自動化。複雜、枯燥、但又不得不做,想借用 IT 部門的資源,也要等對方騰出時間去收集你的要求,還要等待 IT 基礎(防火牆、伺服器等)打好等等。VBA 可以在極短時間內做好開發並投入使用,讓 VBA 仍然有學習的價值。

所以,要考慮是否學習 VBA 並進行開發時,要為你想自動化的工作流程考慮以下幾點:

  1. 你的工作流程有沒有中度至高度重覆性?(中度約為每一至兩個月一次)
  2. 你的工作是否主要集中於 Office 生態圈?
  3. 你的工作的資料來源是否來自 Office 生態圈(Word, Excel, PowerPoint, Outlook)、或者較常見的檔案類型(有排版的 txt 報表、csv)等
  4. 你所處的企業有沒有足夠的資源為你進行自動化,所花的時間要多久?

如果你覺得自己的工作流程內容符合 1, 2 和 3,VBA 自動化可以是很好的選擇,而如果 4 的結果是負面的話,或許就需要自行學習 VBA 來提升工作效率了。

如果你的工作資料來源可能是來至網絡資料,那就可能要學會一點網絡爬蟲,並將資料整理好,才需要進入 VBA 的部分。

VBA 對 IT 部門值得嗎?

如果你是 IT 部門,VBA 開發就有另外一個值得留意的地方,那就是維護問題。VBA 並沒有好 CI / CD 方案。但如果你想要把代碼匯出成 .bas檔案,並送到例如 Git 等地方進行版本控制仍然是可行的。不過,筆者對 IT 部門進行 VBA 開發保持觀望態度,主要原因就是因為這並非是 IT 人員首選語言,而導致開發時間長,代碼品質也未必很好。

不過,如果你是個人層面進行 VBA 開發,這份技術就以可以帶走並在下一個職場使用,那就非常值得了。舊代碼寫爛頂多就退回去人手運行而已,對企業也不會有什麼傷害。不過,在開發之前,請為了企業運作暢順而額外做以下的工作,以免因為腳本相關的意外而出現運作上的陣痛期:

  1. 保留腳本操作指引
  2. 保留源代碼,並進行妥善的備份
  3. 詳細記錄人手操作時的工作內容

我在 VBA 開發時所學到的東西

最後,留下一些在 VBA 開發時所用的小技巧,還有絕對不要犯的錯誤,未來有機會,就再寫文章介紹,有興趣可以留言給我:

  1. 別忘了寫 Comment,因為你一定會在三天連假後,或者兩年後回顧時失智
  2. 做好代碼備份
  3. 千萬不要寫 User Form,只要拿一張試算表並加上觸發按鈕或者條件限制就可以達到類似效果
  4. 把所有的來源資料取出,並放到一個獨立的文件夾後,才開始進行資料取出的操作
  5. 如果你的資料來源是一封電郵,請拜託寄件方把電郵的標題格式和附件的格式標準化,這樣會幫你省很多除錯的時間
  6. 善用 Enum 把一些打起來很煩的東西變成在 IDE 上就可以簡單取用的內容(例如試算表的名字,或者常用的顏色 RGB)
  7. 使用 Module 把常用的工作打包,並送到其他的試算表再用
  8. 雖然運行速度會更快,但不要關閉畫面更新,因為你看的到東西在運行時會舒服很多
  9. 如果你想要做 Lookup,而不需要在試算表展示函式的話,花點時間了解 Dictionary 資料結構會幫你做完很多工作
  10. 如果你的工作流程最後是送出電郵的話,不要用腳本送出去,絕對不要用腳本送出去,千萬不要用腳本送出去

--

--