Excel VBA 基礎(01.2)

接著上期的代碼說

Option ExplicitnnPublic Sub main()n n helloWorldn nEnd Subnn pop out the messagenPrivate Function helloWorld()n n MsgBox "Hello World!"n nEnd Functionn

第一行

Option Explicitn

變數強制申明, VBA版的"use strict;"。具體細節等介紹數據類型時再作介紹。作為一種優秀的編程習慣,【請在你們實務項目VBA文件的第一行加上這句話,Option Explicit】。相信我,這句話至少可以為你節省20%的調試時間。

Public Sub main()n n helloWorldn nEnd Subn

Public Sub main是此段VBA人代碼中的程序入口。main 是C系列編程語言默認的入口函數名,本教程也遵循這個傳統。入口函數之於整個程序,可以理解為引信之於爆竹,哪怕是包裹火藥再多,只要不點燃引信,就不會引發任何效果。上一節,當我們按下綠色向右箭頭 或是 F5 時,就相當於點火的過程。

綠色向右箭頭 或是 F5 觸發當前選擇Sub 的執行 ( 用游標點擊 Sub main() 的反括弧之後, 就是選擇Sub的過程。)

Sub中包裹著待執行的命令。Sub的範圍從 Sub聲明開始,到End Sub結束.[Sub中文譯為子進程,本人覺得相當不貼切,本教程中仍用Sub表示]

main 是這個Sub的名稱。本教程遵循 Java駝峰命名規則(多個單詞連綴時,後一個單詞的首字母大寫,如hello + world = helloWorld,get + cell + address = getCellAddress)。對於 Sub, Function 的命名,首字母小寫,Class, Module 首字母大寫。關於Class內部的命名,留待以後詳解。

Public為訪問控制符, 它表示此Sub在本模塊之外可見。此時在 開發工具 - 宏 中可以看到main 也註冊在其中。如果將Public改為Private, 從外部看不到此Sub了。

Sub 中的語句一般按從上往下的順序執行。本例子中,Sub中惟一命令就是helloWorld。之前我們介紹過,零參函數調用時括弧可以省略。因此也可以寫作helloWorld()

VBA解釋器(即,將VBA代碼轉換為Excel內部命令的程序) 讀到helloWorld的時候,它首先會在本Module中尋找關於helloWorld的定義。

pop out the messagenPrivate Function helloWorld()n n MsgBox "Hello World!"n nEnd Functionn

是不是與Sub結構很類似? 對! Function的範圍從 Function聲明開始,到End Function結束。Private 為訪問控制符, 你已經猜到了吧!

你又發現,Function內部也是由上自下順序執行。

此時VBA解釋器碰到 MsgBox。按慣例,它首先在本Module尋找MsgBox函數的定義,但是它沒找到(為什麼?)。此時它會再到本工程其他Module文件的非Private的Function中找,由於我們只定義了一個Module,仍然不會有結果。

最後一步,解釋器會查看內置函數,所謂內置函數,指系列將一些常用功能都打包,方便開發者使用。內置函數不用額外定義,默認包括在所有工程當中。MsgBox就是其中之一。

游標停留在目標函數名中

如果就某個內置函數需要解釋,選中函數名稱,按下F1,即可跳轉到相關說明頁面(IT行話叫api文檔)。不得不說微軟的開發社區還是蠻良心的。

api文檔告訴我們,MsgBox 會彈出提示框。這也就是你上一節所看到的效果。

到目前為止,我們初步接觸到了VBA工程(Project)以及Sub和函數(Function)。以前的新手教程均存在一個誤區(我也是那麼起步的),即一開始就從錄製宏命令入手。滿屏的無意義代碼除了順利達到3分鐘內勸退的效果可謂是百無益處。在我看來,VBA也是一門系統性的編程語言,有著其自身的語言邏輯。因此,從一開始即構建起良好的體系,培養正確的編碼習慣才是關鍵。有過一些VBA編程經驗的朋友們,如果你們操作工作表之前習慣性.activate,那麼說明你們錄製宏命令中毒已深。系統性解決方式才是VBA進階的真正出路。

關於VBA語言,由於本專欄偏向實踐,語言本身發展歷史相關(眾多教程的第一課)我們略去不表。我經常聽到,類似VBA消亡論,VBA由於其地位尷尬,一直處於爹不親娘不愛的狀態(程序員認為VBA太Low,不適用於大型項目開發;財務覺得VBA已經超越文科生的認知範圍,無疑是高大上的代名詞)總有一天會被取代。但是我認為,只要有Excel的存在,哪怕是語言本身缺陷以及相關開發生態的缺失,VBA都不會失去生存空間(類似的論調在Javascript和瀏覽器之間也經常出現)。兩者的緊密共生關係決定了在任何時候學習VBA都不會過時。

以上就是本人學習VBA過程中的感悟。扯遠了,先總結一下,等下期介紹過數據類型之後,再繼續講完函數知識點的後兩部分。

  • 函數是執行一定功能的封裝的代碼塊
  • 函數接收零個一個或多個參數
  • 函數有訪問控制符,可以控制本模塊之外的訪問
  • 函數調用為模式為, 函數名稱(參數),無參函數可以省略 括弧
  • 函數調用前需定義,內置函數除外
  • 解釋器查找順序為,先找本模塊,再找同一工程其他模塊,最後找內置函數

不知道這樣講述程度能否將相關問題向零基礎的朋友們描述清楚。如果你覺得進度太拖沓或是進度太快,請在下面留言,以下幾期我會進行相應調整。

本專欄所有文章著作權歸屬本人。未經本人書面許可,除知乎日報外,任何人不得轉載。


推薦閱讀:

7招教你構建一套成功的大數據基礎設施
「 BreakNg | 教程」bilibili視頻也可以加速播放
簡單人像:這可能是我看過最投機取巧的教程 | 專註挖坑一百年
速凍餃子烹飪教程

TAG:MicrosoftExcel | VBA | 教程 |