教程 | VBA編程中并非顯而易見(jiàn)的常識(shí)

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ù)類型概作。后一種方法是首選方法腋妙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讯榕,隨后出現(xiàn)的幾起案子骤素,更是在濱河造成了極大的恐慌,老刑警劉巖愚屁,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件济竹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡霎槐,警方通過(guò)查閱死者的電腦和手機(jī)送浊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丘跌,“玉大人袭景,你說(shuō)我怎么就攤上這事唁桩。” “怎么了耸棒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵荒澡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我与殃,道長(zhǎng)单山,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任奈籽,我火速辦了婚禮饥侵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衣屏。我一直安慰自己躏升,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布狼忱。 她就那樣靜靜地躺著膨疏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钻弄。 梳的紋絲不亂的頭發(fā)上佃却,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音窘俺,去河邊找鬼饲帅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瘤泪,可吹牛的內(nèi)容都是我干的灶泵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼对途,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赦邻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起实檀,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惶洲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后膳犹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恬吕,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年须床,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了币呵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖余赢,靈堂內(nèi)的尸體忽然破棺而出芯义,到底是詐尸還是另有隱情,我是刑警寧澤妻柒,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布扛拨,位于F島的核電站,受9級(jí)特大地震影響举塔,放射性物質(zhì)發(fā)生泄漏绑警。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一央渣、第九天 我趴在偏房一處隱蔽的房頂上張望计盒。 院中可真熱鬧,春花似錦芽丹、人聲如沸北启。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咕村。三九已至,卻和暖如春蚊俺,著一層夾襖步出監(jiān)牢的瞬間懈涛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工泳猬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留批钠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓得封,卻偏偏與公主長(zhǎng)得像埋心,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呛每,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容