【VBA基礎】變量的類型和申明變量類型的重要性

各位朋友,你們好,今天和你們聊點VBA基礎知識:VBA變量。

注:

此文字數約3500字,主要是講解VBA變量知識,通過一些動圖展示變量上的效果;

如果你是初學者,建議先收藏此文,看看最後給初學者的建議那一部分;

如果你是有一定的基礎,想詳細瞭解VBA的變量,提升代碼運行效率,可以詳細看看。


目錄如下:

一、變量的概念

二、變量的命名

三、變量的申明

四、變量的類型

五、變量的作用域

六、變量的賦值

七、變量的存活期

八、正確申明變量類型對運行時間的影響

九、給初學者的建議


一、變量的概念

變量是用於保存程序運行過程中的臨時值。和常量不同的是,變量是一個指定的內存位置,用於保存代碼執行過程中可以更改的值。

變量有兩種:動態變量和靜態變量

靜態變量和動態變量的區別:

動態變量:過程每運行一遍,動態變量的值會重置;

靜態變量:

過程每運行一遍,靜態變量的值還是上一次過程運行的結果。

我們用動態圖片來展示動態變量和靜態變量:

【VBA基礎】變量的類型和申明變量類型的重要性

動態變量和靜態變量


二、變量的命名

在VBA中,可以使用名稱來表示內存的位置,這個名稱就是標識符,可以理解為變量的名字。

變量命名的注意事項:

1、第一個字符必須使用英文字母或中文字符(中文版EXCEL支持中文字符);

2、名稱長度不超過255個字符;

3、名稱不能與VBA本身的Function過程、語句、即方法的名稱相同,避免衝突;

4、不能在同一範圍的相同層級中使用重複的名稱。


三、變量的申明

在使用變量時,需要告訴VBA程序,變量的名稱和數據類型,即聲明變量。

通常用Dim語句來聲明動態變量,用Static語句來聲明靜態變量。

聲明數據類型後,可以在計算機內建立一個指定的存儲位置,這樣在運行代碼時程序就會很快,內存利用效率很高,否則,計算機還要耗用很大的內存來判斷其數值類型,運行會比較慢。

1、申明變量的寫法

聲明變量通常都是在程序開始處,可以在同一行聲明多個變量,用英文逗號間隔即可。寫法如下:

Dim 變量1 As 變量類型,變量2 As 變量類型,……

Static 變量1 As 變量類型,變量2 As 變量類型,……

2、強制申明變量

要強制申明變量,直接在輸入代碼時最頂頭輸入【Option Explicit】,就可以,我們看下圖的效果:

【VBA基礎】變量的類型和申明變量類型的重要性

演示過程解析:

① 未設置強制申明變量,在未申明變量的狀態下,代碼可以正常執行;

② 設置了強制申明變量,在未申明變量的狀態下,無法執行代碼,提醒變量未定義;

③ 設置了強制申明變量,在申明瞭變量的狀態下,代碼執行通過。

擴展:如果不會寫【Option Explicit】,是否有快捷方法實現強制申明變量呢?當然有,請看下面動圖

【VBA基礎】變量的類型和申明變量類型的重要性

VBE編輯器菜單的工具→選項→編輯器→勾選要求變量申明。確定後,每次插入模塊,都會在模塊前面增加【Option Explicit】


四、變量的類型

【VBA基礎】變量的類型和申明變量類型的重要性

變量類型

VBA中的變量類型及相關參數,詳見上表,我們在申明變量時,要選擇合適的變量類型。

比如變量的值為整數,就把變量申明為Integer型;

如果變量的值是大於32767的整數,就要把變量申明為Long型;

如果變量是時間,就要把變量申明為Date型(在工作表中,時間是數值的一種;但是在VBA中,要根據情況明確;申明數值時,還要根據數值的形式、範圍選擇合適的數值類型)

注意:

1、Variant型(變體型)可以存放任何類型的數據,當指定為變體型時,不必在數據類型間轉換,VBA會自動轉換;

2、在程序中不特別說明時,均默認為變體型;

3、由於變體型存放空間大,因此不在特殊情況下不適用該類型。


五、變量的作用域

作用域就是變量使用範圍,VBA中有三種級別的作用域:過程級變量、模塊級變量和全局級級變量。

1、過程級變量:過程級變量只在變量所在的過程中有效。

<code>Sub Test()
Dim a As Integer
Debug.Print a + 1
End Sub/<code>

如上面這個Test過程,這裡申明的變量a,就只能用於此過程中。

2、模塊級變量:在同一個模塊內通用的變量。

與過程級變量聲明的不同方式在於,寫過程前先聲明變量,模塊級代碼的申明方式如下:

<code>方法①:Dim 變量 As變量類型
方法②:Private 變量 As 變量類型/<code>

演示效果如下:

【VBA基礎】變量的類型和申明變量類型的重要性

演示過程解析(強制申明變量狀態下演示):

① 在模塊1中申明瞭變量a,在模塊1中運行通過;

② 切換到模塊2,Test2過程中有一個未申明的變量a,直接運行,提示變量未申請;

③ 用Private申明瞭變量b,然後將模塊1和模塊2過程中的變量都修改為b,在模塊2中運行通過,在模塊1中運行錯誤。

④通過演示得出結論,這兩種申明變量的方式生成的都是模塊級變量,只能在當前模塊中使用,跨模塊使用無效。

3、全局級變量:在該工程內通用的變量。

全局變量與過程級變量聲明的方式相同,都是寫過程前先聲明變量,全局變量的申明方式如下:

<code>Public 變量 As 變量類型/<code>

演示效果如下:

【VBA基礎】變量的類型和申明變量類型的重要性

演示過程解析(強制申明變量狀態下演示):

① 在模塊1中申明瞭全局變量a,在模塊2中申明瞭全局變量b;

② 模塊1種Test過程中有變量a和b,運行通過;

③ 模塊2種Test2過程中有變量a和b,運行通過;

注意:

① 對於不同級的變量使用的原則,儘量使用過程級變量;

② 如果不同過程之間有共享值時,才使用全局級變量;

③ 要控制全局級變量的使用數量。


六、變量的賦值

1、給文本、數值、日期等數據類型變量賦值

語句為: Let 變量名稱 = 變量值(這裡的Let可以省略,即:變量名稱=變量值)

例如:

<code>Sub 變量賦值()
Dim str As String
Let str = "我是上班下班"
End sub/<code>

2、給對象變量(Object型,例如單元格)賦值

語句為:Set 變量名稱=對象(這裡Set千萬不能少。)

  例如:

SUB 變量賦值() 

Dim rng = Range

Set rng = Worksheets("sheet1").Range("A1")

rng.Value= "我是上班下班"

End sub


七、變量的存活期

變量的存活期就是指變量在內存中保留的時間,這個與變量的作用域有很大的關係。

1、過程級變量:

出現:當SUB過程開始執行時,過程級代碼才儲存到內存中;

結束:SUB過程執行完成時,變量佔用的內存就會立即釋放。

2、模塊級變量:

出現:當程序開始運行時,模塊級代碼就儲存到內存中;

結束:當關閉工作薄時,變量佔用的內存才會釋放。

3、全局級變量:

出現:當程序開始運行時,全局級代碼就儲存到內存中;

結束:當關閉工作薄時,變量佔用的內存才會釋放。

4、靜態變量:

出現:當程序開始運行時,全局級代碼就儲存到內存中;

結束:當關閉工作薄時,變量佔用的內存才會釋放。


八、正確申明變量類型對運行時間的影響

我們直接來看一張動圖

【VBA基礎】變量的類型和申明變量類型的重要性

動圖解析:

1、當不申明變量類型時,運行完成需要9.17秒;

2、當正確申明變量類型時,運行完成需要5..61秒;

3、如果換成更大量的數據、更復雜的運算,運行時間上的差距還會更大;

4、所以大家可以看到正確申明變量的總要性。


九、給初學者的建議

1、學習VBA是否一定要先學習變量?

①初學者不必馬上去學習定義變量的各種知識,直接寫代碼照樣可以入門;
②入門以後再學習定義變量的方法,並根據自己的認識取捨即可;

2、是否必須在程序開頭加上Option Explicit?

在電腦286、386時代,在DOS程序代碼時代,在內存僅16M,32M時代,你必須定義好每一個變量的數據類型,以便最高效地進行內存使用。即,一個口袋裡只有10元錢的人,要生活一週,於是你必須精打細算好每一分錢,否則就會餓死。

Option Explicit 的作用,就在於:如果你的程序沒有做到精確定義每一個變量的數據類型,編譯程序就會拒絕執行,它認為你太奢侈了,不懂得節約使用每一分錢。

而現在的電腦硬件環境,已經是過去的幾千倍了。每一個人口袋裡都有幾百萬的錢,還有必要去考慮一分錢、一元錢的用法麼?

3、是否需要dim 所有變量?

好處:不同的數據類型,佔用大小不同的字節,因此計算時對內存的佔用和運算效率有所不同。因此,定義變量數據類型以後,可能的好處是少佔用一些內存以及大量重複運算是提高計算速度。
壞處:由於各種類型佔用字節的限制,它所能代表的數值範圍受到了限制!如果初學者試圖去使用定義變量類型的方法時,往往尚未得到實際好處,即【運算速度提高】的好處(但實際運算量小時速度的差別很小、很小可以完全忽略不計)卻首先受到了因為不能恰如其份地定義好變量類型,而造成了變量溢出或衝突導致代碼無法運行的嚴重後果。

比如:如果你不瞭解Integer的範圍,在超出變量範圍的情況下使用就會提示出錯。比如“溢出“

【VBA基礎】變量的類型和申明變量類型的重要性

原始數據

【VBA基礎】變量的類型和申明變量類型的重要性

運行結果

4、動態數組是否必須定義?

Dim arr、Dim txt、Dim Num全部無意義,因為:

Dim arr 等價於 Dim arr As Variant
Dim txt 等價於 Dim txt As Variant
Dim Num 等價於 Dim Num As Variant

5、學習VBA,完全可以先實戰後深入,不必花費太多時間再如何聲明好變量類型上,能事半功倍。拋開一些沒必要的東西先讓程序跑起來的確更重要。


我是上班下班,因為愛好辦公軟件、喜歡分享。所以來到這裡將我的學習心得和踩過的一些坑,和大家聊聊,希望大家學習我成功的經驗,避開我踩過的坑。我和你們一起進步。

好了,今天就聊到這裡,感謝各位朋友的關注和支持。

如果你喜歡我分享的內容,請點個贊支持下;

如果你覺得我分享的內容對你有幫助,可以關注我;

如果要看我以前分享過的好玩的內容,大家可以去我的主頁查看歷史文章。


分享到:


相關文章: