VBA自學心得

🙌前言

因為工作的緣故,日常會接觸大量的Excel操作,過程不外乎都是一些重複又無趣的動作,也讓我起心動念要透過程式碼的方法來解決這些問題,我操作的軟體是Excel,那直接採用ExcelVBA的語言會是最佳的一個路徑。

程式語言終究還是一種與電腦溝通的工具,重點是你有什麼生活中的問題要進行實作,能夠解決問題的語言就是好語言。

以下是我在自學路上的一些心得,與各位做個分享。


💭自學心態

自學必須要有目標,達成目標之後才會有成就感。

想當初在學階段,學習新的事物其實並不了解是為了什麼,僅認知到是為了考試而讀書,也因此學完的東西沒有被應用,久而久之就還給老師了。

出社會的時候,生活上有各式各樣的問題等待被解決,而此時的目標便是找出解決問題的答案,無論是實體書、線上課程或網路上的資源,學習資源一直都有,此外還需要具備足夠探索的時間,否則在交卷期程的壓力下,你肯定會土法煉鋼趕緊交差了事。

  • 找出生活中的應用目標
  • 設定足夠找答案的時間

找尋應用目標

可以先朝著很常碰到每次都花很多時間的方向去找題目,VBA的主要功能就是簡化流程、處理大量的重複性問題,包含資料的建檔、匯入、輸出報表...等,一個專案只要可以遵循20/80法則,先處理80%的麻煩事,對於整個專案的執行就會輕鬆很多了!


🎯基本技巧

程式碼只是一種溝通語言,不需要把整本字典拿出來一字一句去背,只需要挑選對你有幫助的語法來組成剛好可以解決你的問題的內容就好,對於VBA來說大部分的內容網路上都會有說明,以下會建議學習順序與參考資料

資料庫概念

在正統資料庫的設計上有所謂正規化的概念,目的是將資料庫的內容以最小單元的方式進行,通常是記錄文字內容而已,如有圖片或檔案則以外部連結進行替代。

Excel的單元分類

  1. 儲存格(cell)
  2. 欄(column)、列(row)
  3. 工作表(sheet)
  4. 活頁簿(workbook)

儲存格以每格存放一個資料為原則,避免跨格合併的方式進行資料存放。

開發人員環境

Excel預設會把開發環境關起來,先把開發環境開起來才有地方寫程式碼。

VBA環境設定-GT Wang

開發單元

Sub的概念其實就是腳本執行的單元,可以透過按鈕指定巨集執行,也可以透過其他Sub來呼叫(call)執行,此外Function也是類似的概念,不過它還可以額外回傳結果。

Sub vs Function-GT Wang

資料型態

雖然VBA本身不太要求正確的資料型態,算是比較不嚴謹的語言,但了解一下double、string、integer、date、object之間的差異會比較好在程式碼最上層寫下Option Explicit,會使撰寫過程必須要宣告參數的資料型態,有助於達成良好的程式寫作習慣(未來轉換到別的語言比較不會那麼痛苦)。

VBA資料型態-GT Wang

邏輯操作

腳本執行過程通常會有條件判斷跟迴圈循環,根據實際需求演算,看範例才會清楚,不外乎就是 if else、for i=1 to n、do loop ... 等。此外關於如何加減乘除、等於不等於之類的運算子也是會被參雜在其中,這也是必須要知道的。

VBA運算子-GT Wang

VBA條件判斷-GT Wang

VBA迴圈控制-GT Wang

除錯技巧

程式撰寫過程必須要知道所設定的參數是不是有如想像中的執行,因此學會利用debug.print及查看區域變數視窗是最基本的要求,爾後再導入單元測試的概念即可。

Excel VBA的眉眉角角-除錯技巧

介面操作

對於使用者而言,透過按按鈕來執行程式碼非常直觀,經過多年的使用習慣大部分的操作介面都是如此,若是在比較古老的程式也許會使用菜單進行。

按鈕可以出現在工作表也可以在表單(Userform),工作表本身也可以算是一個介面,很多人也會使用這樣的設計方法,在工作表上面按按鈕去執行相對應流程,然而表單的使用比較可以讓使用者照著自己的流程進行,不會跳來跳去

表單屬於比較進階的部分,先讓程式可以按按鈕執行就好

VBA按鈕執行-GT Wang

發布方式

程式寫完之後,在本機可以直接開始使用通常沒有問題,怕就是會遇到巨集封鎖這類的安全性保護機制,對於一般使用者來說,看到這個就會心生疑慮,如果開發者是你可信任的就可以解除封鎖或者加入白名單就好。

解除封鎖巨集

加入白名單

⚙️拆解單元

解決問題的方法若能夠進行良好的拆解對於程式碼的撰寫過程會有極大的幫助,也有助於釐清思緒並在次單元的完成過程中獲得滿滿的成就感,每個案子都會有自己的心智圖,每一個分支都有自己要完成的事,光一個產生報表的行為,就能拆解成

  1. 去哪裡找資料
  2. 收到資料要如何篩選
  3. 篩選資料要如何排序
  4. 排序完要放入報表
  5. 報表產出是什麼格式

程式碼就是一連串的小流程,不斷的堆疊而成的專案

不要太貪心一次想要完成全部的功能,透過sub或者function把每個階段要做的事情做良好的拆解並完成,比較不會中途放棄,之後在偵錯過程比較好了解哪邊有錯誤。


🔎尋找答案

尋找答案時,必須要了解如何清楚描述問題,沒有人有辦法回答不明確的內容。

買書的必要?

當初我為了學習這項語言買了不下10本工具書,發現其實都大同小異,初學者可以去圖書館找一本順眼的來看基本語法,有範例的那種最好。這一步是為了要讓你確定你喜不喜歡VBA,不建議一開始就花錢。

若是覺得自己真的看得懂的時候,我建議買一本比較新的來當作工具書(畢竟書比較便宜?),工具書的意義就是需要的時候再來查,查個幾次基本上熟悉了,此時也會有一些實作程式碼範例留存在電腦中,等之後遇到同樣的問題就會知道哪邊有寫過,直接複製貼上(?)。

AI時代來臨

AI時代的進步讓上述的流程又能更加精簡,當然上網google找答案還是需要的,有時問AI問題若不夠精確時會產生幻覺,複製貼上的程式碼動不起來就是動不起來,畢竟...程式碼會卡住那就是無效內容,為了讓他100%可以運作有時候還是需要人工介入。

問問題的方法

當你為了這項問題努力試著去找答案時發現真的無法解決,只要願意把你的範例操作步驟爬文內容給描述清楚,相信還是有願意幫助你的人(畢竟在社會上沒有人有義務回答你的問題,一切都是良心驅使)。

範例

可以是檔案、截圖、螢幕錄影

操作步驟

描述完整的操作過程,每一次過程預期會發生什麼事,但現在發生什麼問題

爬文內容

把目前遇到的問題問AI或Google搜尋,嘗試過哪些方法?

好站連結

🔗PAPAYA電腦教室-EXCEL基本教學

🔗IT邦幫忙-ExcelVBA的眉眉角角

🔗VBA程式設計-GT.Wang