目录索引
在Excel中启用VBA
不同版本的Excel启用VBA的方式不同,以我工作中使用的Excel2007为例
首先,单击左上角菜单按钮,在单击弹出框中右下角的“Excel选项”
选择左侧信任中心选项卡,再选择信任中心设置。随后在“宏设置”中选择“启用所有宏”
随后返回Excel选项窗口,在常用选项卡中勾选“在功能区显示“开发工具”选项卡”
我们就可以在Excel顶部看到VBA编程所要用到的选项卡啦
变量的强制声明
//声明变量
Sub mysub()
Dim a,b,c//为了防止发生歧义,应在生命变量后给变量赋初值.若未赋初值,则为默认值.此行代码中a,b,c为变体类型,默认初值为Empty
Dim num As Integer//若声明的变量为Int类型,则默认初值为0
Dim s As String//若声明的变量为String类型,则默认初值为空字符串,即""
End Sub
//VBA中即使不声明变量,也能直接使用,例如直接写
r = 2
但为减少程序错误,应使用
变量的强制声明
必须写在一个模块的第一行,即所有的Sub……End Sub之前
Option Explicit//此时,若再使用未声明的变量,就会报错
Sub subname()
r = 2
MsgBox r//程序运行至此处时报错,变量未声明
End Sub
需要注意的一点是,VBA是大小写不敏感的语言
静态变量
声明在Sub之外的模块级变量,不管是public还是private,都是静态变量
Option Explicit
Dim r//声明在此处,是静态变量
Sub subname()
r = r + 1//每次运行,r都会+1,停止运行程序r也不会归零
End Sub
静态变量值消失的情况
1、将Excel关闭
常量
VBA中的常量使用关键字Const定义
Sub mycon()
Const r = 1
r = 2//不应再次赋值,若再次赋值则程序报错
MsgBox r
End Sub
常量在定以后不可改变
循环语句
FOR循环
VBA中的FOR循环与JAVA、C#中的FOR循环逻辑相同,语法如下
Option Explicit
Sub myFor()
Dim sum, i
For i = 1 To 100 Step 1//代表i从1变化到100,每次变化量为1.如果不写Step n的话,默认为Setp 1
sum = sum + i
Next i//一次For循环结束后,进入下次循环,i的变化量为Setp后面的n值
End Sub
Do While循环
当不知道我们的循环要循环多少次的时候,我们将会用到Do While循环
Sub myDoWhile()
Dim num, i
i = 1
num = 0
Do While Cells(i, 1) <> ""//当Cells(i,1)不为零的时候,就一直循环
num = num + 1
i = i + 1//每次循环完,将i+1.如果不写,程序将会陷入死循环
Loop//Do While循环以Loop结尾
MsgBox num
End Sub
Do Until循环
如果把Do While循环翻译成汉语,为
当满足所写条件时执行
那么Do Until则代表
执行直到满足所写条件
Sub myUntil()
Dim r, sum
r = 1
Do Until r > 100//直到人>100时才停止执行
sum = sum + r
r = r + 1
Loop
MsgBox sum
End Sub
Do……Loop While循环
将While放在Loop后面,则会是的程序先执行一遍Do的循环体,再去判断一下是否符合条件
Sub myLoop()
Dim r As Integer, sum As Integer
r = 1
Do//先执行一下sum=sum+1和r=r+1
sum = sum + r
r = r + 1
Loop While r > 1//程序第一次执行到这里进行判断时,r=2,条件成立,所以继续执行
//然后会不断循环,最后导致溢出报错
MsgBox sum
End Sub
IF判断语句
VBA中的IF判断语句与JAVA、C#中的IF判断大致相同,具体语法如下
Option Explicit
Sub myIf()
Dim score, i
score = 90
If score>90 Then//记得每个IF条件后跟 Then,否则程序报错
i = "优秀"
ElseIf score>80 Then//ElseIf是连续的,中间不带空格
i = "良好"
ElseIf score > 60 Then
i = "及格"
Else
i = "不及格"
End If//,每个IF结束处跟EndIf.
//若IF只有一次判断,则不用写EndIf,例如
Dim i
i = 2
If i = 1 Then MsgBox i
If i = 2 Then MsgBox i
End Sub
逻辑运算符
三种逻辑运算符
NOT 非,
AND 与,
OR 或
逻辑运算符的优先级
NOT>AND>OR
而更常用的,我们用()去规定它们的判断顺序
录制宏与字符串拼接
利用Excel中的录制宏功能,开始录制后我们的操作会被逐步转化为代码显示在VBE中
Sub 删除一行()
//这是我们进行删除一行操作 的录制宏
Rows("21:21").Select
Selection.Delete Shift:=xlUp
End Sub
而我们或许希望将这个删除行的操作运用到一个IF判断和FOR循环中,循环删除我们需要删除的行
我们只需要对录制宏作出一定的改变,运用字符串拼接将固定行“21:21”改为可变化的行
Sub 删除空行()
//删除1-100行中第二列没有数据的行
For i = 100 To 1 Step -1//从第100行倒叙循环,所以Step为-1
If Cells(i,2) = "" Then
Rows(i & ":" & i).Select//将“21:21”改为用&拼接的字符串,&前后都要有空格
Selection.Delete Shift:=xlUp
End If
Next i
End Sub
需要特别注意,& 前后必须有空格,否则意思为将&之前的字符转化为long类型的数字