數據類型
Variant、 Byte 、 Boolean 、 Integer 、 Long 、 Single 、 Double 、 Currency 、 Decimal 、 Date 、 Object 和 String 。
定義對象變量
使用Dim、Private、Static、Public聲明對象,(用Dim聲明的模塊級變量都默認為Private的)
' Declare MyObject as Variant data type.
Dim MyObject
' Declare MyObject as Object data type.
Dim MyObject As Object
' Declare MyObject as Font type.
Dim MyObject As Font
如果使用對象變量卻沒有實現聲明,則默認是Variant(多樣變量)
使用Set將對象變量分配給變量
Set MyObject = YourObject ' Assign object reference.
Set MyObject = Nothing ' Discontinue association.
可以通過New關鍵詞與Set語句結合使用,可以將聲明變量與為其分配對象
Set MyObject = New Object ' Create and Assign
引用對象的當前實例
使用Me關鍵詞,帶邊引用在其上運行的代碼的當前實例
Sub ChangeObjectColor(MyObjectName As Object)
MyObjectName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
End Sub
ChangeObjectColor Me
數組
數組的聲明方式和其他對象是一樣的,即Dim、Private、Static、Public
通常我們需要制定固定大小的數組, 數組是否以0或1開始,可以根據Option Base語句設置,默認為0
聲明固定大小的數組
在下面的代碼行中,一個固定大小的數組聲明為具有11 行和 11 列的 Integer 數組:
Dim MyArray(10, 10) As Integer
第一個參數代表行、第二個參數代表列
聲明動態數組
Dim sngArray() As Single
在數組范圍內的過程中,使用 ReDim 語句可更改維度數、定義元素數,以及定義每個維度的上限和下限。 可以根據需要使用 ReDim 語句更改動態數組。 但是,每次這么做時,數組中的現有值都會丟失。 使用 ReDim Preserve 可在保留數組中現有值的情況下擴展數組。
例如,下面的語句將數組擴增了 10 個元素,而未丟失原始元素的當前值。
ReDim Preserve varArray(UBound(varArray) + 10)
在對動態數組使用 Preserve 關鍵字時,僅能更改最后一個維度的上限,而不能更改維度數。
聲明常量
Const關鍵詞
Public Const conAge As Integer = 34
可在一個語句中聲明多個常量。 若要指定數據類型,必須為每個常量包括數據類型。
在下面的語句中, 常量conAge和conWage聲明為Integer。
Const conAge As Integer = 34, conWage As Currency = 35000
聲明變量
通常使用Dim來聲明。過程中聲明為過程級變量,模塊頂部聲明為模塊級變量。
Dim strName As String
可以使用Type語句創建用戶定義的類型。
在一個數據中聲明多個變量
Dim intX As Integer, intY As Integer, intZ As Integer
聲明變量類型縮寫格式
類型的縮寫是:% -integer; & -long; @ -currency; # -double; ! -single; $ -string
以下語句將intX、intY聲明成整數
Dim intX%, intY%, intZ as Integer
隱式聲明變量(Option Explicit)
通過在賦值語句中使用一個變量,即可在 Visual Basic 中隱式聲明此變量。 隱式聲明的所有變量都是 Variant 類型。 相比大多數其他變量,Variant 類型變量需要更多的內存資源。
如果不希望VB進行隱式聲明,可在過程之前添加Option Explicit語句置於模塊中。 此語句要求顯式聲明模塊內的所有變量。
Option Explicit ' Force explicit variable declaration.
Dim MyVar ' Declare variable.
MyInt = 10 ' Undeclared variable generates error.
MyVar = 10 ' Declared variable does not generate error.
設置屬性改變時的執行代碼(Let、Get、Set)
可以創建具有相同名稱的Property Let、 Property Set 和property Get 過程。
Private IsInverted As Boolean
Property Let Inverted(X As Boolean)
IsInverted = X
If IsInverted Then
…
(statements)
Else
(statements)
End If
End Property
通過以上設置了IsInverted為私有類型,要改變這個數據只能通過Inverted來改變
Form1.Inverted = True
Get程序用於返回屬性的當前狀態
Property Get Inverted() As Boolean
Inverted = IsInverted
End Property
條件語句
If...Then...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
Select 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
循環語句
Do...Loop
Do While
當條件為True則一直循環
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
Do Until
一直循環到條件為True
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循環體
在代碼中使用Exit Do聲明,以跳出/離開循環
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
For...Next
類似於常見的for循環體,該循環體使用一個定義的數值變量的增減來執行相應的循環。
以下代碼片段使得計算機Beep 50次,Next聲明對x變量自增
Sub Beeps()
For x = 1 To 50
Beep
Next x
End Sub
使用Step關鍵詞,你可以定義Next的步幅。
Sub TwosTotal()
For j = 2 To 10 Step 2
total = total + j
Next j
MsgBox "The total is " & total
End Sub
自減步幅
Sub NewTotal()
For myNum = 16 To 2 Step -2
total = total + myNum
Next myNum
MsgBox "The total is " & total
End Sub
For Each ... Next
For Each...Next 語句會為集合中的每個 對象並為數組中的每個元素重復語句塊。
例如,下面的過程將關閉所有窗體(包含正在運行的過程的窗體除外)。
Sub CloseForms()
For Each frm In Application.Forms
If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close
Next
End Sub
下面的代碼將循環訪問數組中的每個元素,並將每個元素的值設置為索引變量 I 的值。
Dim TestArray(10) As Integer, I As Variant
For Each I In TestArray
TestArray(I) = I
Next I
使用Exit For退出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
使用"For Each...Next"循環來循環訪問VBA類
For Each...Next 循環不會僅循環訪問 Collection對象的數組和實例。 For Each...Next 循環還可以循環訪問你已編寫的 VBA 類。
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
條件編譯
可以使用條件編譯有選擇地運行代碼塊,例如,調試將不同與同一編程任務的速度進行比較的語句,或者用不同的語言對應用程序進行本地化。
你可以通過使用#Const
來定義一個編譯器常量,通過使用#If...Then...#Else
來根據常量執行相應的代碼。
' 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
函數
Function編寫
和Sub類似,但Function可以有返回值。由Function
和End Function
組成。
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
Sub編寫
由Sub
和End 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
命名參數和可選參數
你可以按照參數順序賦值給相應的Sub和Function函數,也可以指定名稱,則不用按照特定順序。
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
以下代碼中,存在varRegion
以及varCountry
兩個可選參數。使用IsMissing()
可以判斷參數是否已將可選的Variant參數傳遞給該過程。
Sub OptionalArgs(strState As String, Optional varRegion As Variant, _
Optional varCountry As Variant = "USA")
If IsMissing(varRegion) And IsMissing(varCountry) Then
Debug.Print strState
ElseIf IsMissing(varCountry) Then
Debug.Print strState, varRegion
ElseIf IsMissing(varRegion) Then
Debug.Print strState, varCountry
Else
Debug.Print strState, varRegion, varCountry
End If
End Sub
數組參數
數組參數可以將多個參數作為一個數組對象傳遞給一個程序。你無需在定義前就知道這個數組里面存在多少個元素。
使用ParamArray
關鍵詞來修飾數組參數。
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"
作用域及可見性
作用范圍是指供另一個過程使用的變量、常量或過程的可用性。 有三種范圍級別:過程級、私有模塊級和公共模塊級。
過程級作用域
在一個過程內定義的變量或常量在該過程外不可見。 只有包含變量聲明的過程可以使用它。 在以下示例中,第一個過程顯示一個包含字符串的消息框。 第二個過程顯示一個空白消息框,因為該變量對於第一個過程而言是局部變量。
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
聲明的變量作用范圍默認是Private的。
在下面的示例中, 字符串變量strMsg
可用於模塊中定義的任何過程。 當調用第二個過程時, 它會在對話框中顯示字符串strMsg
變量的內容。
' Add following to Declarations section of module.
Private strMsg As String
Sub InitializePrivateVariable()
strMsg = "This variable can't be used outside this module."
End Sub
Sub UsePrivateVariable()
MsgBox strMsg
End Sub
公共模塊級作用域
如果使用Public
,則聲明了一個公共變量。
變量生存期
初始化變量操作如下:
-
數值變量初始化為零,
-
可變長度字符串初始化為零長度字符串 ("")
-
固定長度的字符串用 ASCII 字符代碼0或Chr(0) 表示的字符填充
-
Variant 變量初始化為空
-
用戶定義類型變量的每個元素都像單獨變量一樣初始化。
-
Object對象類型變量初始化較為特殊,會為其保留控件,但是將其初始化為Nothing,直到使用
Set
為其設置引用。
如果在Sub
及Function
前使用Static
聲明,則其中的所有過程級變量將在兩次調用之間保留其值。
理解Variants(變體)
如果你聲明常量、變量或者參數時未指定類型,則默認會設置其為Variant類型的對象。數值類型的Variant對象需要使用16字節來存儲,同時他們的引用也比顯示聲明類型的變量更慢(僅在較大較復雜的程序中較為重要),而字符串類型的Variant對象則需要22字節。
Dim myVar
Dim yourVar As Variant
theVar = "This is some text."
最后一個語句不顯式聲明變量, 而是隱式或自動聲明該變量。 隱式聲明的變量將被指定為 Variant 數據類型。
如果為變量或參數指定數據類型,而使用了錯誤的數據類型,則會發生數據類型錯誤。 若要避免數據類型錯誤,只使用隱式變量( Variant 數據類型)或者明確聲明所有變量並指定數據類型。 后一種方法是首選方法。
使用括號
Sub過程、內置語句和一些方法不帶有返回值,不必將參數括在括號中。
MySub "stringArgument", integerArgument
函數過程、內置函數和一些方法帶有返回值,如果你不需要,你可以不必使用括號。而如果需要將其賦值給另一個對象,則需要帶上括號。
Answer3 = MsgBox("Are you happy with your salary?", 4, "Question 3")
賦值語句
Let
語句一般會被忽略,如
Let yourName = InputBox("What is your name?").
Set
語句用於將對象分配給已聲明為對象的變量。該關鍵詞是必須的。
Sub ApplyFormat()
Dim myCell As Range
Set myCell = Worksheets("Sheet1").Range("A1")
With myCell.Font
.Bold = True
.Italic = True
End With
End Sub
vbType常量
常量 | 值 | 說明 |
---|---|---|
vbEmpty | 0 | 未初始化(默認) |
vbNull | 1 | 不包含有效數據 |
vbInteger | 雙面 | Integer |
vbLong | 第三章 | 長整型 |
vbSingle | 4 | 單精度浮點數 |
vbDouble | 5 | 雙精度浮點數 |
vbCurrency | 型 | Currency |
vbDate | 步 | Date |
vbString | utf-8 | String |
vbObject | 第 | 對象 |
vbError | 10 | Error |
vbBoolean | 11x17 | Boolean |
vbVariant | 12 | Variant(僅用於變量數組) |
vbDataObject | 13 | 數據訪問對象 |
vbDecimal | 日 | Decimal |
vbByte | × | Byte |
vbLongLong | 20 | LongLong整數 (僅在64位平台上有效) |
vbUserDefinedType | 36 | 包含用戶定義類型的變量 |
vbArray | 8192 | 數組 |