01
圓括號(hào)的作用
Sub?過(guò)程艰额、內(nèi)置?語(yǔ)句和一些方法不返回值,因此參數(shù)不包含在括號(hào)中?。例如:
MySub?"stringArgument",?integerArgument
Function 過(guò)程买乃、內(nèi)置函數(shù)和一些方法會(huì)返回一個(gè)值,但可以忽略該值蝙搔。如果忽略返回值缕溉,則不包括括號(hào)。就像調(diào)用 Sub 過(guò)程一樣調(diào)用此函數(shù)吃型。省略括號(hào)证鸥,列出任何參數(shù),并且不將此函數(shù)分配給變量勤晚。例如:
MsgBox?"Task?Completed!",?0,?"Task?Box"
若要使用函數(shù)的返回值枉层,請(qǐng)將參數(shù)包含在括號(hào)中,如下面的示例所示赐写。
Answer3?=?MsgBox("Are?you?happy?with?your?salary?",?4,?"Question?3")
Sub 或 Function****過(guò)程中的?語(yǔ)句可以使用命名參數(shù)將值傳遞給?調(diào)用的過(guò)程鸟蜡。不管是否使用命名參數(shù),針對(duì)使用括號(hào)的指南都適用挺邀。當(dāng)使用命名參數(shù)時(shí)揉忘,可以按任意順序列出它們,并且可以省略可選的參數(shù)端铛。命名參數(shù)的后面總是跟有一個(gè)分號(hào)和一個(gè)等號(hào) (:=)泣矛,然后是參數(shù)值。
下面的示例使用命名參數(shù)調(diào)用 MsgBox 函數(shù)禾蚕,但它將忽略返回值您朽。
MsgBox?Title:="Task?Box",?Prompt:="Task?Completed!"
以下示例使用命名參數(shù)調(diào)用 MsgBox 函數(shù),并將返回值分配給變量夕膀。
answer3?=?MsgBox(Title:="Question?3",?Prompt:="Are?you?happy?with?your?salary?",?Buttons:=4)
02
變量生存期
變量保留其值的時(shí)間被稱為變量的生存期虚倒。變量的值在其生存期結(jié)束后可能會(huì)更改,但會(huì)保留某個(gè)值产舞。當(dāng)變量丟失范圍時(shí)魂奥,它不再具有值。
在過(guò)程開(kāi)始運(yùn)行時(shí)易猫,會(huì)初始化所有變量耻煤。數(shù)值變量初始化為零,可變長(zhǎng)度字符串初始化為零長(zhǎng)度字符串 ("") 准颓,固定長(zhǎng)度的字符串用 ASCII 字符代碼 0 或 Chr ( 0 ) 表示的字符填充哈蝇。Variant 變量初始化為空。用戶定義類型變量的每個(gè)元素都像單獨(dú)變量一樣初始化攘已。
聲明 對(duì)象變量時(shí)炮赦,空間保留在內(nèi)存中,但其值設(shè)置為 Nothing样勃, 直到使用 Set 語(yǔ)句為其分配對(duì)象引用吠勘。
如果變量的值在代碼運(yùn)行期間未更改性芬,它會(huì)保留其初始化的值,直到丟失范圍剧防。
用 Dim 語(yǔ)句聲明的過(guò)程級(jí)別變量將保留一個(gè)值植锉,直到過(guò)程完成運(yùn)行。如果該過(guò)程調(diào)用其他過(guò)程峭拘,當(dāng)這些過(guò)程運(yùn)行時(shí)俊庇,該變量也會(huì)保留其值。
如果使用 Static 關(guān)鍵字聲明過(guò)程級(jí)別變量鸡挠,則只要代碼在任何模塊中運(yùn)行辉饱,變量就保留 其值。當(dāng)所有代碼都運(yùn)行完畢時(shí)拣展,變量將丟失其范圍和值鞋囊。其生存期與模塊級(jí)別變量相同。
模塊級(jí)別變量與靜態(tài)變量不同瞎惫。在標(biāo)準(zhǔn)模塊或類模塊中,它保留其值译株,直到代碼停止運(yùn)行瓜喇。在類模塊中,只要類的實(shí)例存在歉糜,變量便會(huì)保留其值乘寒。模塊級(jí)別變量將一直消耗內(nèi)存資源,直到重置其值匪补,因此請(qǐng)僅在必要時(shí)使用這些變量伞辛。
如果在 Sub 或 Function 語(yǔ)句之前包含 Static 關(guān)鍵字,則過(guò)程中所有過(guò)程級(jí)別變量的值在兩次調(diào)用之間保留夯缺。
03
遞歸過(guò)程的運(yùn)用
過(guò)程只有有限的空間量供變量使用蚤氏。過(guò)程每次調(diào)用自身時(shí),都會(huì)有更多空間被占用踊兜。調(diào)用自身的過(guò)程稱為遞歸過(guò)程竿滨。不斷調(diào)用自身的遞歸過(guò)程最終會(huì)導(dǎo)致錯(cuò)誤。例如:
Function?RunOut(Maximum)??RunOut?=?RunOut(Maximum)?End?Function
當(dāng)兩個(gè)過(guò)程無(wú)限期地相互調(diào)用或者永遠(yuǎn)無(wú)法滿足某個(gè)用于限制遞歸的條件時(shí)捏境,此錯(cuò)誤可能不太明顯于游。遞歸確實(shí)有它自己的用途。例如垫言,以下過(guò)程使用遞歸函數(shù)計(jì)算因子贰剥。
Function?Factorial?(N)??If?N?<=?1?Then?'?Reached?end?of?recursive?calls.??Factorial?=?1?'?(N?=?0)?so?climb?back?out?of?calls.??Else?'?Call?Factorial?again?if?N?>?0.??Factorial?=?Factorial(N?-?1)?*?N??End?If?End?Function
應(yīng)測(cè)試遞歸過(guò)程以確保它不會(huì)太多次調(diào)用自身從而導(dǎo)致內(nèi)存不足。如果出現(xiàn)錯(cuò)誤筷频,請(qǐng)確保過(guò)程沒(méi)有無(wú)限期地調(diào)用它自身蚌成。隨后前痘,嘗試通過(guò)以下方法節(jié)省內(nèi)存:
消除不必要的變量。
使用除 Variant 之外的 數(shù)據(jù)類型笑陈。
重新評(píng)估過(guò)程邏輯际度。通常可以用嵌套循環(huán)代替遞歸涵妥。
04
數(shù)組的使用
可以聲明一個(gè)數(shù)組以處理一組相同數(shù)據(jù)類型的值乖菱。?
數(shù)組是具有多個(gè)可存儲(chǔ)值的隔離艙的單個(gè)變量,而典型的變量只有一個(gè)存儲(chǔ)隔離艙蓬网,其中只能存儲(chǔ)一個(gè)值窒所。?
可以在需要引用數(shù)組中包含的所有值時(shí)將數(shù)組作為整體引用,也可以引用其中的單個(gè)元素帆锋。
例如吵取,若要存儲(chǔ)一年中每天的日常開(kāi)支,您可以聲明一個(gè)具有 365 個(gè)元素的數(shù)組變量锯厢,而不是聲明 365 個(gè)變量皮官。數(shù)組中的每個(gè)元素包含一個(gè)值。以下語(yǔ)句聲明具有 365 個(gè)元素的數(shù)組變量实辑。默認(rèn)情況下捺氢,數(shù)組的索引從零開(kāi)始,因此該數(shù)組的上限是 364 而不是 365剪撬。
Dim?curExpense(364)?As?Currency
若要設(shè)置單個(gè)元素的值摄乒,可以指定該元素的索引。以下示例向該數(shù)組中的每個(gè)元素均分配一個(gè)初始值 20残黑。
Sub?FillArray()??Dim?curExpense(364)?As?Currency??Dim?intI?As?Integer??For?intI?=?0?to?364??curExpense(intI)?=?20??Next?End?Sub
更改下限
可以使用模塊頂部的 Option Base 語(yǔ)句將第一 個(gè)元素的默認(rèn)索引從 0 更改為 1馍佑。在下面的示例中 ,Option Base 語(yǔ)句更改第一個(gè)元素的索引 梨水,Dim 語(yǔ)句聲明包含 365 個(gè)元素的數(shù)組變量拭荤。
Option?Base?1?Dim?curExpense(365)?As?Currency
也可以通過(guò)使用 To 子句明確設(shè)置數(shù)組的下限,如以下示例所示疫诽。
Dim?curExpense(1?To?365)?As?Currency?Dim?strWeekday(7?To?13)?As?String
在數(shù)組中存儲(chǔ) Variant 值
有兩種方法可以創(chuàng)建 Variant 值的數(shù)組 穷劈。?
一種是聲明 Variant 數(shù)據(jù)類型的數(shù)組,如以下示例所示:
Dim?varData(3)?As?Variant?varData(0)?=?"Claudia?Bendel"?varData(1)?=?"4242?Maple?Blvd"?varData(2)?=?38?varData(3)?=?Format("06-09-1952",?"General?Date")
另一種方法是將 Array 函數(shù)返回的數(shù)組分配給 Variant 變量踊沸,如以下示例所示:
Dim?varData?As?Variant?varData?=?Array("Ron?Bendel",?"4242?Maple?Blvd",?38,?_?Format("06-09-1952",?"General?Date"))
無(wú)論使用哪種方法創(chuàng)建數(shù)組歇终,均可通過(guò)索引識(shí)別 Variant 值的數(shù)組中的元素。例如逼龟,以下語(yǔ)句可添加到上述兩個(gè)示例中的任意一個(gè)示例中评凝。
MsgBox?"Data?for?"?&?varData(0)?&?"?has?been?recorded."
使用多維數(shù)組
在 Visual Basic 中,您可以聲明最多包含 60 個(gè)維度的數(shù)組腺律。例如奕短,以下語(yǔ)句聲明了一個(gè)二維宜肉、5*10 的數(shù)組。
Dim?sngMulti(1?To?5,?1?To?10)?As?Single
如果將數(shù)組看作矩陣翎碑,則第一個(gè)參數(shù)表示行谬返,第二個(gè)參數(shù)表示列。
使用嵌套 For...處理 多維數(shù)組的下一語(yǔ)句日杈。?
以下過(guò)程使用 Single 值填充一個(gè)二維度組
Sub?FillArrayMulti()??Dim?intI?As?Integer,?intJ?As?Integer??Dim?sngMulti(1?To?5,?1?To?10)?As?Single??'?Fill?array?with?values.??For?intI?=?1?To?5??For?intJ?=?1?To?10??sngMulti(intI,?intJ)?=?intI?*?intJ??Debug.Print?sngMulti(intI,?intJ)??Next?intJ??Next?intI?End?Sub
05
Variant變體
如果數(shù)據(jù)類型常量遣铝、變量或參數(shù)時(shí)未指定數(shù)據(jù)類型變量,則會(huì)自動(dòng)指定 Variant 參數(shù)莉擒。
聲明為 Variant數(shù)據(jù)類型變量可以包含字符串酿炸、日期、時(shí)間涨冀、布爾值或數(shù)值填硕,并可以自動(dòng)轉(zhuǎn)換它們包含的值。數(shù)值 Variant 值需要 16 字節(jié)的內(nèi)存 (這僅在大型過(guò)程或復(fù)雜 模塊 )中十分重要鹿鳖,并且訪問(wèn)速度比任何其他類型顯式鍵入的變量慢扁眯。很少對(duì)常量使用 Variant 數(shù)據(jù)類型。字符串 Variant 值要求 22 個(gè)字節(jié)的內(nèi)存翅帜。
以下語(yǔ)句創(chuàng)建 Variant 變量
Dim?myVar?Dim?yourVar?As?Variant?theVar?=?"This?is?some?text."
最后一個(gè)語(yǔ)句不會(huì)顯式聲明變量恋拍,而是隱式或自動(dòng)聲明變量。隱式聲明的變量將被指定為 Variant 數(shù)據(jù)類型藕甩。
如果為變量或參數(shù)指定數(shù)據(jù)類型,而使用了錯(cuò)誤的數(shù)據(jù)類型周荐,則會(huì)發(fā)生數(shù)據(jù)類型錯(cuò)誤狭莱。若要避免數(shù)據(jù)類型錯(cuò)誤,只使用隱式變量( Variant 數(shù)據(jù)類型)或者明確聲明所有變量并指定數(shù)據(jù)類型概作。后一種方法是首選方法腋妙。