继续上一篇
4、集合、对象、属性和方法
万物皆对象,属性就是描述对象的形容词,方法就是对象的动作
例如人是一个对象,它属性:身高,体重,肤色, 它动作:走路,吃饭,思考等等。
对象和属性是相对的。它对于上一级它属性,对于下一级的它是属性。例如
工作表是对象,对于工作簿来说 它算是属性 (记住一点就是,总是从大对象一直到小对象,越到后面越具体,它们直接采用“.”进行连接)
例如: Application.Workbooks("Book1").Worksheets("Sheet2").Range("A2")
总结:
- 1、这句话意思就是先工作簿Book1,然后找到工作表Sheet2,最后找到单元格A2
- 2、两个对象之间采用“.”进行连接
- 3、一定由大对象到小对象(越后面越具体)类似地址一样
5、连接的桥梁,VBA中的运算符 (你让它干啥活)
5.1 算术运算符
一说到算术运算,第一想到的四则运算。
注意: Mod用得比较多,“/” 、“\”的区别
5.2 比较运算符
VBA中的通配符(like)
5.3、连接运算符
只有两种 & 和 +
&: 只能字符串拼接
+:会根据两个表达式判断,如果两个表达式是数字,它会执行加法算法,其他情况和&一样功能字符串拼接
5.4、逻辑运算符
5.5、运算符的优先级
问题来了,这么多运算符,如果混合出现应该执行先执行什么?(其实你编程时候注意一下,你认为优先级高用“()”括起来就行了)
6、内置函数
VBA中已经为我们封装很多函数和属性,比如日期 Date 和 Time()
Option Explicit
Sub wdate()
MsgBox "现在日期是:" & Date & " " & Time()
End Sub
当然还有很多函数,你可以在代码编辑页面按F1查看 或者点击菜单
7、控制程序执行,VBA的基本语句结构
大家应该理解三种语句结构:顺序结构,选择结构(或分支结构),循环结构
7.1、顺序结构
根据代码一直从上往下执行。
7.2、选择结构
也就是有几种情况供你选择,当然选择是有条件的
方法一: If .... then
语法:
if 条件 then
执行语句1 (当条件满足的执行,也就是条件=true)
Else
执行语句2 (当条件不满足的执行,也就是条件=false)
End if (结束if语句结构)
简单流程图
例子:
Option Explicit
Sub iftest()
If Range("A1") = "" Then
MsgBox "单元格A1为空"
Else
MsgBox "单元格A1有值"
End If
End Sub
当然你可以调试,可以看出执行每一句话,如果是一句一句执行按F8就行
方法二:Select Case 语句
语法:
Select Case 值(条件可以数值表达式或字符串表达式)
Case (含有Is或To 表达式)
语句1 (上面为true执行)
Case (含有Is或To 表达式)
语句2 (上面为true执行)
......Case Else
语句 n
End Select
备注:Is 表示是意思, 例如: 值 Is < 1 (表示条件是否小于1), To 表示到意思, 例如 Case 1 To 3 , 表示值是否在1到3之间,包括1和3
这个if很相似,记住一点就是Select Case 是If的特例, Select Case 类似枚举意思
例子
Option Explicit
Sub caseTest()
Dim score As String '定义变量保存结果
Select Case Range("A1") '获取单元格A1的值
Case Is >= 90
score = "优"
Case Is >= 80
score = "良"
Case Is >= 70
score = "中"
Case Is >= 60
score = "及格"
Case Else
score = "不及格"
End Select
Range("B1") = score '将值写到单元格B1
End Sub
7.3、循环结构
方法一: For ... Next 语句
语法:
For 循环变量 Step 数字 (Step表示步长,每隔多少数字,这个是可选的)
循环体
Next (下一个)
改变上面的例子,如果有很多学生如何快速给出评判
Option Explicit
Sub caseTest()
Dim score As String, i# '定义变量保存结果,你是否记得#代表整数
For i = 1 To 10 Step 1
Select Case Range("A" & i) '获取单元格Ai的值
Case Is >= 90
score = "优"
Case Is >= 80
score = "良"
Case Is >= 70
score = "中"
Case Is >= 60
score = "及格"
Case Else
score = "不及格"
End Select
Range("B" & i) = score '将值写到单元格Bi
Next i
End Sub
有些时候想要找到某个值之后,立即结束循环,例如按顺序找第一个得到“优”的同学,并把编号和成绩打印出来
需要用到关键字 Exit For
方法二 Do While 语句
Do [While 逻辑表达式] (为true执行,这是可选的)
<循环体>
[Exit Do] (退出循环)
[循环体]
Loop
备注:“[]” 表示可选
修改上面的例子
Option Explicit
Sub caseTest()
Dim score As String, i# '定义变量保存结果,你是否记得#代表整数
i = 1
Do While Range("A" & i) <> "" '表示A列直到为空单元格
Select Case Range("A" & i) '获取单元格Ai的值
Case Is >= 90
score = "优"
Case Is >= 80
score = "良"
Case Is >= 70
score = "中"
Case Is >= 60
score = "及格"
Case Else
score = "不及格"
End Select
Range("B" & i) = score '将值写到单元格Bi
i = i + 1
Loop
End Sub
使用Exit Do 退出循环
方法三 Do Until 语句
直到Until 逻辑表达式为true 结束循环,与Do while 相反
语法:
Do [Until 逻辑表达式]
<循环体>
[Exit Do]
[循环体]
Loop
备注:“[]” 可选的
或语法2:
Do
<循环体>
[Exit Do]
[循环体]
Loop [Until 逻辑表达式]
修改上面的例子:
方式四: For Each ... Next 语句
一般用Range单元格进行循环,用得比较多
打印工作簿中所有工作表
Option Explicit
Sub forEachTest()
Dim sht As Worksheet, i As Integer
i = 1
For Each sht In Worksheets
Range("A" & i) = sht.Name
i = i + 1
Next sht
End Sub
7.7、 其他的常用语句
GoTo语句, 让程序转到另一条语句去执行
尽量不要用,虽然用起来灵活,但是可读性差,尽量将GoTo转换成其他结构选择结构和循环结构(所以这里不打算涉及)
With语句,让代码更加简单
例如打个比如,在上海人一般会说徐汇区而不会说中国上海徐汇区,应该都知道,不必在重复一遍(dry原则 don't repeat yourself)
Option Explicit
Sub notWithTest()
Worksheets("Sheet2").Range("A1").Font.Name = "仿宋" '设置字体
Worksheets("Sheet2").Range("A1").Font.Size = 12 '设置字号
Worksheets("Sheet2").Range("A1").Font.Bold = True '字体加粗
Worksheets("Sheet2").Range("A1").Font.ColorIndex = 3 '设置字体颜色
End Sub
Sub withTest()
With Worksheets("Sheet2").Range("A1").Font
.Name = "仿宋"
.Size = 12
.Bold = True
.ColorIndex = 3
End With
End Sub