首頁 > 開發 > 其他 > 正文

VBA 編程基礎

2019-10-14 22:10:47
字體:
來源:轉載
供稿:網友
11.3.1 了解 Visual Basic 語法
本節解釋最常見的語法元素。
11.3.1.1 Activate 方法的語法
語法:object.Activate
在 Activate 方法的語法中,object 是一個所提供信息的占位符,在此例中的代碼會返回一個對象。例如,下面的過程會在活動的文檔中激活第二個窗口。
Sub MakeActive()
Windows(2).Activate
End Sub

11.3.1.2 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 中,以用來指示選擇的按鈕。因為需要用到返回值,所以調用時必須使用圓括號。而另一個消息框則是用來顯示變量的值。

Sub Question()
myVar = MsgBox(Prompt:="I enjoy my job.", _
Title:="Answer Box", Buttons:="4")
MsgBox myVar
End Sub

11.3.1.3 選項語句的語法
語法:Option Compare {Binary | Text | Database}
在 Option Compare 語句的語法中,大括號和垂直線指示三項中的強制性選擇(在Visual Basic 的語句中不用鍵入大括號)。例如,下列的語句指出在模塊中,字符串的比較是根據文本的排序順序而不區分大小寫。
Option Compare Text


11.3.1.4 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 As Integer,Z As String
如果聲明一個數組變量,則必須包含圓括號,但下標則是可選的。下列的語句中定義了一個動態數組 myArray。
Dim myArray()

11.3.2 有效地利用數據語法
表11-1 列出VBA 所支持的數據類型,以及存儲空間的大小與范圍。


注意:
任何數據類型的數組都需要 20 個字節的內存空間,加上每一數組維數占 4 個字節,再加上數據本身所占用的空間。數據所占用的內存空間可以用數據元數目乘上每個元素的大小加以計算。例如,以 4 個 2 字節的Integer 數據元所組成的一維數組中的數據,占 8個字節。這 8 個字節加上額外的 24 個字節,使得這個數組所需總內存空間為 32 個字節。包含一數組的 Variant 比單獨的一個數組需要多 12 個字節。
注意:
使用 StrConv 函數把字符串數據從一種類型轉換為另一種類型。
除非有其他的指定,否則未聲明變量會被指定成 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 ' 產生錯誤。 X = 5.9 ' 設置 x = 6。

11.3.3 Visual Basic 的命名規則
當在 Visual Basic 的模塊中為過程、常數、變量以及參數命名時,可以使用下列的規則:
第一個字符必須使用英文字母。
不能在名稱中使用空格、句點(.)、驚嘆號(!)、或 @、&、 $,# 等字符。
名稱的長度不可以超過 255 個字符。
通常,使用的名稱不能與 Visual Basic 本身的 Function 過程、語句以及方法的名稱相同。必須退出使用與程序語言的關鍵字相同的名稱。若所使用的內在語言函數,語句或方法與所指定的名稱相沖突,則必須顯示地識別它。常規會將內建函數,語句或方法的名稱之前加上關聯的類型庫的名稱。例如,如果有一個名為 Left 的變量,則只能用 VBA.Left 來調用 Left 函數。
不能在范圍的相同層次中使用重復的名稱。例如,不能在同一過程中聲明兩個命名為 age 的變量。然而,可以在同一模塊中聲明一個命名為 age 的私有變量和命名為 age 的過程級別的變量。
注意:
Visual Basic 不區分大小寫,但它會在名稱被聲明的語句處保留大寫。

11.3.4 聲明變量、常數和數組

11.3.4.1 聲明變量
通常會使用 Dim 語句來聲明變量。一個聲明語句可以放到過程中以創建屬于過程的級別的變量?;蛟诼暶鞑糠挚蓪⑺诺侥K頂部,以創建屬于模塊級別的變量。
下面的示例創建了變量 strName 并且指定為 String 數據類型。 Dim strName As String
如果該語句出現在過程中,則變量 strName 只可以在此過程中被使用。如果該語句出現在模塊的聲明部分,則變量 strName 可以被此模塊中所有的過程所使用,但是不能被同一工程中不同的模塊所含過程來使用。為了使變量可被工程中所有的過程所使用,則在變量前加上 Public 語句,如以下的示例:
Public strName As String
變量可以聲明成下列數據類型中的一種:Boolean、Byte、 Integer、Long、Currency、Single、Double、Date、String(變長字符串)、String * length (定長字符串)、Object 或 Variant。如果未指定數據類型,則 Variant 數據類型被賦予默認。也可以使用 Type 語句來創建用戶自定義類型。
可以在一個語句中聲明幾個變量。而為了指定數據類型,必須將每一個變量的數據類型包含進來。在下面的語句中,變量 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 語句。
注意: 需顯式地聲明固定大小的數組與動態數組。
為自動化聲明一個對象變量:當使用一個應用程序去控制另外一個應用程序的對象時,應該設置一個對于其他應用程序的類型庫的引用。若設置一個引用,則可以根據它們最常指定的類型來聲明對象變量。例如,如果是在 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")

11.3.4.2 聲明常數
如果要聲明一個常數,可以使用 Const 語句去聲明,并且設置它的值;而在常數聲明完之后,則不能加以更改或賦予新值。
在聲明部分,可以在過程中或者在模塊頂部聲明常數。模塊級別中的常數默認為私有的。若要聲明一個公共模塊級別常數,則可以在 Const 語句前加上 Public 這個關鍵字。也可以利用在 Const 語句前加上 Public 關鍵字來明確地聲明一個私有的常數,使得我們可更容易地去讀取并且解釋代碼。
下面的示例,聲明了一個 Public 常數 conAge 為 Integer 類型,并且指定它的值 為34。
Public Const conAge As Integer = 34
常數可以聲明成下列數據類型中的一種:Boolean、Byte、 Integer、Long、Currency、Single、Double、Date、String 或 Variant。因為已經知道常數的值,所以可以指定 Const 語句中的數據類型。關于數據類型的詳細信息。
可以在一個語句中聲明數個常數。為了指定數據類型,必須將每一個常數的數據類型包含進來。在下面的語句中,常數 conAge 和 conWage 被聲明為 Integer 類型。
Const conAge As Integer = 34, conWage As Currency = 35000

11.3.4.3 聲明數組
數組的聲明方式和其他的變量是一樣的,它可以使用 Dim、 Static、Private 或 Public 語句來聲明。標量變量(非數組)與數組變量的不同在于通常必須指定數組的大小。若數組的大小被指定的話,則它是個固定大小數組。若程序運行時數組的大小可以被改變,則它是個動態數組。
數組是否從 0 或 1 索引是根據 Option Base 語句的設置。如果 Option Base 沒有指定為1,則數組索引從0 開始。
1.聲明固定大小的數組
下面這行代碼聲明了一個固定大小的數組,它是個 11 行乘以 11 列的Integer 數組:
Dim MyArray(10, 10) As Integer
第一個參數代表的是行;而第二個參數代表的是列。
與其他變量的聲明一樣,除非指定一個數據類型給數組,否則聲明數組中元素的數據類型為 Variant。數組中每個數組的數字型 Variant 元素占用 16 個字節。每個字符串型 Variant 元素占用 22 個字節。為了盡可能使寫的代碼簡潔明了,則要明確聲明的數組為某一種數據類型而非 Variant。下面的這幾行代碼比較了幾個不同數組的大?。?br />' 整型數組使用 22 個字節(11 元素* 2 字節)。
ReDim MyIntegerArray(10) As Integer
' 雙精度數組使用 88 個字節(11 元素 * 8 字節)。
ReDim MyDoubleArray(10) As Double
' 變體型數組至少使用 176 字節(11 元素 * 16 字節)。
ReDim MyVariantArray(10)
' 整型數組使用 100 * 100 * 2 字節(20,000 字節)。
ReDim MyIntegerArray (99, 99) As Integer
' 雙精度數組使用 100 * 100 * 8 字節(80,000 字節)。
ReDim MyDoubleArray (99, 99) As Double
' 變體型數組至少使用 160,000 字節(100 * 100 * 16 字節)。
ReDim MyVariantArray(99, 99)
數組變量的最大值,是以所用的操作系統有多少可用內存為基礎。若使用的數組大小超過了系統中可用內存總數的話,則速度會變慢,因為必須從磁盤中讀寫回數據。
2.聲明動態數組
若聲明為動態數組,則可以在執行代碼時改變數組大小??梢岳?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 關鍵字時,只可以改變最后維數的上層綁定,而不能改變維數的數目。

11.3.5 過程及其調用
11.3.5.1 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

11.3.5.2 Sub 過程
Sub 過程是一系列由 Sub 和 End Sub 語句所包含起來的 Visual Basic 語句,它們會執行動作卻不能返回一個值。Sub 過程可有參數,例如常數、變量、或是表達式等來調用它。如果一個 Sub 過程沒有參數,則它的 Sub 語句必須包含一個空的圓括號。
下面 Sub 過程中,每一行都有注釋來解釋它的作用:

'聲明過程命名為 GetInfo
'該 Sub 過程沒有參數
Sub GetInfo()
'聲明字符串變量命名為 answer
Dim answer As String
'指定 InputBox 函數的返回值給 answer
answer = InputBox(Prompt:="What is your name?")
'條件 If...Then...Else 語句
If answer = Empty Then
'調用 MsgBox 函數
MsgBox Prompt:="You did not enter a name."
Else
'MsgBox 函數與 answer 變量連接。
MsgBox Prompt:="Your name is " & answer
'結束 If...Then...Else 語句
End If
'結束 Sub 過程
End Sub

11.3.5.3 屬性過程
屬性過程是一系列的 Visual Basic 語句,它允許程序員去創建并操作自定義的屬性。屬性過程可以用來為窗體,標準模塊,以及類模塊創建只讀屬性??杀挥脕碓诖a中代替 Public 變量,當設置屬性值時上述動作應被執行。
與 Public 變量不同,在對象瀏覽器中屬性過程會有一些幫助字符串指定給自定義的屬性。
當創建一個屬性過程時,它會變成此過程所包含的模塊的一個屬性。Visual Basic 提供下列三種類型的 Property 過程:
Property Let 用來設置屬性值的過程。
Property Get 用來返回屬性值的過程。
Property Set 用來設置對對象引用的過程。
聲明屬性過程的語法如下所示:
[Public | Private] [Static] Property {Get | Let | Set}
propertyname_ [(arguments)] [As type]
statements
End 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)
在具有相同名稱屬性過程中,從第一個到最后一個參數(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)
' 執行語句.
End Property
Property Get Names(intX As Integer, intY As Integer)
As Variant
' 執行語句.
End Property
在 Property Set 聲明中,最后一個參數的數據類型必須是對象類型或是 Variant。

11.3.5.4 調用 Sub 以及 Function 過程
從其他過程調用一個 Sub 過程時,必須鍵入過程名稱以及任何需要的參數值。而 Call 語句并不需要,不過若使用它,則任何參數必須以括號括起來。
可以使用 Sub 過程去組織其他的過程,因此可以較容易地了解并調試它們。在下面的示例中,Sub 過程 Main 傳遞參數值 56 去調用 Sub 過程 MultiBeep。運行 MultiBeep 后,控件返回 Main,然后 Main 調用 Sub 過程 Message。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
1.調用具有多個參數的 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")
如果不在意函數的返回值,可以用調用 Sub 過程的方式來調用函數。如下面示例所示,可以省略括號,列出參數并且不要將函數指定給變量:
MsgBox "Task Completed!", 0, "Task Box"
注意在上述例子中若包含括號,則語句會導致一個語法錯誤。
2.傳遞命名參數
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)

11.3.5.5 調用屬性過程
表11-2 列出了調用屬性過程的語法。

當調用一個 Property Let 或 Property Set 過程時,總是會有一個參數出現在等號(=)的右邊。
當用多個參數聲明一個 Property Let 或 Property Set 過程時, Visual Basic 傳遞調用的右邊參數,給 Property Let 或 PropertySet 聲明中的最后一個參數。例如,圖11-18 顯示了 Property 過程調用中的參數與 Property Let 聲明中的參數的關系:

實際上,將屬性過程與多個參數合用只有在創建屬性的數組時才會使用。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
金玫玫床戏