1. 程式人生 > 實用技巧 >VBA中重要的強制申明,誰看誰明白

VBA中重要的強制申明,誰看誰明白

Hello,各位同學們大家好。

前幾次的VBA分享,在留言區收到了很多同學的實際需求。大家的支援,是我們持續分享的動力。

這邊會逐漸將大家的需求融進案例中,也希望大家繼續在留言區和我們分享你們的VBA使用心得和工作需求。

還是老規矩,看看我們走到哪裡了。

1.認識VBA:什麼是VBA?

2.這些掌握了,你才敢說自己懂VBA

3.VBA變數5年踩坑吐血精華總結

好了,閒話不多說,直接上乾貨~

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」你學會了嗎?

推薦:人人都需要的資料分析思維