1.代码的基本结构
1.1 代码的基本结构
[Private|Public|Friend][static] Sub name[(arglist)]
[statements]
[exit Sub]
[statements]
End Sub
Sub name()
pass
End Sub
1.2 代码的执行流程
vba中代码注释一般为两种,可用'
或Rem+
空格(仅用于每行开头)
' 这是一个注释
Rem 这也是一个注释
- 代码的换行
space+_
可以实现代码的换行。关键字中间是不能换行的
Sub 宏1()
Workbooks("测试").Worksheets("Sheet1").Range("A1") = "Hello World"
Workbooks("测试").Worksheets("Sheet1"). _
Range("A2") = "Hello World"
End Sub
- 两行代码并做一行
用:
将两行代码并做一行
Sub 宏1()
[A1] = "Hello World"
[A2] = "Hello World"
End Sub
Sub 宏2()
[A1] = "Hello World" : [A2] = "Hello World"
End Sub
2.条件语句
2.1 IF条件语句
- 简单的IF条件语句:
if...then...end if
,如果if
和then
在同一行中,则不需要end if
语句 - 复杂的IF条件语句:
if...then...else...end if
- 多条件的IF语句:
if...then...elseif...elseif...else...end if
一般情况都建议写成块形式,方便后期调试;
Public Sub 宏1()
If [A1] > 60 Then MsgBox "及格"
End Sub
Public Sub 宏1()
If [A1] > 60 Then MsgBox "及格" Else MsgBox "不及格"
End Sub
Public Sub 宏2()
If [A1] > 60 Then
MsgBox "及格"
Else
MsgBox "不及格"
End If
End Sub
Public Sub 宏2()
If [A1] < 60 Then
MsgBox "不及格"
ElseIf [A1] < 80 Then
MsgBox "良好"
ElseIf [A1] <= 100 Then
MsgBox "优秀"
End If
End Sub
2.2 select…case条件语句
一般用于匹配较多条件
Select Case [testexpression]
Case [expression]
[statements]
Case [expression]
[statements]
Case [expression]
[statements]
End Select
- 总之在case的[expression]中不能够再出现[testexpression]的内容,而是需要出现[testexpression]的条件;
- 如果有Case出现,则为必要参数。
To
关键字可用来指定一个数值范围。如果使用To关键字,则较小的数值要出现在 To之前。使用Is
关键字时,则可以配合比较运算符(除Is和Like之外)来指定一个数值范围。如果没有提供,则Is关键字会被自动插入;- case中可以出现多个数值、文本及区间组合,如
**case 1,2,3,4,6,7**
**case "a","b","c"**
**case 1 to 10,34 to 55**
Public Sub 宏2()
Select Case [A1]
Case Is < 60
MsgBox "不及格"
Case Is < 80
MsgBox "及格"
Case Is <= 100
MsgBox "及格"
End Select
End Sub
2.3 多条件判断表达式
and or not
3.循环语句
3.1 for循环
用于循环数字的for…next循环
For i = start_num To end_num [Step stepcount] 'step默认为1
[statement]
[Exit For]
[statement]
Next
```vbnet Public Sub 宏1()
Dim i, j
For i = 1 To 100
j = j + i
Next
Debug.Print j
End Sub
2. **用于循环对象集合的for each循环**
> 1. for each对二维区域的单元格遍历是先横向走再纵向走;
> 2. for each一般用于遍历**字典、单元格和集合元素**,一般不用于遍历数组;
> 3. 数组的遍历一般用下标循环;
```vbnet
Public Sub 宏1()
Dim wht As Worksheet
Dim i
i = 1
For Each wht In Worksheets
Cells(1, i) = wht.Name
i = i + 1
Next
End Sub
3.2 do…loop循环
- 一般do…loop循环
一般的do…loop循环需要内部嵌套if条件,否则会形成无法停止的死循环
Sub sum_100()
dim i, j
i = 1
j = 0
do
if i <101 then
j = j + i
i = i + 1
else
exit do '此处必须设置跳出do循环的条件
end if
loop
debug.print j
End Sub
- do while…loop循环
当while后面的条件满足时进入循环,当条件不满足时跳出循环
Public Sub sum_100_2()
Dim i, j
i = 1
Do While i <= 100
j = j + i
i = i + 1
Loop
Debug.Print j
End Sub
- do until…loop循环
当until后面的条件不满足时进入循环,当条件满足时跳出循环
Public Sub sum_100_3()
Dim i, j
i = 1
Do Until i > 100
j = j + i
i = i + 1
Loop
Debug.Print j
End Sub
- do…while loop循环
当while后面的条件满足时再次进入循环,当条件不满足时直接跳出循环。判断条件后置
Public Sub sum_100_4()
Dim i, j
i = 1
Do
j = j + i
i = i + 1
Loop While i < 101
Debug.Print j
End Sub
- do…until loop循环
当until后面的条件不满足时再次进入循环,当条件满足时直接跳出循环。判断条件后置
Public Sub sum_100_5()
Dim i, j
i = 1
Do
j = j + i
i = i + 1
Loop Until i > 100
Debug.Print j
End Sub
4.特殊语句
4.1 with语句
with语句的本质是一个简写语句
'宏1代码与宏2等价
Public Sub 宏1()
with worksheets("1月")
.range("a1") = 12
.range("a2") = 13
.range("a3") = 14
.range("a4") = 15
.range("a5") = 16
.range("a6") = 17
End with
End Sub
Public Sub 宏2()
worksheets("1月").range("a1") = 12
worksheets("1月").range("a2") = 13
worksheets("1月").range("a3") = 14
worksheets("1月").range("a4") = 15
worksheets("1月").range("a5") = 16
worksheets("1月").range("a6") = 17
End Sub
4.2 过程中断语句
过程中断语句一般有四个:Exit For/If
、Exit Sub
、End
、Stop
Exit For/If/do
:一般用于跳出所在层的循环或条件判断,继续执行上一层的循环;Exit Sub
:用于在非代码最后结束整个过程;End
:结束一切,释放内存;-
4.3 跳转语句
On Error GoTo line...line:
```vbnet ‘判断单元格是否有数据有效性
Sub Validation()
On Error GoTo line
If Range(“A12”).Validation.Type >= 0 Then MsgBox “单元格有数据有效性!” Exit Sub End If
line: MsgBox “单元格没有数据有效性!”
End Sub ```
On Error Resume Next
忽略错误