目录
- 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