1.代码的基本结构
1.1 代码的基本结构
[Private|Public|Friend][static] Sub name[(arglist)][statements][exit Sub][statements]End Sub
Sub name()passEnd 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 SubSub 宏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 SubPublic Sub 宏2()If [A1] > 60 ThenMsgBox "及格"ElseMsgBox "不及格"End IfEnd Sub
Public Sub 宏2()If [A1] < 60 ThenMsgBox "不及格"ElseIf [A1] < 80 ThenMsgBox "良好"ElseIf [A1] <= 100 ThenMsgBox "优秀"End IfEnd 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 < 60MsgBox "不及格"Case Is < 80MsgBox "及格"Case Is <= 100MsgBox "及格"End SelectEnd 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. 数组的遍历一般用下标循环;```vbnetPublic Sub 宏1()Dim wht As WorksheetDim ii = 1For Each wht In WorksheetsCells(1, i) = wht.Namei = i + 1NextEnd Sub
3.2 do…loop循环
- 一般do…loop循环
一般的do…loop循环需要内部嵌套if条件,否则会形成无法停止的死循环
Sub sum_100()dim i, ji = 1j = 0doif i <101 thenj = j + ii = i + 1elseexit do '此处必须设置跳出do循环的条件end ifloopdebug.print jEnd Sub
- do while…loop循环
当while后面的条件满足时进入循环,当条件不满足时跳出循环
Public Sub sum_100_2()Dim i, ji = 1Do While i <= 100j = j + ii = i + 1LoopDebug.Print jEnd Sub
- do until…loop循环
当until后面的条件不满足时进入循环,当条件满足时跳出循环
Public Sub sum_100_3()Dim i, ji = 1Do Until i > 100j = j + ii = i + 1LoopDebug.Print jEnd Sub
- do…while loop循环
当while后面的条件满足时再次进入循环,当条件不满足时直接跳出循环。判断条件后置
Public Sub sum_100_4()Dim i, ji = 1Doj = j + ii = i + 1Loop While i < 101Debug.Print jEnd Sub
- do…until loop循环
当until后面的条件不满足时再次进入循环,当条件满足时直接跳出循环。判断条件后置
Public Sub sum_100_5()Dim i, ji = 1Doj = j + ii = i + 1Loop Until i > 100Debug.Print jEnd 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") = 17End withEnd SubPublic Sub 宏2()worksheets("1月").range("a1") = 12worksheets("1月").range("a2") = 13worksheets("1月").range("a3") = 14worksheets("1月").range("a4") = 15worksheets("1月").range("a5") = 16worksheets("1月").range("a6") = 17End 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忽略错误
