VBA中重要的強制申明,誰看誰明白
Hello,各位同學們大家好。
前幾次的VBA分享,在留言區收到了很多同學的實際需求。大家的支援,是我們持續分享的動力。
這邊會逐漸將大家的需求融進案例中,也希望大家繼續在留言區和我們分享你們的VBA使用心得和工作需求。
還是老規矩,看看我們走到哪裡了。
好了,閒話不多說,直接上乾貨~
1.強制申明
行話說:強制申明用得好,VBA臭蟲(bug)減不少
先看下W3Cschool上的解釋:
VBA使用Option Explicit語句自動提醒你正式地宣告你的變數,這個語句必須放在每個模組的最上面。如果你試圖執行一個含有未定義的變數的過程時,Option Explicit語句會讓VB產生一個錯誤資訊。
這解釋也太不友好了,用能聽懂的話,怎麼說?
用大白話說,強制申明就是:在一段程式中,我們明確告訴VBA將要使用哪些變數,如果遇到其他沒有說的變數,VBA直接報錯提醒。
上面的大白話仍然不是很好理解,我們看個例子。
案例:在「單元格B2」輸入不同的行號,點選「顯示答案」按鈕,計算「F列」和「H列」的乘積,並將每個乘積結果加上公共值「單元格B4」的50,將最終結果顯示在相應的單元格
自信的我們寫完程式碼,點選「顯示答案」按鈕,以為答案是這樣
但其實,結果是這樣
看到結果的你,肯定心裡一萬匹馬飄過,“VBA,你這是在侮辱我的智商嗎?”
但是,作為行業老溼機的我們,深知——好的程式,都是調試出來的。
我們默默的開啟VBA程式碼,猛地一看,這程式沒問題,又是一萬匹馬飄過
那麼,我們只能使出自己的殺手鐗——一句句檢查程式碼
(1)點選「顯示答案」按鈕,VBA自動找到關聯的程式「四則運算」按鈕
(2)讀取第1句「x = Cells(2, 2)」
VBA說:
先看右邊,「Cells(2, 2)」我認識,表示「單元格B2」,它的值是4。
再看中間,「=」我認識,表示賦值的意思。
再看左邊,「x」我不認識,那它就是變數,我要新建一個名叫x的變數。
最終結果就是——新建了一個變數x,並且現在它的值是4。
[備註]
1.VBA遇到不認識的內容,就會新建一個變數;同時,如果該變數沒有賦值,就預設為0;
2.VBA執行語句次序為:從上到下、從右向左;
(3)讀取第2句「h = Cells(4, 2)」
VBA說:
先看右邊,「Cells(4, 2)」我認識,表示「單元格B4」,它的值是50。
再看中間,「=」我認識,表示賦值的意思。
再看左邊,「h」我不認識,那它就是變數,我要新建一個名叫h的變數。
最終結果就是——新建了一個變數h,並且現在它的值是50。
(3)讀取第3句「Cells(x, 10) = Cells(x, 6) * Cells(x, 8) + h1」
VBA說:
先看右邊,「Cells(x, 6)」我認識,x=4,所以它表示「單元格F4」,它的值是6;「*」我也認識,在VBA中表示「相乘」;「Cells(x,8)」表示「單元格H4」,它的值是5;「+」我認識,表示「相加」;「h1」我不認識,那它就是變數,我要新建一個名叫h1的變數,它沒有被賦值,那麼它的值就是0。
再看中間,「=」我認識,表示賦值的意思。
再看左邊,「Cells(x, 10)」我認識,x=4,所以它表示「單元格J4」,它的值根據左邊計算得出。
最終結果就是——「單元格J4」=「單元格F4」*「單元格H4」+ 0。
看到這裡,大家可能說,不是說所有的乘積「加上50」嗎?怎麼這裡都變為「加上0」了?
心細的同學已經發現了問題,我們誤把變數「h」寫為了「h1」,雖說二者僅多了個「1」,但是對於VBA這個嚴謹的傢伙來說,就是2個不同的變數,而由於「h1」是一個沒有被賦值的變數。
所以,其預設為0,也就最終釀成了一開始的大型事故翻車“命案”之VBA侮辱人類智商事件。
有同學可能就問了:猴哥,說了這麼多,這和我們今天的「強制申明」,有什麼關係?
又一個《肖申克救贖》的天台式微笑,悄悄上揚在我的嘴角
來,看程式碼,我們使用了「強制申明」,然後執行一下程式
有沒有很神奇,由於加入了「強制申明」,程式直接報錯,而且直接將出錯的「h1」批色顯示。
看到這裡,同學們肯定讚歎:厲害了!「強制申明」
為了進一步理解「強制申明」,我們將新增前後的程式碼做個對比
在「新增-強制申明」的程式碼框裡,我們發現多了2句話「Option Explicit」和「Dim x, h」。那麼,它們是什麼意思呢?
「Option Explicit」表示——告訴VBA接下來的程式我要使用強制申明。
「Dim x, h」表示——告訴VBA接下來的程式我只使用變數x和變數h,遇到沒見過的,你就警告窗報錯提醒我,並用藍色批註顯示它的位置,方便我修改。
因此,到這裡,我們就明白了——所謂的「強制申明」就是提前告訴VBA自己接下來要使用哪些變數,如果沒有告訴你,那該變數就不被支援,就要報錯提醒。
這好比法律,規定了哪些事情可以做?哪些事情不能做?如果你做了違法的事情,你就要接受法律的制裁。
所以,結合這個特點,在VBA裡使用「強制申明」,主要由以下3個主要優點(小本本記下來,我們下期考):
(1)正確使用「強制申明」能夠幫助我們快速定位錯誤程式碼,發現錯誤;
(2)正確使用「強制申明」能夠提升程式的執行效率;
(3)正確使用「強制申明」能夠幫助我們養成良好的程式碼編寫習慣,減少很多瑣碎的、不必要的麻煩;同時,方便被人理解和查閱程式碼。
[備註]
1.「Option Explicit」一定要寫在所有程式的最開頭位置;
2.「Dim」是VBA系統的保留字,用來定義VBA中的變數;
3. 99.99%的大牛都使用「強制申明」,有點業界潛規則的趕腳。
2.常量使用
有些時候,我們寫VBA程式碼難免會遇到一些固定的值,比如:前文例子的公共值50。
對於這種固定值,我們一般情況下都是提前定義一個變數,然後給其賦值,比如:k = 50,在後面我們多次引用這個變數k就行了。
但是,我們在日常工作中,經常出現修改這些固定變數的值,可是程式碼中多處引用的這個固定值,我要一個個去修改嗎?
為了應對這個“多處修改難題”,有些時候我們就會做一些懶癌晚期的蜜汁操作操作:在需要修改的地方直接重新定義變數k,然後給它賦新值,而不是找到原來那個變數,去修改它的值。
然後,然後就釀成了一起起杯具的“慘案”。別問我為什麼,我經常這樣幹,而且發生了很多“命案”。
原因是由於同名變數在VBA不同的地方被賦新值,從賦新值開始的地方,其後所有的程式碼都會引用這個新值。
這也就是為什麼有些同學,程式碼經常跑出一些神奇的值,而像這種因為給同一個變數賦不同的值,這種小錯誤是很難檢查出來。
同學們,肯定問:這種問題有沒有解決方案?
還真有,猴哥今天給你們分享一個非常實用的技巧,讓這種問題直接呆在它娘肚子裡,永不出來,生活已經這麼多歡樂了,請不要再給我增添更多尋找bug程式碼的快樂了。(手動狗頭.jpg)
只需一句程式碼,就能讓你解決上述問題
是的,我們在原來的程式碼中新增「Const k = 50」這句程式碼,就是告訴VBA要記住以下2點:
(1)該段程式碼我定義了1個常量k;
(2)常量k在定義後被賦值,下文如果重新賦值,請警告窗+批藍色告訴我
[備註]
1.VBA中定義一個「常量」需要使用關鍵字「Const」;
2.「常量」一般放在開頭位置,方便我們隨時修改。
3.今日總結
好了,說一下今日的知識點
(1)學會使用「強制申明」,養成良好的程式碼編寫習慣,從根源上減少bug
「強制申明」就是利用「Dim xxx」語句,提前定義VBA變數,目的是為了告訴VBA你接下來要使用哪些變數,未定義變數都是非法變數,需要警告窗報錯+批藍色告訴你
(2)學會使用「常量 Const」,能規避很多不必要的錯誤和麻煩
「常量」就是利用「Const xxx = xxx」語句,提前定義固定不變或多次引用的常量,目的是為了告訴VBA你定義了哪些常量,這些常量的值是一開始就固定好的,如果中間發生人為修改或重新賦值,需要警告窗報錯+批藍色告訴你
好了,同學們今天的分享就結束了
關於「強制申明」和「常量 Const」你學會了嗎?
推薦:人人都需要的資料分析思維