HI,大家好,我是星光。上一篇咱們了解了學習VBA必要的基礎知識:什么是VBA;什么是VBE;如何編寫和運行VBA代碼;如何保存包含宏的Excel文件——不知道你還記得多少?
如果你是新來的朋友,先微笑鼓掌歡迎,然后建議從上一章開始閱讀喔:什么是VBA?如何編寫和運行VBA代碼?
在第一章的時候咱們講過一句話,VBA是一門簡單的不像編程語言的編程語言,但既然是編程語言,哪怕再簡單,也必然有它自身的語法、規則和術語。你以前肯定接觸過語法這個詞吧?主謂賓還記得嗎?——別緊張,所謂語法,只不過是指語句中字詞的排列順序和規則。相比于人類的語言,編程語言的語法要簡單的多;而且棱角分明,不會出現模棱兩可的情況。
老婆給當程序員的老公打電話:親愛的,下班順路買十個包子回來,如果看到賣西瓜的,就買一個。
到了晚上,老公滿臉微笑,雙手捧著一個小不點的包子進了家門。老婆怒了:你怎么只買一個包子?老娘不是讓你買十個?
老公內心甚是惶恐,但語調依然冷靜,慢慢說道:你不是說如果看到賣西瓜的就買一個?我真的看到賣西瓜的了,你看,我還拍照留存了。
握手,都給我笑——兩人之間產生的誤解是因為語言思維習慣不一樣;老婆是人類語言的思維,包含了認知、語境和語氣等復雜的情況。老公是程序語言的思維,只有1和0,真和假,冰冰冷冷的邏輯。
攤手聳肩,我看到賣西瓜的了,所以我買1個包子,有什么不對呢?
如果你認真學習VBA,在持續被八阿哥(bug大爺的尊稱)折磨的死去活來之后,多少也會養成一些編程思維,然后……我這里有幾個榮譽稱號你要不要提前預選一下?杠精、辯手、沉默是金、自戀狂、物化者、邏輯達人、聰明的家伙、特立獨行的豬……
……在編寫VBA代碼時,我們會用到語句,語句是代碼中能夠引發動作的最小單位。我舉個例子,你今天心情不好,需要Excel彈窗發送一條彩虹屁。按照以下步驟,動動手,你就可以命令Excel完成你的愿望。
打開一個Excel工作簿,按<ALT F11>進入VBE窗口,在【菜單】中依次單擊【插入】→【模塊】,系統會自動生成一個模塊和該模塊對應的代碼窗口。在【代碼窗口】輸入以下代碼:
Sub 彩虹屁()
MsgBox '美好的事情你都用臉做到了,還有什么不滿足的?' & vbCrLf & '我對你的愛,就像拖拉機上山轟轟烈烈,你不知道嗎?!'
End Sub
按<F5>鍵運行該代碼。系統會自動彈出一個消息框,如下所示。上述代碼中的MsgBox就是一條語句,它的作用是在消息框中顯示信息。作為語句,它有語法規則,如下:MsgBox(Prompt[,Buttons][,Title][,Helpfile,Context])
第1個參數Prompt是必須的,是一個字符串,作為顯示在消息框中的消息文本,比如本例中的彩虹X內容。其余參數都是可選的,咱們這里只是講一下語法和語句的概念,可選參數的作用就以后再聊。
如上所述,VBA是一門編程語言,擁有自身的語法規則;語句是VBA代碼中能夠引發動作的最小單位。而為了完成某個任務,我們需要將多條語句有序組合,這樣就形成了VBA的過程(英文process的奇怪翻譯名)——所以所謂過程,就是為了完成某一目標,將多條語句有序組合的代碼結構。
按照功能和類型劃分,VBA的過程分為三種;子過程、函數過程和屬性過程。
屬性過程以Property作為標志開頭,極少用,談而無用,咱們就不談。
函數過程以Function作為標志開頭,可以返回值,常用于開發自定義函數,用到的次數也不太多,而且咱們現在也用不著,就以后再說。
子過程,也就是Sub過程,以Sub作為標志開頭。不論咱們上一節講的錄制宏,還是這節你讓Excel釋放的彩虹屁,都是Sub過程。事實上在VBA編程中,96%的情況都是使用的Sub過程;毫無疑問這也是咱們今后最常使用的;所以,就多說幾句,但入門階段也不需要說太多。
……咱們不談Sub過程詳細的語法、調用方法、訪問限制、參數和參數的賦值方式等,等你對VBA有一定的熟悉后,會有一個專門單章講這些。現在,只需要講一些必須知道的知識點。
Sub過程由程序外殼和代碼兩部分構成,簡化版的Sub過程語法如下。
看起來是不是很簡單?
程序外殼包括開頭的Sub 過程名和結尾的End Sub,這都是必須的。張明敏唱過,無論何時無論何地心中一樣……都不能省略。此外,程序名不能胡亂起,系統有一些要求,總結起來有以下幾點。
1>首字母不能是數字,比如521親愛的是不允許的。
2>不能包含標點符號和空格。
3>不能使用系統內置的保留字,比如Sub Sub。
4>同一個模塊中,不能有同名。
5>字符串長度不能超過255。
……
代碼部分由零到多行語句組成。是的,你沒看錯,代碼可以0行,也就是代碼完全省略。不過代碼省略后,過程也就沒啥用了。這就好比,你張了張嘴,卻一句話都沒說——玩深沉吶大哥?這年代不興了呀!
當代碼由多行語句構成時,程序總是按照從上到下的順序逐句執行。
我舉個例子,以下代碼可以在當前工作表的A1:A5區域輸入內容:我有一個夢想。
Sub 夢想家()
Cells(1, 1) = '我'
Cells(2, 1) = '有'
Cells(3, 1) = '一'
Cells(4, 1) = '夢'
Cells(5, 1) = '想'
End Sub
代碼先在A1單元格輸入一個'我',再在A2單元格輸入'有',其余以此類推……
任何程序都有三要素,順序、選擇和循環;代碼又是按照由上到下的順序逐句執行的;因此我們在編寫代碼前,請務必先梳理清楚任務執行的先后順序。所謂順序,可以先簡單的理解成先做什么,再做什么,后做什么。
聊完了Sub過程的概念和結構,下面咱們看段廣告提提神,然后再聊一下編寫代碼有哪些需要注意的事項和技巧。
小貼士:由于諸位大哥大姐弟弟妹妹現在也沒啥編程經驗,以下內容有一部分可能很難理解,那就不必理解,只是務必得知道有那么回事。這就好比學生哥被要求尊師重教愛國守法,他也不懂為什么,他也不會問,但他必須得知道,不然就成某地廢青了不是?
1>名稱問題
名稱包含了過程名稱和后面咱們會講到的變量名稱。名稱要符合規則,上面咱們也講了過程名稱的相關規則;此外,名稱起的盡量有意義些,這樣可以保證代碼的可讀性,便于自己和他人理解代碼。
劃重點:如果你是我知識星球的學員,這一點請務必遵守,不然批改您老人家的VBA作業實在是一件非常容易掉頭發的事——覺悟吧,少年,事到如今,只要一扯到頭發,你就應該明白問題的嚴重程度了!!拿過程名稱來說,指的是用一到多個詞簡化說明代碼的功能;最好在過程前面,或過程名稱后面增加詳細的注釋(什么是注釋?我待會就給你講)
至于變量名稱……這個規則稍微多些,就放到變量章節再說吧。VBA代碼使用縮進的形式表示代碼塊之間的層次關系,同一層次的代碼應該保持相同的左邊距,不同層次的代碼需要向右縮進指定距離,這個距離通常保持系統默認的4個空格的寬度就可以了。
依次單擊【菜單】→【工具】→【選項】,打開選項對話框,切換到【編輯器】選項卡,選中【自動縮進】復選框,編輯代碼時按一次Tab鍵,即可縮進指定的Tab寬度(默認為4個空格)。你問我什么是層次?層次可以簡單的理解為代碼的上下級隸屬關系。
我舉一個例子(不要懷疑,我的夢想就是舉例世界冠軍)
在上圖所示的代碼中。Sub和End Sub屬于第1層級,不必縮進;接下來聲明變量語句和For循環語句隸屬于Sub,屬于不同層次,因此向右縮進一個Tab鍵。IF語句在For循環語句內部,隸屬于For,因此需要再次向右縮進一個Tab鍵……
最后的MsgBox語句不在For循環語句內部,它和For是平級關系,只隸屬于Sub語句,于是只需要按一次Tab鍵。
需要說明的是,從VBA語法來講,縮進不是必須的,即便不縮進代碼也可以正常運行,但這樣的代碼很難閱讀和維護。不縮進的代碼只好比下圖所示神醫的手跡——千里快哉風,他娘的這是什么鬼畫符。為代碼添加注釋應該成為VBA初學者編寫代碼的好習慣。這樣做有兩個好處,一個是方便自己和他人閱讀代碼,可以比較快速的明白代碼的含義、編寫思路和代碼的功能。很多人寫了一段代碼,過幾天再看,完全不知道自己當初寫那代碼是什么鬼;這多半是沒有添加注釋的緣故——不過相比于第二個好處,這個好處其實是次要的。第二個好處是為代碼添加準確而詳細的注釋能夠幫助你梳理代碼的邏輯關系,加深對相關代碼功能的認知和記憶;這相當于你為自己的代碼做了一次深刻的理解筆記;相信我,對于VBA初學者而言,沒有什么比這更實惠的了。……注釋分為兩種,一種是咱們前面講過的為過程整體添加注釋,說明過程的功能和編程思路,常寫在過程的上部或過程名稱的后面。一種是為個別語句添加注釋,常寫在相關語句的后面。如果語句偏長,也可以寫在代碼的上或下。
在添加注釋的位置,先輸入一個半角撇號,再輸入注釋內容就可以了。注釋內容不會被系統執行,同時會被默認標注為綠色字體,這樣會方便用戶把注釋和代碼區分開來。
除了手工輸入半角撇號制作注釋外,系統還在工具欄中為用戶提供了【注釋塊】和【解除注釋塊】功能。
【注釋塊】可以將整段代碼設置為注釋,常用于代碼調試,或將部分代碼轉為備用狀態。
【解除注釋塊】顧名思義,可以將設置為注釋的整段代碼解除注釋狀態。
當一行代碼過長時,比如上面那段你讓Excel釋放彩虹屁的代碼,需要拖動滾動條才能夠看完整,這很不方便代碼的編輯和閱讀。
此時我們就可以將代碼強制換行。在需要換行的地方輸入一個空格,再輸入一個短下劃線_,然后按回車鍵,將后面的代碼移到下一行,最后再按一下Tab鍵,使換行的部分向右縮進,表示該行代碼隸屬于上一行。
有個姓羅的老師幾百年前說過,天下大勢合久必分,分久必合,既然有代碼換行就有代碼并行——也就是將多行代碼合并為一行。
如果需要將多行語句寫在同一行,不同語句中間用冒號分隔即可。如下圖所示。
……
好像沒啥要說的了……那就這樣吧,反正下期咱就又見面了。關注我,下期更精彩喔~再見。