目錄
- Excel VBA 基礎部分
-
- 一、變量聲明語句
- 二、指派語句、條件語句、循環語句
- (一)指派語句
-
-
- 1. Let語句
- 2. Set
-
- (二)條件語句
-
-
- 1. If...Then...Else語句
- 2. Select Case語句
- 3. Choose 函數。從參數清單中選擇并傳回一個值
- 4. IIf 函數。根據表達式的值從兩個裡面選擇一個
- 5. Switch 函數。計算表達式的清單并傳回與清單中第一個結果為 True 的表達式關聯的 Variant 值或表達式
-
- (三)循環語句
-
-
- 1. While...Wend語句
- 2. Do...Loop語句
- 3. For Each...Next語句
- 4. For...Next 語句
-
Excel VBA 基礎部分
一、變量聲明語句
'定義變量和配置設定存儲空間
Dim [ WithEvents ] varname [ ( [ subscripts ] ) ] [ As [ New ] type ] . . .
部分 | 說明 |
---|---|
withEvents | 可選。該關鍵字指定varname是對象變量,用于響應觸發一個ActiveX對象。WithEvents隻在類子產品有效。使用它你可以定義多個獨立的對象,但是不能使用該關鍵字建立數組,也不能與New關鍵字一起使用。 |
varname | 必需。變量名稱 |
subscripts | 可選。數組變量的維數;最多可達60維。 該subscripts參數使用以下文法: [ lower To ] upper [ , [ lower To ] upper ] . . . 。 如果沒有使用explicity語句,數組的最低維數 lower由可選的Base語句控制。如果沒有可選的Base語句存在,則最低的數組維數是0. |
New | 可選。該關鍵字能顯示建立一個對象。如果在定義對象變量時使用New,則建立了該對象的一個執行個體。 是以,不必使用Set語句來指派該對象的引用。New不能定義内置的資料類型。 |
type | 可選。變量的資料類型;可以指定的有:Byte, Boolean, Integer, Long, Currency(貨币型), Single(單精度), Double(雙精度), Decimal (目前不支援), Date, String (可變長度), String length (固定的字元串長度), Object, Variant, 用于自定義類型, or an object type。 |
備注 | 如果定義在子產品界别,則在該子產品上的函數都可用;如果定義在函數内,則隻有函數内可用。 在定義對象變量時,如果沒有使用New關鍵字,則在對該變量指派時必須使用Set關鍵字。并在指派前該變量的值是Nothing。 在定義一個數組變量時不帶小括号,則該變量是可變數組變量,在函數中可以Redim具體指定數組的維數。 |
示例
' 定義AnyValue 和 MyValue為 Variant,預設指派為Empty。
Dim AnyValue, MyValue
'顯示定義一個整數類型的變量
Dim Number As Integer
' 在一行中定義多個變量。 由于沒有指定類型,是以AnotherVar的類型是Variant。
Dim AnotherVar, Choice As Boolean, BirthDate As Date
' DayArray是有51個索引的數組變量,如果可選Base設定為0(預設),則索引從0至50。
Dim DayArray(50)
' Matrix 是二維整數數組。
Dim Matrix(3, 4) As Integer
' MyMatrix 是double類型的三維數組,其維數顯示指定。
Dim MyMatrix(1 To 5, 4 To 9, 3 To 5) As Double
' BirthDay是一個索引從1至10的日期型的數組。
Dim BirthDay(1 To 10)As Date
' MyArray是動态 variants 類型的數組
Dim MyArray()
二、指派語句、條件語句、循環語句
(一)指派語句
1. Let語句
'文法
[ Let ] varname = expression
示例
Dim MyStr, MyInt
' 以下變量使用 Let 語句進行指派
Let MyStr = "Hello World"
Let MyInt = 5
'日期型指派
Dim birthday as Date
Let birthdat = #2021-1-1#
'也可以省略 Let
Dim MyStr, MyInt
MyStr = "Hello World"
MyInt = 5
2. Set
'文法
Set objectvar = {[ New ] objectexpression | Nothing }
示例
Dim YourObject, MyObject, MyStr
Set MyObject = YourObject ' 指派對象的位址(引用)
' MyObject 和 YourObject 引用同一個對象
YourObject.Text = "Hello World" ' 初始化屬性
MyStr = MyObject.Text ' 傳回 "Hello World".
' 切斷聯系,MyObject 不再引用 YourObject。
Set MyObject = Nothing ' 釋放對象
' 也可以使用對象數組
Dim myChildForms(1 to 4) As Form1
Set myChildForms(1) = New Form1
Set myChildForms(2) = New Form1
Set myChildForms(3) = New Form1
Set myChildForms(4) = New Form1
(二)條件語句
1. If…Then…Else語句
'文法(單行)
If condition Then [ statements ] [ Else elsestatements ]
'或者使用語句塊
If condition Then
[ statements ]
[ ElseIf condition-n Then
[ elseifstatements ]]
[ Else
[ elsestatements ]]
End If
示例
'使用單行文法
If A > 10 Then A = A + 1 : B = B + A : C = C + B
'使用語句塊文法
Dim Number, Digits, MyString
Number = 53 ' 初始化變量
If Number < 10 Then
Digits = 1
ElseIf Number < 100 Then
' 條件計算為True時,下面的語句會執行
Digits = 2
Else
Digits = 3
End If
' 使用單行文法形式指派
If Digits = 1 Then MyString = "One" Else MyString = "More than one"
'使用 if TypeOf 構造來判斷傳遞過來的Control是否是一個文本對話框
'TypeOf 不能與除Object以外的Long、Integer等硬資料類型一起使用
Sub ControlProcessor(MyControl As Control)
If TypeOf MyControl Is CommandButton Then
Debug.Print "You passed in a " & TypeName(MyControl)
ElseIf TypeOf MyControl Is CheckBox Then
Debug.Print "You passed in a " & TypeName(MyControl)
ElseIf TypeOf MyControl Is TextBox Then
Debug.Print "You passed in a " & TypeName(MyControl)
End If
End Sub
2. Select Case語句
'文法
Select Case testexpression
[ Case expressionlist-n [ statements-n ]]
[ Case Else [ elsestatements ]]
End Select
示例
'可以在每個Case子句中使用多個表達式或範圍
Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber
'備注:Is 比較運算符與Select Case語句中使用的 Is 關鍵字不同。
'也可以指定字元串的範圍和多個表達式。下面示例Case會比對字元串 everything;
按照字元順序比對落在nuts和soup之間的字元串,及變量TestItem的目前值:
Case "everything", "nuts" To "soup", TestItem
Dim Number
Number = 8 ' 變量初始化
Select Case Number ' 計算變量的值
Case 1 To 5 ' 1至5之間的數字, [1, 5]
Debug.Print "Between 1 and 5"
' 以下是隻有比對單個值時
Case 6, 7, 8 ' 6至8之間(含)
Debug.Print "Between 6 and 8"
Case 9 To 10 ' 9 或者 10
Debug.Print "Greater than 8"
Case Else ' 其他值
Debug.Print "Not between 1 and 10"
End Select
3. Choose 函數。從參數清單中選擇并傳回一個值
文法
Choose(index, choice-1, [ choice-2, ..., [ choice-n ]] )
示例
' 根據 ind的值來選擇第幾個字元串
Function GetChoice(Ind As Integer)
GetChoice = Choose(Ind, "Speedy", "United", "Federal")
End Function
4. IIf 函數。根據表達式的值從兩個裡面選擇一個
' 文法
IIf(expr, truepart, falsepart)
示例
Function CheckIt (TestMe As Integer)
CheckIt = IIf(TestMe > 1000, "Large", "Small")
End Function
5. Switch 函數。計算表達式的清單并傳回與清單中第一個結果為 True 的表達式關聯的 Variant 值或表達式
'文法
Switch(expr-1, value-1, [ expr-2, value-2…, [ expr-n, value-n ]])
'出現以下情形,Switch傳回 Null 值:
'1. 所有表達式的值不是True
'2. 第一個表達式為真是對應的值是Null.
'Switch 會計算所有表達式,即使隻傳回其中一個。
示例
' 此示例使用 Switch 函數傳回與某個城市名稱比對的語言名稱
Function MatchUp(CityName As String)
Matchup = Switch(CityName = "London", "English", CityName _
= "Rome", "Italian", CityName = "Paris", "French")
End Function
(三)循環語句
1. While…Wend語句
'文法
While condition [ statements ] Wend
示例
Dim Counter
Counter = 0 ' 初始化
While Counter < 20 ' 測試Counter的值
Counter = Counter + 1 ' Counter值加 1
Wend ' 當 Counter > 19 時,結束while循環
Debug.Print Counter ' 在立即視窗列印20
2. Do…Loop語句
'文法
Do [{ While | Until } condition ]
[ statements ]
[ Exit Do ]
[ statements ]
Loop
'或者可以使用以下文法:
Do
[ statements ]
[ Exit Do ]
[ statements ]
Loop [{ While | Until } condition ]
示例
Public Sub LoopExample()
Dim Check As Boolean, Counter As Long, Total As Long
Check = True: Counter = 0: Total = 0 ' 變量初始化
Do ' 外側循環
Do While Counter < 20 ' 内層循環
Counter = Counter + 1 ' Counter的值加 1
If Counter Mod 10 = 0 Then ' 如果是10的倍數
Check = (MsgBox("Keep going?", vbYesNo) = vbYes) ' 停下來等待用于點選是否
If Not Check Then Exit Do ' 跳出内層循環
End If
Loop
Total = Total + Counter ' 内層循環結束後執行
Counter = 0
Loop Until Check = False ' 立即跳出外層循環
MsgBox "Counted to: " & Total
End Sub
3. For Each…Next語句
'文法
For Each element In group
[ statements ]
[ Exit For ]
[ statements ]
Next [ element ]
部分 | 說明 |
---|---|
element | 必需。是一個用于周遊集合或數組元素的變量。對于集合(collentions)來說,元素可以是Variant變量,通用對象(object)變量,或任何特定的對象變量。對于數組來說,元素隻能是Vaviant變量。 |
示例
Dim Found, MyObject, MyCollection
Found = False ' 初始化
For Each MyObject In MyCollection ' 周遊集合中每個元素
If MyObject.Text = "Hello" Then ' 如果對象的屬性Text是"Hello".
Found = True ' 把Found的值設定為 True.
Exit For ' 退出循環
End If
Next
4. For…Next 語句
'文法
For counter = start To end [ Step step ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
示例
dim i%, j%
For i = 1 To 10
For j = 1 To 10
For k = 1 To 10
...
Next k
Next j
Next i
Dim Words, Chars, MyString
For Words = 10 To 1 Step -1 ' 設定10次重複
For Chars = 0 To 9 ' 設定10次重複
MyString = MyString & Chars ' 把數組追加到字元串後
Next Chars ' Increment counter
MyString = MyString & " " ' 追加一個空格
Next Words