各位朋友,你們好,今天和你們聊點VBA基礎知識:VBA變量。
注:
此文字數約3500字,主要是講解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】,就可以,我們看下圖的效果:
演示過程解析:
① 未設置強制申明變量,在未申明變量的狀態下,代碼可以正常執行;
② 設置了強制申明變量,在未申明變量的狀態下,無法執行代碼,提醒變量未定義;
③ 設置了強制申明變量,在申明瞭變量的狀態下,代碼執行通過。
擴展:如果不會寫【Option Explicit】,是否有快捷方法實現強制申明變量呢?當然有,請看下面動圖
VBE編輯器菜單的工具→選項→編輯器→勾選要求變量申明。確定後,每次插入模塊,都會在模塊前面增加【Option Explicit】
四、變量的類型
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>
演示效果如下:
演示過程解析(強制申明變量狀態下演示):
① 在模塊1中申明瞭變量a,在模塊1中運行通過;
② 切換到模塊2,Test2過程中有一個未申明的變量a,直接運行,提示變量未申請;
③ 用Private申明瞭變量b,然後將模塊1和模塊2過程中的變量都修改為b,在模塊2中運行通過,在模塊1中運行錯誤。
④通過演示得出結論,這兩種申明變量的方式生成的都是模塊級變量,只能在當前模塊中使用,跨模塊使用無效。
3、全局級變量:在該工程內通用的變量。
全局變量與過程級變量聲明的方式相同,都是寫過程前先聲明變量,全局變量的申明方式如下:
<code>Public 變量 As 變量類型/<code>
演示效果如下:
演示過程解析(強制申明變量狀態下演示):
① 在模塊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、靜態變量:
出現:當程序開始運行時,全局級代碼就儲存到內存中;
結束:當關閉工作薄時,變量佔用的內存才會釋放。
八、正確申明變量類型對運行時間的影響
我們直接來看一張動圖
動圖解析:
1、當不申明變量類型時,運行完成需要9.17秒;
2、當正確申明變量類型時,運行完成需要5..61秒;
3、如果換成更大量的數據、更復雜的運算,運行時間上的差距還會更大;
4、所以大家可以看到正確申明變量的總要性。
九、給初學者的建議
1、學習VBA是否一定要先學習變量?
①初學者不必馬上去學習定義變量的各種知識,直接寫代碼照樣可以入門;
②入門以後再學習定義變量的方法,並根據自己的認識取捨即可;
2、是否必須在程序開頭加上Option Explicit?
在電腦286、386時代,在DOS程序代碼時代,在內存僅16M,32M時代,你必須定義好每一個變量的數據類型,以便最高效地進行內存使用。即,一個口袋裡只有10元錢的人,要生活一週,於是你必須精打細算好每一分錢,否則就會餓死。
Option Explicit 的作用,就在於:如果你的程序沒有做到精確定義每一個變量的數據類型,編譯程序就會拒絕執行,它認為你太奢侈了,不懂得節約使用每一分錢。
而現在的電腦硬件環境,已經是過去的幾千倍了。每一個人口袋裡都有幾百萬的錢,還有必要去考慮一分錢、一元錢的用法麼?
3、是否需要dim 所有變量?
好處:不同的數據類型,佔用大小不同的字節,因此計算時對內存的佔用和運算效率有所不同。因此,定義變量數據類型以後,可能的好處是少佔用一些內存以及大量重複運算是提高計算速度。
壞處:由於各種類型佔用字節的限制,它所能代表的數值範圍受到了限制!如果初學者試圖去使用定義變量類型的方法時,往往尚未得到實際好處,即【運算速度提高】的好處(但實際運算量小時速度的差別很小、很小可以完全忽略不計)卻首先受到了因為不能恰如其份地定義好變量類型,而造成了變量溢出或衝突導致代碼無法運行的嚴重後果。
比如:如果你不瞭解Integer的範圍,在超出變量範圍的情況下使用就會提示出錯。比如“溢出“
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,完全可以先實戰後深入,不必花費太多時間再如何聲明好變量類型上,能事半功倍。拋開一些沒必要的東西先讓程序跑起來的確更重要。
我是上班下班,因為愛好辦公軟件、喜歡分享。所以來到這裡將我的學習心得和踩過的一些坑,和大家聊聊,希望大家學習我成功的經驗,避開我踩過的坑。我和你們一起進步。
好了,今天就聊到這裡,感謝各位朋友的關注和支持。
如果你喜歡我分享的內容,請點個贊支持下;
如果你覺得我分享的內容對你有幫助,可以關注我;
如果要看我以前分享過的好玩的內容,大家可以去我的主頁查看歷史文章。
閱讀更多 上班下班 的文章