避免名稱衝突

���

當您試著建立或使用一個先前已定義的識別項時，會發生名稱衝突的情形。在某些情況下，名稱衝突會產生像「發現不正確名稱」或「在目前的有效範圍內重複宣告」等錯誤。名稱衝突如果沒有被偵測出，則會導致程式碼出現錯誤，如此將會產生錯誤的結果。特別是，當您在第一次使用之前沒有明確宣告所有的變數。

您可以藉由了解資料、物件、和程序中識別項的範圍特性，來避免大部份的名稱衝突。Visual Basic 擁有三個範圍層次：程序層次、私有模組層次、和公用模組層次。

當一個識別項有下列情形時可能發生名稱衝突：

1.	在一個以上的層次中為可見的。

2.	在同一層次中具有兩種不同的意義。

舉例來說，在不同的模組中可能擁有相同的程序名稱。因此，您可以定義名稱為 MySub 的程序在 Mod1 和 Mod2 兩個不同的模組中。如果每一個程序都只被同屬於一個模組的程序所呼叫，則不會有名稱衝突發生。然而，如果第三個模組中的程序呼叫 MySub 則會有錯誤產生，因為沒有任何的條件來區別這兩個 MySub 程序。

您可以在每一個識別項前加上一些定位項，其可由模組名稱或是專案名稱來組成，如此可解決大部份的名稱衝突。舉例而言：

YourProject.YourModule.YourSub MyProject.MyModule.MyVar

上述的程式碼呼叫 Sub 程序 YourSub 並且傳遞 MyVar 來當做引數。您可以使用任何定位項組合去區分相同的識別項。

Visual Basic 將每一個對識別項的引用與一個符合識別項的宣告做比對。例如，如果 MyID 在專案中的兩個模組(Mod1 與 Mod2)中被宣告為 Public。則您在 Mod2 中使用 Mod2 所定義的 MyID 時，並不需要加上定位項，但若在 Mod1 中使用上述的 MyID，則必須以 Mod2.MyID 來定位它。當 Mod2 在不同但直接引用專案中，則上述方式仍然可行。然而，如果 Mod2 是在一個間接引用專案中的話；也就是一個被您直接引用專案所引用的專案；則引用 Mod2 中的變數 MyID 時需要再加上專案名稱來加以定位。如果您從第三個 (直接引用模組) 模組來引用 MyID 時，則在比對時會以第一個找到符合下面規則的宣告為主：

•	找尋直接引用的專案，以它們出現在「工具」選單中的「引用」對話方塊之順序為準。

•	找尋每一個專案中的模組。需注意的是專案中的模組之間並無固定的順序。

您也不能在不同的範圍層次中，重複使用主應用程式中物件的名稱。舉例而言，如 Microsoft Excel 中的 R1C1。

秘訣 由名稱衝突所引起的典型錯誤包含有模擬兩可的名稱、雙重宣告、未宣告的識別項，以及找不到程序。在模組開頭加上 Option Explicit 陳述式，可以強迫在變數被使用前對變數做明確的宣告，如此可以避免一些可能的名稱衝突以及和識別項有關的錯誤。


利用相同的名稱來呼叫程序

���

您可以呼叫位於專案中任何模組內的程序，如同您在某一模組中呼叫所屬程序一般。然而如果有兩個或更多的模組包含相同的程序名稱，您必須在呼叫的陳述式中指出模組名稱，如下面的範例所示：

Sub Main()

Module1.MyProcedure

End Sub

如果您對於不同專案中的兩個不同程序給予相同名稱，則您在呼叫這些程序時必須指出專案名稱。舉例而言，下面的程序呼叫了 MyProject.vbp 專案裡 MyModule 模組所含的 Main 程序。

Sub Main()

[MyProject.vbp].[MyModule].Main

End Sub

附註 不同的應用程式擁有不同的專案名稱。舉例而言，在 Microsoft Access 一個專案稱之為資料庫 (.mdb)；在 Microsoft Excel 它稱之為活頁簿 (.xls)。

呼叫程序的秘訣

•	如果您將模組或專案重新命名，則切記要更改它們在呼叫陳述式中的名稱，否則 Visual Basic 將不能去找到所呼叫的程序。您可以使用「編輯」功能表中的「取代」指令去模組中尋找並替換掉這些程序名稱。

•	為了避免引用專案時發生名稱衝突，您可以給予一個程序唯一的名稱；如此當您呼叫程序時就不用去指定它是屬於哪個模組或專案。


呼叫屬性程序

���

下表所列為呼叫屬性程序時的語法：

屬性程序	語法
Property Let	[object.]propname(arguments)] = argument
Property Get	varname = [object.]propname(arguments)]
Property Set	Set [object.]propname[(arguments)] = varname
當您呼叫一個 Property Let 或 Property Set 程序時，總是會有一個引數出現在等號 (=) 的右邊。

當您宣告一個 Property Let 或 Property Set 程序有多個引數時，Visual Basic 會傳遞呼叫陳述式中的右邊引數，給 Property Let 或 Property Set 宣告中的最後一個引數。舉例而言，下列顯示了 Property 程序呼叫中的引數與 Property Let 宣告中的引數之關係：

實際上，將屬性程序與多個引數合用只有在建立屬性陣列時才會使用。


呼叫 Sub 以及 Function 程序

���

從其它程序，呼叫一個 Sub 程序時必須鍵入程序名稱以及任何必要的引數值。而 Call 陳述式並不需要，不過如果您使用它的話，則任何引數必須以括號括起來。

您可以使用 Sub 程序去組織其它的程序，如此可以較容易了解它們並且偵錯。在下面的範例中，Sub 程序 Main 傳遞引數值 56 去呼叫 Sub 程序 MultiBeep。在 MultiBeep 執行後，控制權傳回 Main，然後 Main 呼叫 Sub 程序 Message 顯示一個訊息方塊。當使用者按下「確定」鍵，控制權會傳回 Main，接著 Main 結束執行。

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

呼叫具有多個引數的 Sub 程序

下面的範例展示了，呼叫具有兩個以上引數的 Sub 程序的兩種不同方法。當第二次呼叫 HouseCalc 時，因為使用 Call 陳述式所以需要利用括號將引數包含起來。

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

在呼叫 Function 程序時使用括號

為了使用函數的傳回值，必須指定函數的傳回值到一個變數，並且用括號將引數包含起來；如下面的範例所示：

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

如果您不在意函數的傳回值，您可以用呼叫程序的方式來呼叫函數。如下面範例所示，可以省略括號，列出引數並且不要將函數指定給變數：

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

注意 在上述例子中若包含括號，則陳述式會導致一個語法錯誤。

傳遞指名引數

Sub 或 Function 程序中的陳述式可以利用指名引數來傳遞值給被呼叫的程序。您可以將指名引數以任何順序列出。指名引數的組成是由引數名稱緊接著冒號 (:=) 以及等號，然後指定一個值給引數。

下面的範例使用指名引數來呼叫不具傳回值的 MsgBox 函數。

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

下面的範例使用指名引數呼叫 MsgBox 函數，並且將傳回值指定給變數 answer3。

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

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


產生物件變數

���

您可以將物件變數看待成物件一般，您可以設定或傳回物件的屬性或者使用它所有的方法。

建立一個物件變數：

1.	宣告物件變數。

2.	指定物件變數到某一變數。

宣告一個物件變數

使用 Dim 陳述式或其它的陳述式 (Public、Private、或 Static) 去宣告一個物件變數。一個與物件相關連的變數必須是 Variant、Object，或是一個物件的特定型態。舉例而言，下列宣告是正確的：

Dim MyObject	' Declares MyObject as Variant data type.

Dim MyObject As Object	' Declares MyObject as Object data type.

Dim MyObject As Font	' Declares MyObject as Font type.

附註 如果您使用物件變數前沒有宣告它，則物件變數預設的資料型態 是 Variant 型態。

當不知物件型態的特性為何，並需等到執行才知道的時候，您可以利用 Object 資料型態來宣告。使用 Object 資料型態來建立對任何物件的一般引用。

如果您知道物件型態的特性，必須將物件變數宣告成所知道的物件型態。舉例而言，如果應用程式包含一個 Sample 物件型態，則您可以用下列的陳述式來宣告一個物件變數為 Sample 物件型態：

Dim MyObject As Object	' Declared as generic object.

Dim MyObject As Sample	' Declared only as Sample object.

宣告特定的物件型態可以提供自動的型態檢查，更快的程式碼，並增加可讀性。

指定一個物件給物件變數

使用 Set 陳述式可以指定一個物件給物件變數。您可以指定一個物件運算式或是 Nothing 給物件變數。舉例而言，下列的物件變數指定是正確的：

Set MyObject = YourObject	' Assign object reference.

Set MyObject = Nothing	' Discontinue association.

您可以同時使用New 關鍵字和 Set 陳述式來宣告物件變數，並指定一物件給它。舉例而言：

Set MyObject = New Object	' Create and Assign

設定一個物件變數等於 Nothing，會中斷此物件變數與任何特定物件的結合，如此可預防因意外的改變變數而更改物件。在關閉物件的結合後，物件變數總是設定為 Nothing，所以您可以測試物件變數是否指到正確的物件。舉例而言：

If Not MyObject Is Nothing Then	' Variable refers to valid object.

. . .

End If

當然，這個測試無法絕對的決定，使用者是否已關閉包含物件變數所引用物件的應用程式。

引用物件目前的執行個體

Me 關鍵字可用來指定一個物件執行個體，而此為程式碼正在執行的物件。所有與此物件結合的程序都可以透過 Me 來引用。使用 Me 來傳遞目前物件的相關資訊到其它模組中的程序顯得特別有用。舉例而言，假設在模組中有以下這些程序：

Sub ChangeObjectColor(MyObjectName As Object)

MyObjectName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)

End Sub

使用以下陳述式，您可以呼叫程序並且將物件目前的執行個體當做引數來傳遞：

ChangeObjectColor Me


建立遞迴程序

���

程序會指定一有限的空間給變數使用。當程序每次呼叫它本身時，則會用掉更多的空間。一個程序呼叫它本身則稱之為遞迴程序。遞迴程序若不斷的呼叫它自身，則最後會導致錯誤發生。舉例而言：

Function RunOut(Maximum)

RunOut = RunOut(Maximum)

End Function

當兩個程序不是很明確的互相呼叫，或是在某些情況下會限制遞迴不會執行到上述情形，則上述錯誤可能不是很明顯。不過遞迴也有它的用處； 舉例而言，下面的程序使用遞迴函數去計算因數。

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

您必須去測試您的遞迴程序，以確保它沒有呼叫它本身太多次，如此才不會執行到記憶體不足。如果您得到一個錯誤，則確認一下您的程序並沒有模糊的呼叫它本身。如此之後，則可試著以下列方式去節省記憶體：

•	消除不必須的變數。

•	使用資料型態而不使用 Variant。

•	重新評估程序的邏輯，則您常可以用巢狀迴圈來取代遞迴。


宣告陣列

���

陣列的宣告方式和其它的變數是一樣的，它可以使用 Dim、Static、Private 或 Public 陳述式來宣告。普通變數 (非陣列) 與陣列變數的不同在於您通常必須指定陣列的大小。若陣列的大小被指定的話，則它是個固定大小陣列。若程式執行時陣列的大小可以被改變的話，則它是個動態陣列。

宣告一個固定大小的陣列

下面這行程式碼宣告了一個固定大小的陣列，它是個 10 行乘以 10 列的 Integer 陣列：

Dim MyArray(10, 10) As Integer

第一個引數代表的是行，而第二個引數代表的是列。

與其它變數的宣告一樣，除非您指定一個資料型態給陣列，否則宣告陣列中元件的資料型態為 Variant。陣列中每一個 Variant 元件佔用了 16 個位元組。為了盡可能使寫的程式碼簡潔明瞭，則要明確宣告您的陣列為某一種資料型態而非 Variant。下面的這幾行程式碼，比較了數個不同陣列的大小：

' Integer array uses 22 bytes (11 elements * 2 bytes).

ReDim MyIntegerArray(10) As Integer

' Double-precision array uses 88 bytes (11 elements * 8 bytes).

ReDim MyDoubleArray(10) As Double

' Variant array uses at least 176 bytes (11 elements * 16 bytes).

ReDim MyVariantArray(10)

' Integer array uses 100 * 100 * 2 bytes (20,000 bytes).

ReDim MyIntegerArray (99, 99) As Integer

' Double-precision array uses 100 * 100 * 8 bytes (80,000 bytes).

ReDim MyDoubleArray (99, 99) As Double

' Variant array uses at least 160,000 bytes (100 * 100 * 16 bytes).

ReDim MyVariantArray(99, 99)

陣列變數的最大值，是以您的作業系統與有多少可用記憶體為基礎。若使用的陣列大小超過了您系統中可用記憶體總數的話，則速度會變慢，因為必須從磁碟中讀取並寫回資料。

宣告一個動態陣列

若宣告為動態陣列，則您可以在執行程式碼時去改變陣列大小。您可以利用 Static、Dim、Private 或 Public 陳述式來宣告動態陣列，並讓括號內保持空白，如同下面範例所示。

Dim sngArray() As Single

附註 您可以在程序中使用 ReDim 陳述式來做隱含性的陣列宣告。當您使用 ReDim 陳述式時要小心點，不要拼錯陣列的名稱；否則即使在模組中有包含 Option Explicit 陳述式，仍然會因此而產生第二個陣列。

對於程序中的陣列範圍，可以使用 ReDim 陳述式去改變它的維數，去定義元件個數以及每一個維度的上標界與下標界。每當需要時，您可以使用 ReDim 陳述式去更改動態陣列；然而當您做這個動作時，陣列中原先的值會不見。若要保存陣列中原先的值，則可以使用 ReDim Preserve 陳述式來擴展陣列。舉例而言，下列的陳述式將 varArray 陣列擴展了10 個元素，而原本陣列中元素的值並沒有消失掉。

ReDim Preserve varArray(UBound(varArray) + 10)

附註 當您對動態陣列使用 Preserve 關鍵字時，您只可以改變最後一個維度的上標界，而不能改變維數。


宣告常數

���

利用宣告一個常數，可以指定一個值給一個有意義的名稱。您可以使用 Const 陳述式去宣告一個常數，並且設定它的值；而在常數宣告完之後，則不能加以更改或指定新值。

您可以在程序中宣告常數或者在模組頂端的 Declarations 區段裡面宣告。模組層次中的常數預設為私有的，若要宣告一個公用模組層次常數，則可以在 Const 陳述式前加上 Public 這個關鍵字。您也可以利用在 Const 陳述式前加上 Private 關鍵字來明確的宣告一個私有的常數，使得我們可更容易的去讀取並且解譯程式碼。若需更多資訊，請參閱 Visual Basic 說明中的「瞭解範圍與可見性」。

下面的範例，宣告了一個 Public 常數 conAge 為 Integer 型態，並且指定它的值為 34。

Public Const conAge As Integer = 34

常數可以宣告成下列資料型態中的一者：Boolean、Byte、Integer、Long、Currency、Single、Double、Date、String 或 Variant。因為您已經知道常數的值，所以您可以指定 Const 陳述式中的資料型態。若需更多資訊，請參閱 Visual Basic 說明中的「資料型態摘要」。

您可以在一個陳述式中宣告數個常數；而為了指定資料型態，您必須將每一個常數的資料型態包含進來。在下面的陳述式中，常數 conAge 和 conWage被宣告為 Integer 型態。

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


宣告變數

���

通常會使用 Dim 陳述式來宣告變數。一個宣告陳述式可以放到程序中以建立屬於程序層次的變數，或放到模組頂端的 Declarations 區段裡面，以建立屬於模組層次的變數。

下面的範例建立了變數 strName 並且指定為 String 資料型態。

Dim strName As String

如果這個陳述式出現在程序中，則變數 strName 只可以在此程序中被使用。如果這個陳述式出現在模組中的 Declarations 區段，則變數 strName 可以被此模組中所有的程序所使用，但是不能被同一專案中不同的模組所含程序來使用。為了使變數可被專案中所有的程序所使用，則在變數名稱前加上 Public 陳述式，如同下面的範例：

Public strName As String

若需更多與變數命名相關的資訊，請參閱 Visual Basic 說明中的「Visual Basic 命名規則」。

變數可以宣告成下列資料型態中的一者：Boolean、Byte、Integer、Long、Currency、Single、Double、Date、String (可變長度字串)、String * length (固定長度字串)、Object 或 Variant。如果您未指定資料型態，則 Variant資料型態會被指定成預設型態。您也可以使用 Type 陳述式來建立使用者自訂型態。若需更多與變數型態相關的資訊，請參閱 Visual Basic 說明中的「資料型態摘要」。

您可以在一個陳述式中宣告幾個變數；而為了指定資料型態，您必須將每一個變數的資料型態包含進來。在下面的陳述式中，變數 intX、intY、與 intZ 被宣告為 Integer 型態。

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

在下面的陳述式中，變數 intX 與 intY 被宣告為 Variant 型態 ；只有 intZ 被宣告為 Integer 型態。

Dim intX, intY, intZ As Integer

在宣告陳述式中，您不一定要提供變數的資料型態，若省略資料型態的則會將變數設成 Variant 型態。

使用 Public 陳述式

您可以使用 Public 陳述式去宣告公用的模組層次變數。

Public strName As String

公用變數可使用於專案中所有的程序中。如果公用變數是宣告於一般模組或是物件類別模組中，則它也可以被任何引用到此公用變數所屬專案的專案所使用。

使用 Private 陳述式

您可以使用 Private 陳述式去宣告私有的模組層次變數。

Private MyName As String

私有變數只可使用於同一模組中的程序。

附註 在模組層次中使用 Dim 陳述式與使用 Private 陳述式是相同的。不過使用 Private 陳述式可以更容易的去讀取並且解譯程式碼。

使用 Static 陳述式

當您使用 Static 陳述式取代 Dim 陳述式，則所宣告的變數在程序呼叫時仍會保留它原先的值。

使用 Option Explicit 陳述式

在 Visual Basic 中您可以輕易的透過一個指定陳述式來隱含性的宣告變數。所有隱含性宣告的變數都為 Variant 型態，而 Variant 型態比一般型態的變數需要更多的記憶體來源。如您明確的宣告變數為某一特定的資料型態，則您的應用程式將更加有效率，明確宣告所有變數減少了名稱衝突以及拼字錯誤的發生率。

如果您不想要 Visual Basic 產生隱含性宣告的話，您可以將 Option Explicit 陳述式放置於模組層次中所有的程序之前。這一個陳述式會要求您對模組中所有的變數做明確的宣告。如果模組包含 Option Explicit 陳述式，則當 Visual Basic 遇到一個先前未定義的變數或拼字錯誤，它會發生編譯時間的錯誤。

您可以設定 Visual Basic 程式環境中的某個選項，使得可以自動在所有模組中加上 Option Explicit 陳述式。請參閱您的應用程式文件來得知如何更改 Visual Basic 環境選項，請注意這個選項並不會改變任何您已寫好程式碼。

附註 您必須明確的宣告固定大小的陣列與動態陣列。

為 Automation 宣告一個物件變數

當您使用一個應用程式去控制另外一個應用程式的物件時，您應該設定一個對於型態程式庫之引用，而此型態程式庫是屬於別個應用程式的。若您設定一個引用，則您可以根據它們最常指定的型態來宣告物件變數。舉例而言，如果您是在 Microsoft Word 中，當您對 Microsoft Excel 型態程式庫做一引用設定時，您可以在 Microsoft Word 中宣告一個 Worksheet 型態的變數去表示一個 Microsoft Excel 中的 Worksheet 物件。

如果您使用其它的應用程式去控制 Microsoft Access 物件，大部分情形下，可以根據它們最常指定的型態來宣告物件變數。您也可以使用關鍵字 New 去自動產生一個物件的執行個體，然而您必須已經指出它是個 Microsoft Access 物件；舉例而言，當您在 Microsoft Visual Basic 裡面宣告一個物件變數去代表 Microsoft Access form 的時候，您必須區別它是 Microsoft Access Form 物件或是 Visual Basic Form 物件。所以在宣告變數的陳述式中必須要包含型態程式庫的名稱，如下面範例所示：

Dim frmOrders As New Access.Form

某些應用程式並無法識別特別的 Microsoft Access 物件型態。既使您已經在這些應用程式中設定了一個對 Microsoft Access 型態程式庫的引用，您必須宣告所有 Microsoft Access 物件變數為 Object 型態。您不能使用 New 關鍵字去建立這個物件的新執行個體。下面的範例顯示了，無法識別特定 Microsoft Access 物件型態的應用程式，如何去宣告一個變數用以代表 Microsoft Access Application 物件，接著應用程式建立一個 Application 物件的執行個體。

Dim appAccess As Object

Set appAccess = CreateObject("Access.Application")

若想知道應用程式支援那些語法，請參閱應用程式文件。


當設定屬性的同時執行程式碼

���

您可以建立 Property Let、Property Set 與 Property Get 程序且它們共用相同的名稱。如此做之後，您可以建立一群相關的程序且它們會一起執行。所以即使某一名稱已被某個 Property 程序所用，此名稱仍舊可以用來做為 Sub、Function 程序、變數或使用者自訂型態的名稱。

Property Let 陳述式允許您建立一個設定屬性值的程序。有一範例是一個 Property 程序，它會對表單上的點陣圖建立一個 inverted 屬性。下列為此範例用來呼叫 Property Let 程序的語法：

Form1.Inverted = True

對於表單上點陣圖做翻轉的實際動作，其實是在 Property Let 程序裡面執行：

Private IsInverted As Boolean

Property Let Inverted(X As Boolean)

IsInverted = X

If IsInverted Then

(statements)

Else

(statements)

End If

End Property

表單層次變數 IsInverted 存放您的屬性設定。如果宣告為 Private，則使用者只能使用 Property Let 程序改變它的設定。使用一個名稱可以使得更易於識別變數是用於某一個屬性。

Property Get 程序是用來傳回 Inverted 屬性的目前狀態：

Property Get Inverted() As Boolean

Inverted = IsInverted

End Property

屬性程序使得在設定屬性的同時執行程式碼變得較容易。您可以使用屬性程序來執行下面步驟：

•	在設定一個屬性前要先決定它的屬性值。

•	在屬性值設定之後，就要以此新的屬性值為基礎。


透過程式碼做迴圈

���

使用條件陳述式與迴圈陳述式 (又稱控制結構)，您可以寫出產生判斷與重複動作的 Visual Basic 程式碼。其它有效的的控制結構，With 陳述式可以讓您執行一系列的陳述式，而不用重新描述物件。

使用條件陳述式來產生判斷

條件陳述式評估一個條件式是 True 或 False，然後根據結果來執行多個特定的陳述式。通常，條件式是一個運算式，它會使用比較運算子來比較兩個值或變數。

選擇一個條件陳述式來使用

•	If...Then...Else：當條件式是 True 或 False 時會產生分支。

•	Select Case：從一個由條件式所組成的集合中選擇某一分支。

使用迴圈去重複執行程式碼

迴圈允許您重複的執行一群的陳述式。某些迴圈重複執行陳述式直到條件式的值為 False；而有些迴圈重複執行陳述式直到條件式的值為 True。也有某些迴圈執行一特定次數的陳述式或是集合中的每一個物件。

選擇一個迴圈來使用

•	Do...Loop：迴圈重複執行陳述式直到或當條件式的值為 True。

•	For...Next：使用一個計數器去來執行一特定次數的陳述式。

•	For Each...Next：針對集合中每個物件的一群的陳述式重複的執行。

在同一物件中執行數個陳述式

在 Visual Basic 中，通常在您執行它的某一個方法或改變它的屬性之前必須指定此物件。您可以使用With 陳述式去指定一完整序列的陳述式給某一物件。

•	With：在同一物件中執行一序列的陳述式。


使 For...Next 迴圈更加快速

���

整數比 Variant 資料型態佔用較少的記憶體，並且有稍快的更新速度。然而，此不同處只有在您執行數千個指令時才會引人著目。舉例而言：

Dim CountFaster As Integer	' First case, use Integer.

For CountFaster = 0 to 32766

Next CountFaster

Dim CountSlower As Variant	' Second case, use Variant.

For CountSlower = 0 to 32766

Next CountSlower

在上述的範例中，第一個事例只比第二個事例有稍小的執行時間。然而，如果 CountFaster 的值超過 32,767 則會產生一個錯誤。為了處理此問題，您可以將 CountFaster 宣告成 Long 資料型態如此可以接受更大範圍的整數。一般而言，較小的資料型態，在更新時具有稍小的時間；Variants 則會稍慢於它對等的各種資料型態。


有效率地傳遞引數

���

所有的引數傳遞給程序都是利用傳址呼叫的方法，除非您有特別指定別的方法。此法是比較有效率的，因為傳遞所有引數給程序的時間與所須空間 (4位元組) 都是一樣的，而不管引數是屬於何種資料型態。

您可以利用傳值的方法來傳遞引數，只要在程序的宣告前面包含 ByVal 這個關鍵字。透過此法來傳遞引數會在程序內部消耗掉 2 至 16 位元組，此取決於引數的資料型態。對於大的資料型態利用傳值呼叫會比小的資料型態需要稍長的時間；因此 String 和 Variant 資料型態通常不會使用傳值的方法來傳遞引數。

使用傳值的方法時會將原始的變數複製一份，當做引數傳遞過去。改變程序內部的引數時將不會影響到原始的變數。舉例而言：

Function Factorial (ByVal MyVar As Integer)	' Function declaration.

MyVar = MyVar - 1

If MyVar = 0 Then

Factorial = 1

Exit Function

End If

Factorial = Factorial(MyVar) * (MyVar + 1)

End Function

' Call Factorial with a variable S.

S = 5

Print Factorial(S)	' Displays 120 (the factorial of 5)

Print S	' Displays 5.

在函數的宣告時若無使用 ByVal 關鍵字，則上述的 Print 陳述式將會顯示出1 和 0。這是因為 MyVar 會參考到變數 S，而它會一直減 1 直到其值為 0。

因為 ByVal 產生了引數的複製，所以它允許您傳遞一個 variant 給上述的 Factorial 函數。若程序所宣告的引數是別的資料型態，您將無法利用傳址的方式來傳遞一個 variant。


從函數中傳回字串

���

某些函數具有兩種版本：一種傳回 Variant 資料型態，而另一種傳回 String 資料型態。而 Variant 版本較為方便因為 variants 會自動處理不同型態間的轉換。它們同時也允許 Null 透過運算式來傳送。String 的版本較具有效率，因為它們使用較少的記體。

當有下列之情形時可考慮使用 String 版本：

•	您的程式很大並且使用很多的變數。

•	您將資料直接寫到隨機檔中。

當您在函數名稱後面加上一個錢字符號 ($)，則下列的函數會對於 Sting 變數傳回一個數值。這些函數若不加上錢字符號 ($) 而用於一般的 Variant 時，仍然具有相同的功能與語法。

Chr$	ChrB$	*Command$
CurDir$	Date$	Dir$
Error$	Format$	Hex$
Input$	InputB$	LCase$
Left$	LeftB$	LTrim$
Mid$	MidB$	Oct$
Right$	RightB$	RTrim$
Space$	Str$	String$
Time$	Trim$	UCase$
* 並非在所有的應用程式中都是變數。


瞭解條件式編譯

���

您可以使用條件編譯的方式，來選擇性地執行程序碼區塊；舉例而言，偵錯陳述式會去比較對於相同的任務使用不同方法的速度，或是透過不同的程式語言來探究一個應用程式。

您可利用 #Const 指令在程式碼中宣告一個條件式編譯器常數。並且可以利用#If...Then...#Else 指令來指示對某區塊程式碼做條件式的編譯。下列範例中是以 conDebug 變數為基礎，來執行偵錯程式碼或者產生程式碼。

' Declare public compilation constant in Declarations section.

#Const conDebug = 1

Sub SelectiveExecution()

#If conDebug = 1 Then

.	' Run code with debugging statements.

.

.

#Else

.	' Run normal code.

.

.

#End If

End Sub


瞭解變數的生命週期

���

一個變數能保留住它本身的值這一段時間，稱之為生命週期。變數的值可能在整個生命週期都在改變，但它仍然保存著某一個值。當變數失去了範圍之後，它也就不再保存著任一個值。

當一個程序開始執行時，所有的變數都會被初始化。一個數值變數會初始化成 0，可變長度字串會初始化成長度為零長度字串 ("")，而固定長度字串會被填滿 ASCII 字元碼 0 所表示的字元或是 Chr(0)。Variant變數會被初始化成 Empty。使用者自訂型態中每一個元件變數會被當成個別變數來做初始化。

當您宣告一個物件變數，記憶體中雖有保留空間，但它的值會被設定成 Nothing，直到您利用 Set 陳述式對它指定一個物件引用。

如果在程式碼的執行過程中，變數的值一直未曾改變，則它會繼續保有它的初始值直到它喪失範圍為止。

一個以 Dim 陳述式宣告的程序層次變數會一直保留它的值，直到此程序結束為止。如果某程序呼叫其他的程序，則當其他變數仍在執行時，屬於呼叫者程序的變數仍會保留它的值。

如果一個屬於程序層次的變數是利用 Static 關鍵字來做宣告的話，則只要程式正在任何的模組中執行，則此變數仍會保留它的值。而當所有的程式碼都執行完之後，變數會失去它的範圍和它的值；所以它的生命週期和模組層次的變數是一樣的。

一個模組層次的變數與靜態變數是不同的。在一般模組或物件類別模組中變數會保留它的值，直到您停止執行程式碼。在物件類別模組中只要仍有一個屬於此物件類別的執行個體存在，則變數會一直保留它的值。模組層次的變數會一直佔用記憶體資源，直到您重新設定它們的值，所以只有在必要時才使用它們。

如果您在 Sub 或 Function 陳述式前加上 Static 關鍵字的話，則所有屬於此程序的程序層次變數在程序的呼叫期間，它的值會被保留。


瞭解指名引數與選擇性引數

���

當您呼叫 Sub 或 Function 程序時，您可以根據位置來提供引數，也就是出現在程序定義時的順序；或者根據名稱來提供引數，如此就不用管它的位置。

舉例而言，下面的 Sub 程序接受三個引數：

Sub PassArgs(strName As String, intAge As Integer, dteBirth As Date)

Debug.Print strName, intAge, dteBirth

End Sub

您可以在正確的位置上提供適當的引數來呼叫此函數，每個引數之間都以逗點來區隔，如同下面的範例所示：

PassArgs "Mary", 29, #2-21-69#

您也可以利用指名引數的方式來呼叫程序，每個引數之間也是以逗點來區隔。

PassArgs intAge:=29, dteBirth:=#2/21/69#, strName:="Mary"

一個指名引數，是由引數名稱接著冒號和一個等號 (:=) 最後加上引數值所組成。

指名引數，在您呼叫一個具有選擇性引數的程序時顯得特別有效，因您不必利用逗號去區分出沒有給予引數值的位置。使用指名引數可以很容易的追蹤出您傳遞或省略了那些引數。

在程序的定義中，選擇性引數之前會有一個 Optional 關鍵字，在程序的定義中您也可以指定一個預設值給選擇性引數。舉例而言：

Sub OptionalArgs(strState As String, Optional strCountry As String = "USA")

. . .

End Sub

當您在呼叫具有選擇性引數的程序時，您可以選擇是否要對選擇性引數給予一個值 (如果沒有的話則會採用預設值)。如果沒有指定預設值，則此引數可以是屬於所指定型態的任何變數。

下面的程序中包含一個選擇性引數，varCountry 變數。而 IsMissing 函數可以決定一個選擇性引數是否已經傳遞給程序。

Sub OptionalArgs(strState As String, Optional intRegion As Integer, _

Optional strCountry As String = "USA")

If IsMissing(intRegion) And IsMissing(strCountry) Then

Debug.Print strState

ElseIf IsMissing(strCountry) Then

Debug.Print strState, intRegion

ElseIf IsMissing(intRegion) Then

Debug.Print strState, strCountry

Else

Debug.Print strState, intRegion, strCountry

End If

End Sub

您可以利用指名引數的方式來呼叫上述程序；如下面的範例所示：

OptionalArgs strCountry:="USA", strState:="MD"

OptionalArgs strState:= "MD", intRegion:=5


瞭解物件、屬性、方法和事件

���

一個物件代表應用程式中的一個元素，比如說，工作單、儲存格、圖表、表單，或是一份報告。在 Visual Basic 的程式中，使用物件的任一方法或改變它的屬性值之前，您必須去識別此物件。

物件集合是一個物件內含數個其他的物件，而這些物件通常是相同型態的。舉例而言，在 Microsoft Excel 中的 Workbooks 物件包含了所有已開啟的Workbook 物件。而 Visual Basic 中的 Forms 集合則包含了所有在它所屬應用程式中的 Form 物件。

物件集合中的項目可以透過代碼或名稱來做識別。舉例而言，在下面的程序中 Workbooks(1)會識別為第一個開啟的 Workbook 物件。

Sub CloseFirst()

Workbooks(1).Close

End Sub

下面的程序使用一個表示成字串型態的名稱，來識別 Form 物件。

Sub CloseForm()

Forms("MyForm.frm").Close

End Sub

如果物件集合中的物件具有共同的方法，則您可以同時操作整個物件集合。舉例而言，下列的程序會關閉所有開啟中的表單。

Sub CloseAll()

Forms.Close

End Sub

方法指的是物件可以執行的動作。舉動而言，Add 是屬於 ComboBox 物件的一個方法，因為它會增加一個新的項目到 ComboBox 中。

下面的程序使用 Add 方法，增加一個新的項目到 ComboBox 中。

Sub AddEntry(newEntry as String)

Combo1.Add newEntry

End Sub

屬性是一個物件的特性，它定義了物件的特徵，諸如大小、顏色或螢幕位置等，或某一方面的行為，諸如物件是否有啟動或可見的。您可以透過修改物件的屬性值來改變物件的特徵。

若要更改屬性值，則在物件的引用後面加上一個複合句，它是由屬性名稱加上等號 (=) 以及新的屬性值所組成的。舉例而言，下面的程序透過設定表單中的 Caption 屬性來更改 Visual Basic 表單的標題。

Sub ChangeName(newTitle)

myForm.Caption = newTitle

End Sub

有些屬性您並不能設定。每一個屬性的說明專題，會指出您是否可以設定此屬性 (讀與寫)，或只能讀取此屬性 (唯讀)，還是只能寫入此屬性 (唯寫)。

您可以透過屬性的傳回值，來取得物件的相關訊息。下列的程序利用一個訊息方塊來顯示目前表單之標題，它的位置是在表單的最頂端。

Sub GetFormName()

formName = Screen.ActiveForm.Caption

MsgBox formName

End Sub

事件是一個物件所可以確認與辨別的動作，像按一下滑鼠或按下某鍵等，並且可以寫某些的程式碼針對此述動作來做回應。使用者做動作或程式碼的結果可能導致事件的發生，或是由系統引發。

傳回物件

每一個應用程式都可以傳回它所包含的物件，然而這些物件並非都相同，所以您必須參考說明檔中有關這物件或是物件集合之標題，才會知道如何傳回物件。


瞭解 Automation

���

Automation 功能 (以前稱為 OLE Automation) 是元件物件模型 (COM) 的特色之一。它是一種工業標準技術，應用程式可用來展現其物件為發展工具、巨集語言和其他支援 Automation 功能的應用程式。舉例而言，一個試算表應用程式能展現工作表、圖表、儲存格或儲存格範圍等不同型態的物件。一個文書處理器可能展現如應用程式、文件、段落、句子、書籤或選項的物件。

當一個應用程式支援 Automation 功能時，它的物件就可以被 Visual Basic 存取。Visual Basic 可藉由使用物件的方法，或者取得並設定物件的屬性，來操控這些物件。舉例而言，您可以建立一個名稱為 MyObj 的 Automation 物件，並利用下面所寫的程式碼來存取此物件：

MyObj.Insert "Hello, world."	' 放置文字。

MyObj.Bold = True	' 文字格式。

If Mac = True	' 檢查平台常數。

MyObj.SaveAs  "HD:\WORDPROC\DOCS\TESTOBJ.DOC"	' 儲存物件(Macintosh)。

Else

MyObj.SaveAs  "C:\WORDPROC\DOCS\TESTOBJ.DOC"	' 儲存物件。

(Windows)

您可以使用下面的函數存取一個 Automation 物件：

函數	說明
CreateObject	建立一個指定型態的新物件。
GetObject	從檔案中擷取一個物件。
若要知道應用程式所提供的屬性與方法的更詳細資料，請參閱應用程式文件。應用程式所支援的物件、函數、屬性與方法等通常被定義於該應用程式的物件程式庫中。


瞭解參數陣列

���

參數陣列可用來傳遞陣列型態的引數給程序。所以當您定義程序時就不用知道陣列中的元素個數。

您可以使用 ParamArray 來標示出一個參數陣列。而此陣列的元件型態必須是 Variant，並且此陣列必須是程序定義中最後面那個引數。

下面的範例可告訴您如何定義一個包含參數陣列的程序。

Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)

Dim intI As Integer

Debug.Print strName; "  Scores"

' Use UBound function to determine upper limit of array.

For intI = 0 To UBound(intScores())

Debug.Print "    "; intScores(intI)

Next intI

End Sub

下面的範例可告訴您如何呼叫這個程序。

AnyNumberArgs "Jamie", 10, 26, 32, 15, 22, 24, 16

AnyNumberArgs "Kelly", "High", "Low", "Average", "High"


瞭解有效範圍與可見性

���

有效範圍 (Scope) 指的是變數、常數或程序被其它程序使用的有效性。有三個範圍層次：程序層次、私有模組層次和公用模組層次。

當宣告一個變數時您已決定了它的範圍。將所有的變數做明確的宣告是一個好主意，它可以避免不同範圍中變數之間的名稱衝突錯誤。

定義程序層次的範圍

定義於程序內變數或常數是無法從程序外看到的。只有宣告此變數的程序可以使用它們。在下面的範例中，第一個程序顯示一個包含字串的訊息方塊，而第二個程序則顯示一個空白的訊息方塊，因為變數 strMsg 是屬於第一個程序。

Sub LocalVariable()

Dim strMsg As String

strMsg = "This variable can't be used outside this procedure."

MsgBox strMsg

End Sub

Sub OutsideScope()

MsgBox strMsg

End Sub

定義私有模組層次的範圍

在模組的宣告區段中，您可以定義模組層次變數以及常數。模組層次變數可以是私有或公用。在專案中，公用變數可以被所有模組中的所有程序使用。而私有變數只可以被所屬模組中的程序所使用。由 Dim 陳述式在 Declarations 區段中所宣告的變數，其範圍的預設值為私有。然而，若在變數的前面加上 Private 關鍵字，則其在程式碼中的範圍將更為明顯。

在下面的範例中，字串變數 strMsg 可被定義在此模組中的任何程序使用。 當第二個程序被呼叫時，它會在對話方塊中顯示出字串變數 strMsg 的內容。

' Add following to Declarations section of module.

Private strMsg sAs String

Sub InitializePrivateVariable()

strMsg = "This variable can't be used outside this module."

End Sub

Sub UsePrivateVariable()

MsgBox strMsg

End Sub

附註 公用程序若是在一般模組或物件類別模組中的話，則任何引用專案都可以使用它。為了限制目前專案中模組內的所有程序，可以在模組的 Declarations 區段加上 Option Private Module 陳述式。如此則公用變數和程序仍然可被目前專案中的其它程序所使用，但不能被引用專案所使用。

定義公用模組層次的範圍

如果您宣告一個模組層次變數為公用，它將可被專案中的所有程序使用。在下面的範例中，字串變數 strMsg 可被專案中的所有程序的使用。

' Include in Declarations section of module.

Public strMsg As String

除了事件程序之外，所有的程序的預設值都是公用的。當 Visual Basic 建立一個事件程序，則在程序的宣告前面會自動的加上 Private 關鍵字。若您不想其它的程序為公用的話，您必須利用 Private 關鍵字來明確的宣告程序。

您可以從引用的專案中，去使用它定義在一般模組或物件類別模組中的公用程序、變數，以及常數。然而，您必須先設定一個對它們所屬專案的引用。

公用程序、變數以及常數若不是定義在一般模組或物件類別模組中，例如表單模組，則它們不可以被引用專案所使用，因為這些模組對於引用專案而言是屬於私有的。


瞭解 Variants

���

當您宣告常數、變數或引數時，若無指定資料型態則會自動的指定成 Variant 資料型態。宣告成 Variant 資料型態的變數包含有字串、日期、時間、Boolean或數值，並且會自動的轉換它們的值。Variant 值需要 16 位元組的記憶體 (此點只有在大型的程序或複雜的模組才較具意義)，並且在存取時會比任何明確定義的資料型態來得慢。一般很少使用 Variant 資料型態來表示常數。

下面的陳述式建立一個 Variant 變數：

Dim myVar

Dim yourVar As Variant

theVar = "This is some text."

最後的陳述式中並沒有明確的宣告變數 theVar，但是會隱含性的宣告或稱為自動性宣告。所謂隱含性的宣告變數就是指定成 Variant 資料型態。

秘訣 如果您宣告了變數或引數的資料型態，但卻使用了錯誤的資料型態，如此則會發生資料型態錯誤。不管使用隱含性的宣告 (Variant 資料型態) 或是明確的宣告所有的變數並指定型態，都要避免資料型態錯誤。一般較喜歡用後者。


瞭解 Visual Basic 語法

���

Visual Basic Help 專題中有關方法、陳述式或是函數的語法，展示了正確使用陳述式、方法或是函數所需要的元素。在這個專題中的範例，解釋了如何去解譯最常見的語法元素。

Activate 方法的語法

object.Activate

在這個範例中，Activate 語法中的斜體字 [object]，是一個您所提供資訊的持有者，在此例中的程式碼會傳回一個物件。在鍵入粗體字時必須完全像上面的例子一樣。舉例而言，下面的程序會在使用文件中啟動第二個視窗。

Sub MakeActive()

Windows(2).Activate

End Sub

MsgBox 函數的語法

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

在 MsgBox 函數的語法中，粗體的斜體字是此函數的指名引數。中括號所包含的引數是選擇性的 (在 Visual Basic 的程序碼中您不用鍵入中括號)。在 MsgBox 函數中，唯一您必須提供的引數 (prompt) 是做為提示的文字。

在程式碼中可以利用位置或名稱來指定函數與方法的引數。若利用位置來指定引數，則必須根據語法中的順序，利用逗號來區隔每一個引數。舉例而言：

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

若以名稱來指定引數，則須使用引數名稱接著冒號與等號 (:=)，最後再加上引數值。您可以任何的順序來指定引數，例如：

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

函數以及某些方法的語法會利用括號將引數包含起來。這些函數以及方法會傳回值，所以您必須用括號將引數包含起來，才可以指定值給變數。如果您想忽略傳回值或是沒有傳遞所有的引數，則可以不用括號。方法若不回傳值，則不用將引數用括號包含起來。上述準則不管是使用指名引數或位置引數都適用。

在下面的範例中，MsgBox 函數的傳回值是一個號碼，它被儲存在變數 myVar 中，以用來指出使用者選了那個按鈕。因為需要用到傳回值，所以呼叫時必須使用括號。而另一個訊息方塊則是用來顯示變數 myVar 的值。

Sub Question()

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

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

MsgBox myVar

End Sub

選擇性陳述式的語法

Option Compare {Binary | Text | Database}

在 Option Compare 陳述式的語法中，大括號以及垂直線代表從所列的三個項目中做選擇 (在 Visual Basic 的陳述式中您不用鍵入大括號)。舉例而言，下列的陳述式指出在模組中，字串的比較是根據文字的排列順序而不管大小寫。

Option Compare Text

Dim 陳述式的語法

Dim varname[([subscripts])] [As type] [, varname[([subscripts])] [As type]] . . .

在 Dim 陳述式的語法中，Dim 是必備的關鍵字。而唯一必備的元素是 varname(變數名稱)。舉例而言，下列的陳述式建立三個變數：myVar、nextVar、和 thirdVar，它們會自動被宣告成 Variant 型態的變數。

Dim myVar, nextVar, thirdVar

下面的範例宣告了一個型態為 String 的變數；它包含了資料型態，如此可以節省記憶體並且幫助您從程式碼中找出錯誤。

Dim myAnswer As String

若在一個陳述式中宣告好幾個變數，則必須包含每一個變數的型態。變數在宣告時若少了資料型態，則會自動的宣告成 Variant 型態。

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

在下列的陳述式中，x 與 y 都指定成 Variant 資料型態，只有 z 被指定成 String 資料型態。

Dim x, y, z As Integer

如果您宣告一個陣列變數則您必須包含括號，但陣列索引則是選擇性的。下列的陳述式中定義了一個動態陣列 myArray。

Dim myArray()


使用陣列

���

您可以宣告一個陣列來代表一群具有相同資料型態的值。陣列是單一型態的變數，它具有很多的元件可以儲存很多值；而一般的變數只有一個儲存元素，所以只能儲存一個值。您可以參考到整個陣列或是只參考到陣列的個別元素。

舉例而言，若要儲存一年中每天的支出，您可以宣告一個具有 365 個元素的陣列變數；而不是宣告 365 個變數。陣列中的每一個元素都內含一個值，下列的陳述式宣告陣列變數 curExpense 具有 365 個元素。根據預設值，陣列的索引是從零開始，所以此陣列的上標界是 364 而不是 365。

Dim curExpense(364) As Currency

若要設定個別元素的值，您必須指定元素的索引。下面的範例，對於陣列中的每個元素都指定一個初始值 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 陳述式，將陣列第一個元素的索引值從 0 改成 1。在下面的範例中，Option Base 陳述式改變陣列第一個元件的索引值，接著 Dim 陳述式宣告陣列變數 curExpense 具有 365 個元素。

Option Base 1

Dim curExpense(365) As Currency

您也可以利用 To 子句來對陣列的下標界做明確宣告，如下面的範例所示：

Dim curExpense(1 To 365) As Currency

Dim strWeekday(7 To 13) As String

儲存 Variant 的值在陣列中

有兩種方式可以建立一個元素型態為 Variant 的陣列。第一種方式是宣告陣列為 Variant 資料型態，如下面的範例所示：

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 函數所傳回的陣列為一個 Variant 變數，如下面的範例所示：

Dim varData As Variant

varData = Array("Ron Bendel", "4242 Maple Blvd", 38, _

Format("06-09-1952", "General Date"))

對於元素型態為 Variant 的陣列，您可以利用索引來識別各元素，而不管您用何種方式建立此陣列。舉例而言，下列的陳述式可以被加到上述的範例中。

MsgBox "Data for " & varData(0) & " has been recorded."

使用具有多重維數的陣列

在 Visual Basic 中您最多可以宣告變數到 60 個維數。舉例而言，下列的陳述式宣告一個 5 乘 10 的 2 維陣列。

Dim sngMulti(1 To 5, 1 To 10) As Single

如果您將陣列想成矩陣，則第一個引數代表行，而第二個引數代表列。

您可以使用巢狀的 For...Next 陳述式去處理多重維數陣列。下列的程序將一個 2 維陣列的所有元素都填入一個 Single。

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


使用常數

���

您的程式碼可能頻繁的出現常數值，或可能某些數值是非常難以記憶並且無明確意義的。使用常數可能讓您的程式碼更容易讀取與維護。常數是一個有意義的名稱，它可以代換一個號碼或字串而且值不會改變。您不可以修改一個常數或如同操作變數般的指定一個新值給常數。

有三種型態的常數：

•	內建常數或系統定義常數是由應用程式與控制項所提供。其它的應用程序如 Microsoft Access、Microsoft Excel 、Microsoft Project 以及 Microsoft Word 會提供物件程式庫以及一串的常數，您可以將這些常數與它們所屬的物件，方法以及屬性等一起使用。您可以獲得一串特別為物件瀏覽中的物件程式庫所提供的常數。

Visual Basic 的常數都列示在 Visual Basic for Applications型態程式庫以及 Data Access Object (DAO) 程式庫之中。

附註 Visual Basic 仍會對之前的 Visual Basic 或 Visual Basic for Applications 所定義的常數做識別。您可以提升您的常數到 Object Browser 之中。在 Object Browser 中所列示的常數，不用在您的應用程式中宣告。

•	象徵性或使用者自訂常數都是利用 Const 陳述式來宣告。

•	條件式編譯常數都是利用 #Const 陳述式來宣告。

在早期版本的 Visual Basic 中，常數的名稱都是用大寫字串加上一橫底線而成，例如：

TILE_HORIZONTAL

內建常數目前被用來避免，不同物件程式庫具有相同名稱的常數所造成的混淆；而這些常數可能具有不同的值。一般有兩個方式可以描述常數名稱：

•	透過字首

•	透過程式庫引用

以字首來命名常數

所有物件提供的內建常數都以混合字元格式顯示；以 2 個字元為字首來指出定義這些常數的物件程式庫。例如，由 Visual Basic for Applications 物件程式庫所宣告的常數都會以 [vb] 為開端，而由 Microsoft Excel 物件程式庫所宣告的的常數都會以 [xl] 為開端。下面的範例說明了如何應用字首字元於附加控制項；其通常是與型態程式庫相關的。

•	vbTileHorizontal

•	xlDialogBorder

用程式庫引用來命名常數

您也可利用下列的語法來描述對常數的引用：

[libname.] [modulename.]constname

描述常數的語法具有下列幾個單元：

單元	說明
libname	選擇性引數。定義此常數的型態程式庫。對於大部份的附加控制項 (在Macintosh 上無法使用。)，它是此控制項的物件類別名稱。如果您忘掉了物件類別名稱，可將滑鼠的游標移動到工具箱中此控制項的位置，則物件類別名稱會顯示在「工具提示」中。
modulename	選擇性引數。定義此常數的型態程式庫，所包含的模組之名稱。您可以利用「物件瀏覽」來找到模組的名稱。
constname	在型態程式庫中定義的常數名稱。
舉例而言：

Threed.LeftJustify


更有效率的使用資料型態

���

除非有其它的指定，否則未宣告的變數會被自動指定成 Variant 資料型態。這個資料型態可使寫程式變得較簡易，但它並非是最有效率的資料型態。

若有下列情形時您必須考慮其它的資料型態：

•	您的程式非常大並且使用很多變數。

•	您程式的執行速度必須儘可能加快時。

•	您要將資料直接寫到隨機案。

除了 Variant 之外，其它的資料型態包括 Byte、Boolean、Integer、Long、Single、Double、Currency、Decimal、Date、Object 以及 String。您可使用 Dim 陳述式去宣告一個特定型態的變數，舉例而言：

Dim X As Integer

上述陳述式宣告變數 X 是一個整數，其範圍介於 -32,768 到 32,767 之間。如果您試著去設定超出此範圍的數值給 X ，則會有錯誤發生。如果您試著去指定一個分數給 X，則此分數會自動四捨五入，舉例而言：

X = 32768	' Causes error.

X = 5.9	' Sets x to 6.


使用 Do...Loop 陳述式

���

您可以使用 Do...Loop 陳述式去執行一個區塊的陳述式，而它所用掉的時間是不確定的。當條件式為 True 或直到條件式變成 True 之前，此陳述式會一直重複。

重複陳述式直到條件式為 True

當使用 While 關鍵字去檢查 Do...Loop 陳述式中的條件式時，可以有兩種不同的方式。您可以在進入迴圈之前檢查條件式，也可以在迴圈至少執行一次之後才檢查條件式。

在下面的 ChkFirstWhile 程序中，是在進入迴圈之前檢查條件式。如果 將 myNum 的值由 20 替換成 9，則在迴圈中的陳述式將永遠不會執行。 在ChkLastWhile 程序中，在條件式變成 False 之前迴圈中的陳述式會一直執行。

Sub ChkFirstWhile()

counter = 0

myNum = 20

Do While myNum > 10

myNum = myNum - 1

counter = counter + 1

Loop

MsgBox "The loop made " & counter & " repetitions."

End Sub

Sub ChkLastWhile()

counter = 0

myNum = 9

Do

myNum = myNum - 1

counter = counter + 1

Loop While myNum > 10

MsgBox "The loop made " & counter & " repetitions."

End Sub

重複執行陳述式直到條件式變成 True

當使用 Until 關鍵字去檢查 Do...Loop 陳述式中的條件式時，可以有兩種不同的方式。 您可以在進入迴圈之前檢查條件式 (如同 ChkFirstUntil程序所示)，也可以在迴圈至少執行一次之後才檢查條件式 (如同 ChkLastUntil程序所示)。當條件式仍然為 False 時，迴圈會一直執行。

Sub ChkFirstUntil()

counter = 0

myNum = 20

Do Until myNum = 10

myNum = myNum - 1

counter = counter + 1

Loop

MsgBox "The loop made " & counter & " repetitions."

End Sub

Sub ChkLastUntil()

counter = 0

myNum = 1

Do

myNum = myNum + 1

counter = counter + 1

Loop Until myNum = 10

MsgBox "The loop made " & counter & " repetitions."

End Sub

從 Do...Loop 陳述式中離開

您可以使用 Exit Do 陳述式來離開 Do...Loop 陳述式。舉例而言，為了離開無窮迴圈，可以將 Exit Do 陳述式放在 If...Then...Else 陳述式或是 Select Case 陳述式中的 True 陳述式區塊。如果條件式為 False，則迴圈會像平常一樣執行。

在下面的範例中，myNum 被指定一個會造成無窮迴圈的值。而 If...Then...Else 陳述式會去檢查這個情況然後離開，以避免無窮迴圈。

Sub ExitExample()

counter = 0

myNum = 9

Do Until myNum = 10

myNum = myNum - 1

counter = counter + 1

If myNum < 10 Then Exit Do

Loop

MsgBox "The loop made " & counter & " repetitions."

End Sub

附註 可以按下 ESC 或 CTRL+BREAK 來終止無窮迴圈。


使用 For...Next 陳述式

���

您可以使用 For...Next 陳述式去執行一個區塊的陳述式，而它所用掉的時間是特定的。For 迴圈使用一個計數變數，當反覆的執行迴圈時它的值會增加或減少。

下面的程序會讓電腦發出嗶聲 50 次。For 陳述式會指定計數變數 x 的開始與結束值。Next 陳述式會將計數變數的值加 1。

Sub Beeps()

For x = 1 To 50

Beep

Next x

End Sub

使用 Step 關鍵字，可以增加或減少計數變數的值，並且增減值可由您指定。在下面的範例中，計數變數 j 會在迴圈重複時加上 2。當迴圈結束時，total 的值為 2、4、6、8 和 10 的總合。

Sub TwosTotal()

For j = 2 To 10 Step 2

total = total + j

Next j

MsgBox "The total is " & total

End Sub

為了減少計數變數的值，您可以使用負的 Step 值。為了減少計數變數的值，您必須指定一個小於開始值的結束值。在下面的範例中，計數變數 myNum 會在迴圈重複時減去 2。當迴圈結束時，total 的值為 16、14、12、10、8、6、4 和 2 的總合。

Sub NewTotal()

For myNum = 16 To 2 Step -2

total = total + myNum

Next myNum

MsgBox "The total is " & total

End Sub

附註  在 Next 陳述式後面可以不用加上計數變數的名稱；上述的範例中因為要具有可讀性所以才加上計數變數的名稱。

在 For...Next 陳述式中您可以在計數變數到達它的結束值之前，使用 Exit For 陳述式來離開。舉例而言，當錯誤發生時可以將 Exit For 陳述式放在 If...Then...Else 陳述式或是 Select Case 陳述式中的 True 陳述式區塊，它是專門用來檢查此錯誤的。如果沒有錯誤發生，If...Then...Else 陳述式的值為 False，則迴圈會像預期一樣的執行。


使用 For Each...Next 陳述式

���

For Each...Next 陳述式會重複執行一個區塊的陳述式，而它是作用於集合物件中的每個物件或是陣列中的每個元素。當迴圈執行一次則 Visual Basic 會自動設定一個變數。舉例而言，下面的程序會關閉所有的表單，除了表單內含的程序正在執行以外。

Sub CloseForms()

For Each frm In Application.Forms

If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close

Next

End Sub

下面的程式碼會在陣列的每個元素中產生迴圈執行，並且將每個元素值設定成它的索引值 。

Dim TestArray(10) As Integer, I As Variant

For Each I In TestArray

TestArray(I) = I

Next I

對某範圍的儲存格做迴圈執行

您可以使用 For Each...Next 迴圈對某範圍的儲存格做迴圈執行。下面的程序會對於 Sheet1 中的 A1:D10 範圍做迴圈執行，並將任何絕對值小於 0.01 的號碼設為 0。

Sub RoundToZero()

For Each myObject in myCollection

If Abs(myObject.Value) < 0.01 Then myObject.Value = 0

Next

End Sub

在 For Each...Next 迴圈結束前離開

您可以使用 Exit For 陳述式來離開 For Each...Next 迴圈。舉例而言，當錯誤發生時可以將 Exit For 陳述式放在 If...Then...Else 陳述式或是 Select Case 陳述式中的 True 陳述式區塊，它是專門用來檢查此錯誤的。如果沒有錯誤發生，If...Then...Else 陳述式的值為 False，則迴圈會像預期一樣的執行。

下面的範例，會試著在 A1:B5 範圍內找出第一個不含數值的儲存格。如果有找到此類儲存格，則會有訊息顯示並用 Exit For 陳述式跳出迴圈。

Sub TestForNumbers()

For Each myObject In MyCollection

If IsNumeric(myObject.Value) = False Then

MsgBox "Object contains a non-numeric value."

Exit For

End If

Next c

End Sub


使用 If...Then...Else 陳述式

���

If...Then...Else 陳述式會根據條件式的值，而執行指定的陳述式或一個區塊的陳述式。If...Then...Else 陳述式可以依據您的需要而做多階層的巢狀執行。然而，為了可讀性您可能會使用 Select Case 陳述式而不使用多階層的巢狀 If...Then...Else 陳述式。

如果條件式為 True 則執行陳述式

當條件式為 True 時，若只要執行一個陳述式，則您可以使用單行的 If...Then...Else 語法。下列的範例展示了單行語法，並省略了 Else 關鍵字：

Sub FixDate()

myDate = #2/13/95#

If myDate < Now Then myDate = Now

End Sub

若要執行多行程式碼的話，您必須使用多行的語法，而此語法須包含 End If 陳述式，如同下面範例所示：

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = "Red"

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

End If

End Sub

當條件式為 True，執行某些陳述式；條件式為 False，執行其餘的陳述式

使用 If...Then...Else 陳述式可以定義兩個可執行的陳述式區塊：其中一個區塊會在條件式為True 時執行；而另一個區塊會在條件式為 False 時執行。

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = vbRed

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

Else

AlertLabel.Forecolor = vbBlack

AlertLabel.Font.Bold = False

AlertLabel.Font.Italic = False

End If

End Sub

當第一個條件式為 False 時，測試第二個條件式

當第一個條件式為 False 時，您可以在 If...Then...Else 陳述式中加上 ElseIf 陳述式來測試第二個條件式。舉例而言，下列的函數程序根據工作分類來計算獎金。如何所有 If 和 ElseIf 陳述式中條件式都是 False，則會執行緊接在 Else 陳述式之後的陳述式。

Function Bonus(performance, salary)

If performance = 1 Then

Bonus = salary * 0.1

ElseIf performance = 2 Then

Bonus = salary * 0.09

ElseIf performance = 3 Then

Bonus = salary * 0.07

Else

Bonus = 0

End If

End Function


在程式碼中使用括號

���

Sub 程序、內建的陳述式、以及某些方法並不會回傳值，所以它的引數並不必用括號包含起來。例如：

MySub "stringArgument", integerArgument

Function 程序、內建的函數、以及某些方法會回傳值，但您也可以忽略這些傳回的值。如果要這些傳回的值，您不必使用括號。呼叫函數時只要如同呼叫 Sub 程序即可。其方式為，省略括號，列出所需的引數並且不要指定函數的傳回值給變數。舉例而言：

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

若要使用函數的傳回值，則必要將引數用括號包含起來，如下面的範例所示：

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

Sub 或 Function 程序中的陳述式可以利用指名引數的方式來呼叫程序。不管您是否使用指名引數，括號的使用準則一樣適用。當您使用指名引數時，您可以用任何的順序來列示引數名稱，並且可以省略選擇性引數。指名引數後面總是接著冒號和等號 (:=)，最後加上引數值。

下面的範例使用指名引數來呼叫 MsgBox 函數，但省略了傳回值：

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

下面的範例使用指名引數來呼叫 MsgBox 函數，並且指定傳回值給變數answer：

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

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


使用 Select Case 陳述式

���

將一個運算式與數個不同的值比較時，可以使用 Select Case 陳述式來取代在 If...Then...Else 陳述式中使用 ElseIf。If...Then...Else 陳述式會計算每個 ElseIf 陳述式中的運算式，而 Select Case 陳述式只會在控制結構的頂端計算一次運算式。

在下面的範例中，Select Case 陳述式會計算傳送給此程序的引數performance。請注意，每一個 Case 陳述式可以含有一個以上的值，一段範圍的值，或是一個組合值以及比較運算子。選擇性的 Case Else 陳述式只有在引數值無法與 Select Case 中所有的 Case 陳述式相符合時才會執行。

Function Bonus(performance, salary)

Select Case performance

Case 1

Bonus = salary * 0.1

Case 2, 3

Bonus = salary * 0.09

Case 4 To 6

Bonus = salary * 0.07

Case Is > 8

Bonus = 100

Case Else

Bonus = 0

End Select

End Function


使用 With 陳述式

���

With 陳述式可以讓您指定一系列的陳述式中的一個物件或使用者自訂型態。With 陳述式可以讓您的程序執行的更快速並且幫助您避免重複的鍵入程式碼。

下面的範例將某一範圍的儲存格都填入 30，字型使用黑體格式，並將儲存格的內部顏色設定成黃色。

Sub FormatRange()

With Worksheets("Sheet1").Range("A1:C10")

.Value = 30

.Font.Bold = True

.Interior.Color = RGB(255, 255, 0)

End With

End Sub

您可以將 With 陳述式做巢狀的使用，如此將更具有效率。下面的範例在 A1 這個儲存格中插入一個公式，然後對字型做格式化。

Sub MyInput()

With Workbooks("Book1").Worksheets("Sheet1").Cells(1, 1)

.Formula = "=SQRT(50)"

With .Font

.Name = "Arial"

.Bold = True

.Size = 8

End With

End With

End Sub


Visual Basic 的命名規則

���

當您在 Visual Basic 的模組中為程序、常數、變數以及引數取名稱時，您可以使用下列的規則：

•	第一個字元您必須使用英文字母。

•	您不能在名稱中使用空白、句點 (.)、驚嘆號 (!)、或 @&$# 等字元。

•	名稱的長度不可以超過 255 字元。

•	通常，您使用的名稱不能與 Visual Basic 本身的函數、陳述式以及方法的名稱相同。您必須結束使用與程式語言的關鍵字相同的名稱。若所使用的內建語言函數，陳述式或方法與所指定的名稱相衝突，則必須明確的識別它。一般會將內建函數，陳述式或方法的名稱之前加上所屬的型態程式庫的名稱。舉例而言，如果您有一個名為 Left 的變數，則您只能用 VBA.Left 來啟用 Left 函數。

•	您不能在相同層次範圍中使用重複的名稱。舉例而言，您不能在同一程序中宣告兩個名稱為 age 的變數。然而您可以在同一模組中宣告一個私有變數名稱 age 以及程序層次的變數名稱 age。

附註 Visual Basic 不管大小寫，但它會保留在陳述式宣告時所用的大寫字母。


在應用程式間交叉運作

���

Visual Basic 可以從很多的 Microsoft 應用程式中建立新的物件以及擷取已存在的物件。其它的應用程式也可能有提供可用 Visual Basic 建立的物件。欲知更詳盡的資訊，請參閱應用程式文件。

若要建立新的物件或是從其它應用程式中擷取已存在的物件，您可以使用 CreateObject 函數或是 GetObject 函數：

' Start Microsoft Excel and create a new Worksheet object.

Set ExcelWorksheet = CreateObject("Excel.Sheet")

' Start Microsoft Excel and open an existing Worksheet object.

Set ExcelWorksheet = GetObject("SHEET1.XLS")

' Start Microsoft Word.

Set WordBasic = CreateObject("Word.Basic")

大部份的應用程式會提供 Exit 或 Quit 方法來關閉應用程式，而不必管它是否為可見的。關於應用程式所提供物件、方法、程序，若您想瞭解更詳細的資訊，請參閱應用程式文件。

某些應用程式引許您使用 New 關鍵字來建立一個存在於型態程式庫中的物件。舉例而言：

Dim X As New Field

在此事例中，Field 是一個屬於資料存取型態程式庫的物件類別範例。使用此語法可以建立一個 Field 物件。您可以參閱應用程式文件得知，使用此方式可以建立那些的物件類別。


撰寫一個 Function 程序

���

Function 程序是一系列由 Function 和 End Function 陳述式所包含起來的 Visual Basic 陳述式。Function 程序和 Sub 程序很類似，但函數可以傳回一個值。Function 程序可經由呼叫者程序透過傳遞引數，例如常數、變數、或是運算式等來呼叫它。如果一個 Function 程序沒有引數的話，它的 Function 陳述式必須包含一個空的括號。函數會利用在程序內的一個或數個陳述式中指定一個值給函數名稱來傳回值。

在下面的範例中，Celsius 函數會根據華式溫度來計算攝氏溫度。當 Main 程序呼叫此函數時，會有一包含引數值的變數傳遞給此函數。而結果會回傳給呼叫者程序，並且顯示在一個訊息方塊中。

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


撰寫一個屬性程序

���

Property 程序是一系列的 Visual Basic 陳述式，它允許程式設計師去建立並操作自訂的屬性。

•	Property 程序可以用來為表單，一般模組，以及物件類別模組建立唯讀屬性。

•	Property 程序可被用來在程式碼中取代 Public 變數，當設定屬性時上述動作應被執行。

•	與 Public 變數不同，在「物件瀏覽」中 Property 程序會有一些的說明字串指定給它們。

當您建立一個 Property 程序，它會變成此程序所屬之模組的一個屬性。Visual Basic 提出下列三種型態的 Property 程序：

程序	說明
Property Let	一個用來設定屬性值的程序。
Property Get	一個用來傳回屬性值的程序。
Property Set	一個用來設定對物件引用的程序。
宣告 Property 程序的語法如下所示：

[Public | Private] [Static] Property {Get | Let | Set} propertyname_ [(arguments)] [As type]

statements

End Property

Property 通常是成對使用：Property Let 與 Property Get 一組，而 Property Set 與 Property Get 一組。單獨宣告一個 Property Get 程序就像宣告唯讀屬性。三個 Property 程序一起使用時只有對 Variant 變數有效，因為只有 Variant 才能包含一個物件或其它資料型態的資訊。Property Set 本意是使用在物件上；而 Property Let 則不是。

在 Property 程序宣告時所需要的引數都列示在下表中：

程序	宣告語法
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)
在所有相同名稱的 Property 程序中，從第一個到最後一個引數 (1,,,,n) 都必須共用相同的名稱與資料型態。

 Property Get 程序宣告時所需的引數比 Property Let 以及 Property Set 宣告少一個。Property Get 程序的資料型態必須與 Property Let 以及 Property Set 宣告中的第 n+1 引數個相同。舉例而言，如果您宣告下列的 Property Let 程序，則 Property Get 宣告所使用引數的名稱與資料型態必須 Property Let 程序中所用一樣。

Property Let Names(intX As Integer, intY As Integer, varZ As Variant)

' Statement here.

End Property

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

' Statement here.

End Property

在 Property Set 宣告中，最後一個引數的資料型態必須是物件型態或是 Variant 型態。


撰寫一個 Sub 程序

���

Sub 程序是一系列由 Sub 和 End Sub 陳述式所包含起來的 Visual Basic 陳述式，它們會執行動作卻不能傳回一個值。Sub 程序可經由呼叫者程序透過傳遞引數，例如常數、變數、或是運算式等來呼叫它。如果一個 Sub 程序沒有引數，則它的 Sub 陳述式必須包含一個空的括號。

下面 Sub 程序中，每一行都有註解來解釋它的作用：

' Declares a procedure named GetInfo

' This Sub procedure takes no arguments

Sub GetInfo()

' Declares a string variable named answer

Dim answer As String

' Assigns the return value of the InputBox function to answer

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

' Conditional If...Then...Else statement

If answer = Empty Then

' Calls the MsgBox function

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

Else

' MsgBox function concatenated with the variable answer

MsgBox Prompt:="Your name is " & answer

' Ends the If...Then...Else statement

End If

' Ends the Sub procedure

End Sub


撰寫指定陳述式

���

指定陳述式會指定一個值或運算式給變數或是常數。指定陳述式通常會包含一個等號 (=)。下面範例，指定 InputBox 函數的傳回值給變數 yourName。

Sub Question()

Dim yourName As String

yourName = InputBox("What is your name?")

MsgBox "Your name is " & yourName

End Sub

Let 陳述式是具選擇性的，而通常會省略它。舉例而言，上述的指定陳述式可以寫成：

Let yourName = InputBox("What is your name?")

Set 陳述式可被用來指定一個物件給已宣告成物件型態的變數。而 Set 關鍵字是必備的。下面範例中，Set 陳述式指定 Sheet1 上的一個範圍給物件變數 myCell：

Sub ApplyFormat()

Dim myCell As Range

Set myCell = Worksheets("Sheet1").Range("A1")

With myCell.Font

.Bold = True

.Italic = True

End With

End Sub

設定屬性值的陳述式也是一個指定陳述式。下面的範例，將屬於儲存格的 Font 物件之 Bold 屬性設成 True ，而此儲存格指的是使用中的儲存格：

ActiveCell.Font.Bold = True


撰寫宣告陳述式

���

您可以使用宣告陳述式去對程序、變數、陣列以及常數等做命名以及定義的動作。當您宣告一個程序、變數或常數時，您也同時定義了它的範圍，而此範圍是取決於宣告的位置以及您用什麼關鍵字來宣告它。

下面的範例包含三個宣告：

Sub ApplyFormat()

Const limit As Integer = 33

Dim myCell As Range

' More statements

End Sub

Sub 陳述式 (具有相對的 End Sub 陳述式) 宣告一個程序名稱 ApplyFormat。當 ApplyFormat 程序被呼叫或執行時，所有包含於 Sub 與 End Sub 中的陳述式都會執行。

•	撰寫一個 Sub 程序

Const 陳述式宣告常數 limit 為 Integer 資料型態，其值 33。

•	宣告常數

Dim 陳述式宣告變數 myCell；它是一個屬於 Microsoft Excel Range 物件的資料型態。您可以將變數宣告成任何的物件，而此物件必須屬於您正在使用中的應用程式。Dim 陳述式是屬於用來宣告變數的陳述式之一。其它用來宣告的關鍵字有 ReDim、Static、Public、Private 以及 Const。

•	宣告變數


撰寫可執行的陳述式

���

一個可執行的陳述式會啟始動作。它可以執行一個方法或是函數，並且可以執行迴圈或從某一區塊的程式碼中做分支執行。可執行的的陳述式通常包含數學的或條件運算子。

下面的範例，使用 For Each...Next 陳述式重複對屬於 MyRange 範圍內的每個儲存格做動作，而此範圍是屬於使用中的 Microsoft Excel 工作單中的 Sheet1。

Sub ApplyFormat()

Const limit As Integer = 33

For Each c In Worksheets("Sheet1").Range("MyRange").Cells

If c.Value > limit Then

With c.Font

.Bold = True

.Italic = True

End With

End If

Next c

MsgBox "All done!"

End Sub

範例中的 If...Then...Else 陳述式會檢查儲存格的值。如果它的值超過 33，則 With 陳述式會設定儲存格中 Font 物件的 Bold 和 Italic 屬性。而 If...Then...Else 陳述式會以 End If 做結束。

With 陳述式可以節省程式碼鍵入次數，因為所包含的陳述式會自動的執行於緊接在 With 關鍵字後面的物件中。

Next 陳述式會去呼叫儲存格集合中的下一個儲存格，而此儲存格集合是包含於 MyRange 範圍中。

MsgBox 函數 (它會顯示一個內建的 Visual Basic 對話方塊) 會顯示一個訊息用來指出 Sub 程序已經結束執行。


將資料寫到檔案中

���

當您在工作時需要用到一大群的資料時，將資料寫到檔案或從檔案獨取資料是較便利的方式。Open 陳述式讓您可以直接的建立並存取檔案。Open 陳述式提供三種檔案存取型態：

•	循序存取 (Input、Output 以及 Append 模式) 被用來寫入文字檔，比如錯誤登入以及報告。

•	隨機存取 (Random 模式) 被用來讀取與寫入資料到檔案並且沒有關閉檔案。隨機存取會資料保留在記錄中，如此可輕易的找出資訊所在。

•	二進位存取 (Binary 模式) 被用來讀取或寫入資料到檔案中任何的位元組位置，例如儲存或顯示一個點陣圖。

附註  Open 陳述式不可以用來開啟一個應用程式專屬的檔案型態。舉例而言，不可使用 Open 去開啟一個 Word 的文件一個，Microsoft Excel 的試算表，或是 Microsoft Access 資料庫。若如此做的話會喪失檔案的完整性，並造成檔案的錯誤。

下面的表格列出了，從檔案讀取資料以及寫入資料到檔案時，一般會使用的陳述式。

存取型態	寫入資料	讀取資料
循序	Print #, Write #	Input #
隨機	Put	Get
二進位	Put	Get


撰寫 Visual Basic 陳述式

���

Visual Basic 中的陳述式是一個完整的指令。它可以包含關鍵字、運算子、變數、常數以及運算式。每一個陳述式都屬於下列三種分類之一：

•	宣告陳述式，它會為變數、常數、或程序取名稱，並且指定一個資料型態。

撰寫宣告陳述式

•	指定陳述式，它會指定一個值或運算式給變數或常數。

撰寫指定陳述式

•	可執行陳述式，它會啟始動作。它可以執行一個方法或是函數，並且可以執行迴圈或從某一區塊的程式碼中做分支執行。可執行的陳述式通常包含數學的或條件運算子。

撰寫可執行的陳述式

將陳述式連續地寫在數行上

通常我們會將一個陳述式寫在同一行中，但您也可以利用一個換行接續符號將陳述式寫到下一行中。下面的範例中，可執行陳述式 MsgBox 被接續的寫在三行中：

Sub DemoBox()  'This procedure declares a string variable,

' assigns it the value Claudia, and then displays

' a concatenated message.

Dim myVar As String

myVar = "John"

MsgBox Prompt:="Hello " & myVar, _

Title:="Greeting Box", _

Buttons:=vbExclamation

End Sub

加上註解

註解可以為讀您程式碼的人解釋程序或是特別的指令。Visual Basic 在執行您的程序時，會忽略掉註解。註解行可由省略符號或 Rem 接著一個空白做為開始，並且可以加在程序的任何地方。若要在陳述式的同一行中加上註解，您必須在陳述式後面插入一個省略符號然後加上註解文字。一般的預設值，註解會以綠色文字顯示。

檢查語法錯誤

如果您在鍵入一行程式碼並按下 ENTER 鍵之後，此行程式碼變成以紅色文字顯示 (同時可能也顯示一個錯誤訊息)，則您必須找出陳述式中的錯誤並更正它。


使用增益功能管理員

���

使用「增益功能管理員」對話方塊來載入或釋出增益功能。例如，您如果只關閉增益功能的可見部分�}方法是連按兩下其系統功能表或按一下其關閉按鈕，則其表單會從螢幕上消失，但此增益功能仍會保留在記憶體中。add-in 物件本身通常會駐留在記憶體中，直到此增益功能與「增益功能管理員」對話方塊中斷連接。