VBA基本語法規范


數據類型

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 LetProperty Setproperty 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可以有返回值。由FunctionEnd 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編寫

SubEnd 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為其設置引用。

如果在SubFunction前使用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 數組


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM