VBA 編程基礎(chǔ)
來(lái)源:易賢網(wǎng) 閱讀:835 次 日期:2014-09-25 12:01:33
溫馨提示:易賢網(wǎng)小編為您整理了“VBA 編程基礎(chǔ)”,方便廣大網(wǎng)友查閱!

11.3.1 了解 Visual Basic 語(yǔ)法

本節(jié)解釋最常見(jiàn)的語(yǔ)法元素。

11.3.1.1 Activate 方法的語(yǔ)法

語(yǔ)法:object.Activate

在 Activate 方法的語(yǔ)法中,object 是一個(gè)所提供信息的占位符,在此例中的代碼會(huì)返回一個(gè)對(duì)象。例如,下面的過(guò)程會(huì)在活動(dòng)的文檔中激活第二個(gè)窗口。

Sub MakeActive()

Windows(2).Activate

End Sub

11.3.1.2 MsgBox 函數(shù)的語(yǔ)法

語(yǔ)法:MsgBox(prompt[, buttons] [, title] [, helpfile, context])

在 MsgBox 函數(shù)的語(yǔ)法中,括號(hào)內(nèi)的參數(shù)是此函數(shù)的命名參數(shù)。方括號(hào)所包含的參數(shù)是選擇性的(在Visual Basic 中不用鍵入方括號(hào))。在 MsgBox 函數(shù)中,唯一必須提供的參數(shù)(prompt)是做為提示的文本。

在代碼中可以利用位置或名稱(chēng)來(lái)指定函數(shù)與方法的參數(shù)。若利用位置來(lái)指定參數(shù),則必須根據(jù)語(yǔ)法中的順序,利用逗號(hào)來(lái)分隔每一個(gè)參數(shù),例如:

MsgBox "Your answer is correct!",0,"Answer Box"

若以名稱(chēng)來(lái)指定參數(shù),則須使用參數(shù)名稱(chēng)或跟著冒號(hào)與等號(hào)(:=),最后再加上參數(shù)值??梢匀魏蔚捻樞騺?lái)指定命名參數(shù),例如:

MsgBox Title:="Answer Box", Prompt:="Your answer is correct!"

函數(shù)以及某些方法的語(yǔ)法會(huì)利用圓括號(hào)將參數(shù)封閉起來(lái)。這些函數(shù)和方法會(huì)返回值,所以必須用圓括號(hào)將參數(shù)封閉起來(lái),才可以賦值給變量。如果忽略返回值或是沒(méi)有傳遞所有的參數(shù),則可以不用圓括號(hào)。方法若不返回值,則不用將參數(shù)用圓括號(hào)封閉起來(lái)。上述準(zhǔn)則不管是使用命名參數(shù)或位置參數(shù)都適用。

在下面的示例中,MsgBox 函數(shù)的返回值是一個(gè)號(hào)碼,它被存儲(chǔ)在變量 myVar 中,以用來(lái)指示選擇的按鈕。因?yàn)樾枰玫椒祷刂?,所以調(diào)用時(shí)必須使用圓括號(hào)。而另一個(gè)消息框則是用來(lái)顯示變量的值。

Sub Question()

myVar = MsgBox(Prompt:="I enjoy my job.", _

Title:="Answer Box", Buttons:="4")

MsgBox myVar

End Sub

11.3.1.3 選項(xiàng)語(yǔ)句的語(yǔ)法

語(yǔ)法:Option Compare {Binary | Text | Database}

在 Option Compare 語(yǔ)句的語(yǔ)法中,大括號(hào)和垂直線指示三項(xiàng)中的強(qiáng)制性選擇(在Visual Basic 的語(yǔ)句中不用鍵入大括號(hào))。例如,下列的語(yǔ)句指出在模塊中,字符串的比較是根據(jù)文本的排序順序而不區(qū)分大小寫(xiě)。

Option Compare Text

11.3.1.4 Dim 語(yǔ)句的語(yǔ)法

語(yǔ)法: Dim varname[ ( [subscripts] ) ] [As type] [, varname[([subscripts])] [As type]] . . .

在 Dim 語(yǔ)句的語(yǔ)法中,Dim 是必備的關(guān)鍵字。而唯一必備的元素是 varname(變量名)。例如,下列的語(yǔ)句創(chuàng)建三個(gè)變量:myVar、 nextVar 和 thirdVar。它們會(huì)自動(dòng)被聲明成 Variant 變量。

Dim myVar, nextVar, thirdVar

下面的示例聲明了一個(gè)String 型的變量。它包含了數(shù)據(jù)類(lèi)型,如此可以節(jié)省內(nèi)存并且可幫助從代碼中找出錯(cuò)誤。

Dim myAnswer As String

若在一個(gè)語(yǔ)句中聲明好幾個(gè)變量,則必須包含每一個(gè)變量的數(shù)據(jù)類(lèi)型。變量在聲明時(shí)若少了數(shù)據(jù)類(lèi)型,則會(huì)自動(dòng)地聲明為Variant 。

Dim x As Integer, y As Integer, z As Integer

在下列的語(yǔ)句中,x 與 y 都被指定成 Variant 數(shù)據(jù)類(lèi)型,只有 z 被指定成 String 數(shù)據(jù)類(lèi)型。

Dim x, y As Integer,Z As String

如果聲明一個(gè)數(shù)組變量,則必須包含圓括號(hào),但下標(biāo)則是可選的。下列的語(yǔ)句中定義了一個(gè)動(dòng)態(tài)數(shù)組 myArray。

Dim myArray()

11.3.2 有效地利用數(shù)據(jù)語(yǔ)法

表11-1 列出VBA 所支持的數(shù)據(jù)類(lèi)型,以及存儲(chǔ)空間的大小與范圍。

注意:

任何數(shù)據(jù)類(lèi)型的數(shù)組都需要 20 個(gè)字節(jié)的內(nèi)存空間,加上每一數(shù)組維數(shù)占 4 個(gè)字節(jié),再加上數(shù)據(jù)本身所占用的空間。數(shù)據(jù)所占用的內(nèi)存空間可以用數(shù)據(jù)元數(shù)目乘上每個(gè)元素的大小加以計(jì)算。例如,以 4 個(gè) 2 字節(jié)的Integer 數(shù)據(jù)元所組成的一維數(shù)組中的數(shù)據(jù),占 8個(gè)字節(jié)。這 8 個(gè)字節(jié)加上額外的 24 個(gè)字節(jié),使得這個(gè)數(shù)組所需總內(nèi)存空間為 32 個(gè)字節(jié)。包含一數(shù)組的 Variant 比單獨(dú)的一個(gè)數(shù)組需要多 12 個(gè)字節(jié)。

注意:

使用 StrConv 函數(shù)把字符串?dāng)?shù)據(jù)從一種類(lèi)型轉(zhuǎn)換為另一種類(lèi)型。

除非有其他的指定,否則未聲明變量會(huì)被指定成 Variant 數(shù)據(jù)類(lèi)型。這個(gè)數(shù)據(jù)類(lèi)型可使寫(xiě)程序變得較容易,但它并不總是使用中最有效率的數(shù)據(jù)類(lèi)型。

若有下列情形時(shí)必須考慮使用其他的數(shù)據(jù)類(lèi)型:

程序非常大并且使用很多變量。

程序的執(zhí)行速度必須盡可能得快。

將數(shù)據(jù)直接寫(xiě)到隨機(jī)存儲(chǔ)文件中。

除了 Variant 之外,支持的數(shù)據(jù)類(lèi)型包括 Byte、Boolean、 Integer、Long、Single、Double、Currency、Decimal、Date、Object 以及 String??墒褂?Dim 語(yǔ)句去聲明一個(gè)指定類(lèi)型的變量,例如:

Dim X As Integer

上述語(yǔ)句聲明變量 X 是一個(gè)整型,其范圍介于-32,768~32,767 之間。如果試著去設(shè)置超出此范圍的數(shù)值給 X ,則會(huì)有錯(cuò)誤發(fā)生。如果試著去指定一個(gè)分?jǐn)?shù)給 X,則此分?jǐn)?shù)會(huì)自動(dòng)四舍五入。例如:

X = 32768 ' 產(chǎn)生錯(cuò)誤。 X = 5.9 ' 設(shè)置 x = 6。

11.3.3 Visual Basic 的命名規(guī)則

當(dāng)在 Visual Basic 的模塊中為過(guò)程、常數(shù)、變量以及參數(shù)命名時(shí),可以使用下列的規(guī)則:

第一個(gè)字符必須使用英文字母。

不能在名稱(chēng)中使用空格、句點(diǎn)(.)、驚嘆號(hào)(!)、或 @、&、 $,# 等字符。

名稱(chēng)的長(zhǎng)度不可以超過(guò) 255 個(gè)字符。

通常,使用的名稱(chēng)不能與 Visual Basic 本身的 Function 過(guò)程、語(yǔ)句以及方法的名稱(chēng)相同。必須退出使用與程序語(yǔ)言的關(guān)鍵字相同的名稱(chēng)。若所使用的內(nèi)在語(yǔ)言函數(shù),語(yǔ)句或方法與所指定的名稱(chēng)相沖突,則必須顯示地識(shí)別它。常規(guī)會(huì)將內(nèi)建函數(shù),語(yǔ)句或方法的名稱(chēng)之前加上關(guān)聯(lián)的類(lèi)型庫(kù)的名稱(chēng)。例如,如果有一個(gè)名為 Left 的變量,則只能用 VBA.Left 來(lái)調(diào)用 Left 函數(shù)。

不能在范圍的相同層次中使用重復(fù)的名稱(chēng)。例如,不能在同一過(guò)程中聲明兩個(gè)命名為 age 的變量。然而,可以在同一模塊中聲明一個(gè)命名為 age 的私有變量和命名為 age 的過(guò)程級(jí)別的變量。

注意:

Visual Basic 不區(qū)分大小寫(xiě),但它會(huì)在名稱(chēng)被聲明的語(yǔ)句處保留大寫(xiě)。

11.3.4 聲明變量、常數(shù)和數(shù)組

11.3.4.1 聲明變量

通常會(huì)使用 Dim 語(yǔ)句來(lái)聲明變量。一個(gè)聲明語(yǔ)句可以放到過(guò)程中以創(chuàng)建屬于過(guò)程的級(jí)別的變量?;蛟诼暶鞑糠挚蓪⑺诺侥K頂部,以創(chuàng)建屬于模塊級(jí)別的變量。

下面的示例創(chuàng)建了變量 strName 并且指定為 String 數(shù)據(jù)類(lèi)型。 Dim strName As String

如果該語(yǔ)句出現(xiàn)在過(guò)程中,則變量 strName 只可以在此過(guò)程中被使用。如果該語(yǔ)句出現(xiàn)在模塊的聲明部分,則變量 strName 可以被此模塊中所有的過(guò)程所使用,但是不能被同一工程中不同的模塊所含過(guò)程來(lái)使用。為了使變量可被工程中所有的過(guò)程所使用,則在變量前加上 Public 語(yǔ)句,如以下的示例:

Public strName As String

變量可以聲明成下列數(shù)據(jù)類(lèi)型中的一種:Boolean、Byte、 Integer、Long、Currency、Single、Double、Date、String(變長(zhǎng)字符串)、String * length (定長(zhǎng)字符串)、Object 或 Variant。如果未指定數(shù)據(jù)類(lèi)型,則 Variant 數(shù)據(jù)類(lèi)型被賦予默認(rèn)。也可以使用 Type 語(yǔ)句來(lái)創(chuàng)建用戶自定義類(lèi)型。

可以在一個(gè)語(yǔ)句中聲明幾個(gè)變量。而為了指定數(shù)據(jù)類(lèi)型,必須將每一個(gè)變量的數(shù)據(jù)類(lèi)型包含進(jìn)來(lái)。在下面的語(yǔ)句中,變量 intX、 intY、與 intZ 被聲明為 Integer 類(lèi)型。

Dim intX As Integer, intY As Integer, intZ As Integer

在下面的語(yǔ)句中,變量 intX 與 intY 被聲明為 Variant 類(lèi)型;只有intZ 被聲明為 Integer 類(lèi)型。

Dim intX, intY, intZ As Integer

在聲明語(yǔ)句中,不一定要提供變量的數(shù)據(jù)類(lèi)型。若省略了數(shù)據(jù)類(lèi)型,則會(huì)將變量設(shè)成 Variant 類(lèi)型。

使用 Public 語(yǔ)句:可以使用 Public 語(yǔ)句去聲明公共模塊級(jí)別變量。

Public strName As String

公有變量可用于工程中的任何過(guò)程。如果公有變量是聲明于標(biāo)準(zhǔn)模塊或是類(lèi)模塊中,則它也可以被任何引用到此公有變量所屬工程的工程中使用。

使用 Private 語(yǔ)句:可以使用 Private 語(yǔ)句去聲明私有的模塊級(jí)別變量。

Private MyName As String

私有變量只可使用于同一模塊中的過(guò)程。

注意:

在模塊級(jí)別中使用 Dim 語(yǔ)句與使用 Private 語(yǔ)句是相同的。不過(guò)使用 Private 語(yǔ)句可以更容易地讀取和解釋代碼。

使用Static 語(yǔ)句:當(dāng)使用 Static 語(yǔ)句取代 Dim 語(yǔ)句時(shí),所聲明的變量在調(diào)用時(shí)仍保留它原先的值。

使用Option Explicit 語(yǔ)句:在 Visual Basic 中可以簡(jiǎn)單地通過(guò)一個(gè)賦值語(yǔ)句來(lái)隱含聲明變量。所有隱含聲明變量都為 Variant 類(lèi)型,而Variant 類(lèi)型變量比大多數(shù)其他類(lèi)型的變量需要更多的內(nèi)存資源。如果顯式地聲明變量為指定的數(shù)據(jù)類(lèi)型,則應(yīng)用程序?qū)⒏行?。顯式聲明所有變量減少了命名沖突以及拼寫(xiě)錯(cuò)誤的發(fā)生率。

如果不想使Visual Basic 生成隱含聲明,可以將Option Explicit 語(yǔ)句放置于模塊中所有的過(guò)程之前。這一個(gè)語(yǔ)句要求對(duì)模塊中所有的變量做顯式地聲明。如果模塊包含Option Explicit 語(yǔ)句,則當(dāng) Visual Basic 遇到一個(gè)先前未定義的變量或拼寫(xiě)錯(cuò)誤,它會(huì)發(fā)生編譯時(shí)間的錯(cuò)誤。

可以設(shè)置 Visual Basic 程序環(huán)境中的某個(gè)選項(xiàng),使得自動(dòng)在所有新的模塊中包含 Option Explicit 語(yǔ)句。

注意: 需顯式地聲明固定大小的數(shù)組與動(dòng)態(tài)數(shù)組。

為自動(dòng)化聲明一個(gè)對(duì)象變量:當(dāng)使用一個(gè)應(yīng)用程序去控制另外一個(gè)應(yīng)用程序的對(duì)象時(shí),應(yīng)該設(shè)置一個(gè)對(duì)于其他應(yīng)用程序的類(lèi)型庫(kù)的引用。若設(shè)置一個(gè)引用,則可以根據(jù)它們最常指定的類(lèi)型來(lái)聲明對(duì)象變量。例如,如果是在 Microsoft Word 中,當(dāng)對(duì) Microsoft Excel 類(lèi)型庫(kù)做一引用設(shè)置時(shí),可以在 Microsoft Word 中聲明 Worksheet 類(lèi)型的變量來(lái)表示 Microsoft Excel 中的Worksheet 對(duì)象。

如果使用其他的應(yīng)用程序去控制 Microsoft Access 對(duì)象,在多數(shù)情況下,可以根據(jù)它們最常指定的類(lèi)型來(lái)聲明對(duì)象變量。也可以使用關(guān)鍵字 New 去自動(dòng)生成一個(gè)對(duì)象的新實(shí)例。然而,可能要指示它是 Microsoft Access 對(duì)象。例如,當(dāng)在 Microsoft Visual Basic 里面聲明一個(gè)對(duì)象變量去表示 Microsoft Access form 時(shí),必須區(qū)別它是 Microsoft Access Form 對(duì)象或是 Visual Basic Form 對(duì)象。所以在聲明變量的語(yǔ)句中必須要包含類(lèi)型庫(kù)的名稱(chēng),如下面示例所示:

Dim frmOrders As New Access.Form

某些應(yīng)用程序并不能識(shí)別特別的 Microsoft Access 對(duì)象類(lèi)型。既使已經(jīng)在這些應(yīng)用程序中設(shè)置了一個(gè)對(duì) Microsoft Access 類(lèi)型庫(kù)的引用,必須聲明所有 Microsoft Access 對(duì)象變量為 Object 類(lèi)型。不能使用 New 關(guān)鍵字去創(chuàng)建這個(gè)對(duì)象的新實(shí)例。下面的示例顯示了不能識(shí)別 Microsoft Access 對(duì)象類(lèi)型的應(yīng)用程序,如何去聲明一個(gè)變量用來(lái)表示 Microsoft Access Application 對(duì)象。然后應(yīng)用程序創(chuàng)建一個(gè) Application 對(duì)象的實(shí)例。

Dim appAccess As Object

Set appAccess = CreateObject("Access.Application")

11.3.4.2 聲明常數(shù)

如果要聲明一個(gè)常數(shù),可以使用 Const 語(yǔ)句去聲明,并且設(shè)置它的值;而在常數(shù)聲明完之后,則不能加以更改或賦予新值。

在聲明部分,可以在過(guò)程中或者在模塊頂部聲明常數(shù)。模塊級(jí)別中的常數(shù)默認(rèn)為私有的。若要聲明一個(gè)公共模塊級(jí)別常數(shù),則可以在 Const 語(yǔ)句前加上 Public 這個(gè)關(guān)鍵字。也可以利用在 Const 語(yǔ)句前加上 Public 關(guān)鍵字來(lái)明確地聲明一個(gè)私有的常數(shù),使得我們可更容易地去讀取并且解釋代碼。

下面的示例,聲明了一個(gè) Public 常數(shù) conAge 為 Integer 類(lèi)型,并且指定它的值 為34。

Public Const conAge As Integer = 34

常數(shù)可以聲明成下列數(shù)據(jù)類(lèi)型中的一種:Boolean、Byte、 Integer、Long、Currency、Single、Double、Date、String 或 Variant。因?yàn)橐呀?jīng)知道常數(shù)的值,所以可以指定 Const 語(yǔ)句中的數(shù)據(jù)類(lèi)型。關(guān)于數(shù)據(jù)類(lèi)型的詳細(xì)信息。

可以在一個(gè)語(yǔ)句中聲明數(shù)個(gè)常數(shù)。為了指定數(shù)據(jù)類(lèi)型,必須將每一個(gè)常數(shù)的數(shù)據(jù)類(lèi)型包含進(jìn)來(lái)。在下面的語(yǔ)句中,常數(shù) conAge 和 conWage 被聲明為 Integer 類(lèi)型。

Const conAge As Integer = 34, conWage As Currency = 35000

11.3.4.3 聲明數(shù)組

數(shù)組的聲明方式和其他的變量是一樣的,它可以使用 Dim、 Static、Private 或 Public 語(yǔ)句來(lái)聲明。標(biāo)量變量(非數(shù)組)與數(shù)組變量的不同在于通常必須指定數(shù)組的大小。若數(shù)組的大小被指定的話,則它是個(gè)固定大小數(shù)組。若程序運(yùn)行時(shí)數(shù)組的大小可以被改變,則它是個(gè)動(dòng)態(tài)數(shù)組。

數(shù)組是否從 0 或 1 索引是根據(jù) Option Base 語(yǔ)句的設(shè)置。如果 Option Base 沒(méi)有指定為1,則數(shù)組索引從0 開(kāi)始。

1.聲明固定大小的數(shù)組

下面這行代碼聲明了一個(gè)固定大小的數(shù)組,它是個(gè) 11 行乘以 11 列的Integer 數(shù)組:

Dim MyArray(10, 10) As Integer

第一個(gè)參數(shù)代表的是行;而第二個(gè)參數(shù)代表的是列。

與其他變量的聲明一樣,除非指定一個(gè)數(shù)據(jù)類(lèi)型給數(shù)組,否則聲明數(shù)組中元素的數(shù)據(jù)類(lèi)型為 Variant。數(shù)組中每個(gè)數(shù)組的數(shù)字型 Variant 元素占用 16 個(gè)字節(jié)。每個(gè)字符串型 Variant 元素占用 22 個(gè)字節(jié)。為了盡可能使寫(xiě)的代碼簡(jiǎn)潔明了,則要明確聲明的數(shù)組為某一種數(shù)據(jù)類(lèi)型而非 Variant。下面的這幾行代碼比較了幾個(gè)不同數(shù)組的大?。?

' 整型數(shù)組使用 22 個(gè)字節(jié)(11 元素* 2 字節(jié))。

ReDim MyIntegerArray(10) As Integer

' 雙精度數(shù)組使用 88 個(gè)字節(jié)(11 元素 * 8 字節(jié))。

ReDim MyDoubleArray(10) As Double

' 變體型數(shù)組至少使用 176 字節(jié)(11 元素 * 16 字節(jié))。

ReDim MyVariantArray(10)

' 整型數(shù)組使用 100 * 100 * 2 字節(jié)(20,000 字節(jié))。

ReDim MyIntegerArray (99, 99) As Integer

' 雙精度數(shù)組使用 100 * 100 * 8 字節(jié)(80,000 字節(jié))。

ReDim MyDoubleArray (99, 99) As Double

' 變體型數(shù)組至少使用 160,000 字節(jié)(100 * 100 * 16 字節(jié))。

ReDim MyVariantArray(99, 99)

數(shù)組變量的最大值,是以所用的操作系統(tǒng)有多少可用內(nèi)存為基礎(chǔ)。若使用的數(shù)組大小超過(guò)了系統(tǒng)中可用內(nèi)存總數(shù)的話,則速度會(huì)變慢,因?yàn)楸仨殢拇疟P(pán)中讀寫(xiě)回?cái)?shù)據(jù)。

2.聲明動(dòng)態(tài)數(shù)組

若聲明為動(dòng)態(tài)數(shù)組,則可以在執(zhí)行代碼時(shí)改變數(shù)組大小??梢岳?Static、Dim、Private 或 Public 語(yǔ)句來(lái)聲明數(shù)組,并使括號(hào)內(nèi)為空,如下示例所示。

Dim sngArray() As Single

注意:

可以在過(guò)程中使用 ReDim 語(yǔ)句來(lái)做隱含性的數(shù)組聲明。當(dāng)使用 ReDim 語(yǔ)句時(shí)要小心點(diǎn),不要拼錯(cuò)數(shù)組的名稱(chēng)。否則即使在模塊中有包含 Option Explicit 語(yǔ)句,仍然會(huì)因此而生成第二個(gè)數(shù)組。

對(duì)于過(guò)程中的數(shù)組范圍,可以使用 ReDim 語(yǔ)句去改變它的維數(shù),去定義元素的數(shù)目以及每個(gè)維數(shù)的底層綁定。每當(dāng)需要時(shí),可以使用 ReDim 語(yǔ)句去更改動(dòng)態(tài)數(shù)組。然而當(dāng)做這個(gè)動(dòng)作時(shí),數(shù)組中存在的值會(huì)丟失。若要保存數(shù)組中原先的值,則可以使用 ReDim Preserve 語(yǔ)句來(lái)擴(kuò)充數(shù)組。例如,下列的語(yǔ)句將 varArray 數(shù)組擴(kuò)充了10 個(gè)元素,而原本數(shù)組中的當(dāng)前值并沒(méi)有消失掉。

ReDim Preserve varArray(UBound(varArray) + 10)

注意:

當(dāng)對(duì)動(dòng)態(tài)數(shù)組使用 Preserve 關(guān)鍵字時(shí),只可以改變最后維數(shù)的上層綁定,而不能改變維數(shù)的數(shù)目。

11.3.5 過(guò)程及其調(diào)用

11.3.5.1 Function 過(guò)程

Function 過(guò)程是一系列由 Function 和 End Function 語(yǔ)句所包含起來(lái)的 Visual Basic 語(yǔ)句。Function 過(guò)程和 Sub 過(guò)程很類(lèi)似,但函數(shù)可以返回一個(gè)值。Function 過(guò)程可經(jīng)由調(diào)用者過(guò)程通過(guò)傳遞參數(shù),例如常數(shù)、變量、或是表達(dá)式等來(lái)調(diào)用它。如果一個(gè) Function 過(guò)程沒(méi)有參數(shù),它的 Function 語(yǔ)句必須包含一個(gè)空的圓括號(hào)。函數(shù)會(huì)在過(guò)程的一個(gè)或多個(gè)語(yǔ)句中指定一個(gè)值給函數(shù)名稱(chēng)來(lái)返回值。

在下面的示例中,Celsius 函數(shù)會(huì)根據(jù)華氏溫度來(lái)計(jì)算攝氏溫度。當(dāng) Main 過(guò)程調(diào)用此函數(shù)時(shí),會(huì)有一包含參數(shù)值的變量傳遞給此函數(shù)。而計(jì)算的結(jié)果會(huì)返回到調(diào)用的過(guò)程,并且顯示在一個(gè)消息框中。

Sub Main()

temp = Application.InputBox(Prompt:= _

"Please enter the temperature in degrees F.",

Type:=1)

MsgBox "The temperature is " & Celsius(temp) & "

degrees C."

End Sub

Function Celsius(fDegrees)

Celsius = (fDegrees - 32) * 5 / 9

End Function

11.3.5.2 Sub 過(guò)程

Sub 過(guò)程是一系列由 Sub 和 End Sub 語(yǔ)句所包含起來(lái)的 Visual Basic 語(yǔ)句,它們會(huì)執(zhí)行動(dòng)作卻不能返回一個(gè)值。Sub 過(guò)程可有參數(shù),例如常數(shù)、變量、或是表達(dá)式等來(lái)調(diào)用它。如果一個(gè) Sub 過(guò)程沒(méi)有參數(shù),則它的 Sub 語(yǔ)句必須包含一個(gè)空的圓括號(hào)。

下面 Sub 過(guò)程中,每一行都有注釋來(lái)解釋它的作用:

'聲明過(guò)程命名為 GetInfo

'該 Sub 過(guò)程沒(méi)有參數(shù)

Sub GetInfo()

'聲明字符串變量命名為 answer

Dim answer As String

'指定 InputBox 函數(shù)的返回值給 answer

answer = InputBox(Prompt:="What is your name?")

'條件 If...Then...Else 語(yǔ)句

If answer = Empty Then

'調(diào)用 MsgBox 函數(shù)

MsgBox Prompt:="You did not enter a name."

Else

'MsgBox 函數(shù)與 answer 變量連接。

MsgBox Prompt:="Your name is " & answer

'結(jié)束 If...Then...Else 語(yǔ)句

End If

'結(jié)束 Sub 過(guò)程

End Sub

11.3.5.3 屬性過(guò)程

屬性過(guò)程是一系列的 Visual Basic 語(yǔ)句,它允許程序員去創(chuàng)建并操作自定義的屬性。屬性過(guò)程可以用來(lái)為窗體,標(biāo)準(zhǔn)模塊,以及類(lèi)模塊創(chuàng)建只讀屬性??杀挥脕?lái)在代碼中代替 Public 變量,當(dāng)設(shè)置屬性值時(shí)上述動(dòng)作應(yīng)被執(zhí)行。

與 Public 變量不同,在對(duì)象瀏覽器中屬性過(guò)程會(huì)有一些幫助字符串指定給自定義的屬性。

當(dāng)創(chuàng)建一個(gè)屬性過(guò)程時(shí),它會(huì)變成此過(guò)程所包含的模塊的一個(gè)屬性。Visual Basic 提供下列三種類(lèi)型的 Property 過(guò)程:

Property Let 用來(lái)設(shè)置屬性值的過(guò)程。

Property Get 用來(lái)返回屬性值的過(guò)程。

Property Set 用來(lái)設(shè)置對(duì)對(duì)象引用的過(guò)程。

聲明屬性過(guò)程的語(yǔ)法如下所示:

[Public | Private] [Static] Property {Get | Let | Set}

propertyname_ [(arguments)] [As type]

statements

End Property

屬性過(guò)程通常是成對(duì)使用的:Property Let 與 Property Get 一組,而 Property Set 與 Property Get 一組。單獨(dú)聲明一個(gè) Property Get 過(guò)程就像聲明只讀屬性。三個(gè) Property 過(guò)程一起使用時(shí),只有對(duì) Variant 變量有用,因?yàn)橹挥?Variant 才能包含一個(gè)對(duì)象或其他數(shù)據(jù)類(lèi)型的信息。Property Set 本意是使用在對(duì)象上;而 Property Let 則不是。

在 Property 過(guò)程聲明中所需要的參數(shù)如下:

Property Get Property Get propname(1, ..., n) As type

Property Let Property Let propname(1, ..., n, n+1)

Property Set Property Set propname(1, ..., n, n+1)

在具有相同名稱(chēng)屬性過(guò)程中,從第一個(gè)到最后一個(gè)參數(shù)(1, ..., n)都必須共享相同的名稱(chēng)與數(shù)據(jù)類(lèi)型。

Property Get 過(guò)程聲明時(shí)所需的參數(shù)比相關(guān)的 Property Let 以及 Property Set 聲明少一個(gè)。Property Get 過(guò)程的數(shù)據(jù)類(lèi)型必須與相關(guān)的 Property Let 以及 Property Set 聲明中的最后 (n+1)個(gè)參數(shù)的類(lèi)型相同。例如,如果聲明下列的 Property Let 過(guò)程,則 Property Get 聲明所使用參數(shù)的名稱(chēng)與數(shù)據(jù)類(lèi)型必須同 Property Let 過(guò)程中所用的一樣。

Property Let Names(intX As Integer, intY As Integer,

varZ As Variant)

' 執(zhí)行語(yǔ)句.

End Property

Property Get Names(intX As Integer, intY As Integer)

As Variant

' 執(zhí)行語(yǔ)句.

End Property

在 Property Set 聲明中,最后一個(gè)參數(shù)的數(shù)據(jù)類(lèi)型必須是對(duì)象類(lèi)型或是 Variant。

11.3.5.4 調(diào)用 Sub 以及 Function 過(guò)程

從其他過(guò)程調(diào)用一個(gè) Sub 過(guò)程時(shí),必須鍵入過(guò)程名稱(chēng)以及任何需要的參數(shù)值。而 Call 語(yǔ)句并不需要,不過(guò)若使用它,則任何參數(shù)必須以括號(hào)括起來(lái)。

可以使用 Sub 過(guò)程去組織其他的過(guò)程,因此可以較容易地了解并調(diào)試它們。在下面的示例中,Sub 過(guò)程 Main 傳遞參數(shù)值 56 去調(diào)用 Sub 過(guò)程 MultiBeep。運(yùn)行 MultiBeep 后,控件返回 Main,然后 Main 調(diào)用 Sub 過(guò)程 Message。Message 顯示一個(gè)信息框;當(dāng)按“確定”鍵時(shí),控件會(huì)返回 Main,接著 Main 退出執(zhí)行。

Sub Main()

MultiBeep 56

Message

End Sub

Sub MultiBeep(numbeeps)

For counter = 1 To numbeeps

Beep

Next counter

End Sub

Sub Message()

MsgBox "Time to take a break!"

End Sub

1.調(diào)用具有多個(gè)參數(shù)的 Sub 過(guò)程

下面的示例展示了調(diào)用具有多個(gè)參數(shù)的 Sub 過(guò)程的兩種不同方法。當(dāng)?shù)诙握{(diào)用 HouseCalc 時(shí),因?yàn)槭褂?Call 語(yǔ)句所以需要利用括號(hào)將參數(shù)括起來(lái)。

Sub Main()

HouseCalc 99800, 43100

Call HouseCalc(380950, 49500)

End Sub

Sub HouseCalc(price As Single, wage As Single)

If 2.5 * wage <= 0.8 * price Then

MsgBox "You cannot afford this house."

Else

MsgBox "This house is affordable."

End If

End Sub

在調(diào)用 Function 過(guò)程時(shí)使用括號(hào)。

為了使用函數(shù)的返回值,必須指定函數(shù)給變量,并且用括號(hào)將參數(shù)封閉起來(lái);如下示例所示:

Answer3 = MsgBox("Are you happy with your salary?", 4, "Question 3")

如果不在意函數(shù)的返回值,可以用調(diào)用 Sub 過(guò)程的方式來(lái)調(diào)用函數(shù)。如下面示例所示,可以省略括號(hào),列出參數(shù)并且不要將函數(shù)指定給變量:

MsgBox "Task Completed!", 0, "Task Box"

注意在上述例子中若包含括號(hào),則語(yǔ)句會(huì)導(dǎo)致一個(gè)語(yǔ)法錯(cuò)誤。

2.傳遞命名參數(shù)

Sub 或 Function 過(guò)程中的語(yǔ)句可以利用命名參數(shù)來(lái)傳遞值給被調(diào)用的過(guò)程。參數(shù)有兩種傳遞方式:按值來(lái)傳遞和按地址來(lái)傳遞。按值傳遞只是傳遞參數(shù)的一個(gè)副本,在函數(shù)內(nèi)建立一個(gè)同參數(shù)類(lèi)型及內(nèi)容一樣的變量,在過(guò)程體內(nèi)部參數(shù)對(duì)參數(shù)所作的改變不會(huì)影響到實(shí)際參數(shù);按地址傳遞則不然,它傳遞的是實(shí)際參數(shù)的地址,過(guò)程中所有對(duì)參數(shù)的改變都將影響到實(shí)際參數(shù)”。命名參數(shù)的組成是由參數(shù)名稱(chēng)緊接著冒號(hào)(:=)以及等號(hào),然后指定一個(gè)值給參數(shù)。

下面的示例使用命名參數(shù)來(lái)調(diào)用不具返回值的 MsgBox 函數(shù)。

MsgBox Title:="Task Box", Prompt:="Task Completed!"

下面的示例使用命名參數(shù)調(diào)用 MsgBox 函數(shù)。將返回值指定給變量 answer3。

answer3 = MsgBox(Title:="Question 3", _

Prompt:="Are you happy with your salary?", Buttons:=4)

11.3.5.5 調(diào)用屬性過(guò)程

表11-2 列出了調(diào)用屬性過(guò)程的語(yǔ)法。

當(dāng)調(diào)用一個(gè) Property Let 或 Property Set 過(guò)程時(shí),總是會(huì)有一個(gè)參數(shù)出現(xiàn)在等號(hào)(=)的右邊。

當(dāng)用多個(gè)參數(shù)聲明一個(gè) Property Let 或 Property Set 過(guò)程時(shí), Visual Basic 傳遞調(diào)用的右邊參數(shù),給 Property Let 或 PropertySet 聲明中的最后一個(gè)參數(shù)。例如,圖11-18 顯示了 Property 過(guò)程調(diào)用中的參數(shù)與 Property Let 聲明中的參數(shù)的關(guān)系:

實(shí)際上,將屬性過(guò)程與多個(gè)參數(shù)合用只有在創(chuàng)建屬性的數(shù)組時(shí)才會(huì)使用。

更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

更多信息請(qǐng)查看腳本欄目
易賢網(wǎng)手機(jī)網(wǎng)站地址:VBA 編程基礎(chǔ)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)