先安利一款VBA的IDE(VBA代码宝): https://charltsing.lanzous.com/ic9qvzi
一、基础语法
'创建子程序
sub abc()
.....
end sub
'程序调用
call abc '注意:不用加括号
'定义自变量的类型
Dim i=....
'For循环
for i = 1 to 5 Step 2 'Step定义步长
...
Next '循环结构(循环五次)
'IF判断语句
If ... then '如果...那么
... '...
else '否则
... '....
End If '切勿忘记End If
'多重判断
If Range("a" & i) = "理工" Then
Range("b" & i) = "LG"
ElseIf Range("a" & i) = "文科" Then '再如果...那么
Range("b" & i) = "WK" '....
Else
Range("b" & i) = "CJ"
End If
'使用IF语句,控制For循环
If Range("a" & i) = "" Then
Exit For '退出For循环
End If
- 删表格时,从下往上删,可避免错误。
- ElseIf 可多次使用
- 单元格的表示与操作
'单元格的表示
Range("a1") '表示a1单元格
Range("a" & i) '表示ai单元格
Sheet5.Range("a" & i) '工作表5的ai单元格
Range("a1").value '单元格的值(此属性为默认值,大多数情况下可省略)
Range("a1").Offset(2,3) '由a1单元格下移2行,右移3列
Range("A1048576").End(xlUp).Select '选中空白单元格的上边界
Range("A1048576").End(xlUp).Row 'A列非空单元格的个数
Range("b1").Resize(2, 4).Select '选中b1为起点的2行4列的区域
Range("c3").EntireColumn.Select '选中c3所在的整列
Range("c3").EntireRow.Select '选中c3所在的整行
Range("a1").EntireColumn.Copy Range("c1") '将a1所在的整列复制到c列
Range("a1:b3").ClearContents '清除A1:B3的内容
Sheet1.Cells(1, 2) = 99 '令工作表1的第1行第2列等于99
二、Worksheets(工作表)对象
- 工作表的选择(Select)
Sheet1.Select '选择工作表1
Sheets(3).Select '选择第3个工作表(从左往右数)
Sheets("一月").Select '选择名称为‘一月’的工作表
- 插入工作表
Sheets.Add '在当前工作表前面插入新sheet
Sheets.Add after:=Sheet3 '在sheet3后面插入新sheet
'在sheet3后面插入100个新sheet
Dim i As Integer
For i = 1 To 100
Sheets.Add after:=sheet3
Next
'统计工作簿中所有工作表的数量
Sheet5.Range("a1") = Sheets.Count '在工作表5的A1单元格中输出工作簿中所有工作表的数量
Sheet5.Range("a1") = Sheet1.Name '在工作表5的A1单元格中输出工作表1的名称
Sheet1.Name = "小驴嗷嗷叫" '将工作表1的名称改为‘小驴嗷嗷叫’
'使其总是在最后一张工作表后面插入新表
Sheets.Add after:=Sheets(Sheets.Count)
'
Dim i As Integer
For i = 1 To 100
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = i & "月" '总是将最后一张工作表的名称改为‘i月’
Next
- ‘Sheets.Count’ 的差异
- 删除工作表(Delete)
Excel.Application.DisplayAlerts = False '关闭Excel的报错机制
sheet3.Delete '删除工作表3
Excel.Application.DisplayAlerts = True '开启Excel的报错机制
'插入100张工作表
Sheets.Add Count:=100
'删除100张工作表
Dim i As Integer
Excel.Application.DisplayAlerts = False
For i = 1 To 100
Sheets(1).Delete '总是删除左起第一张工作表
Next
Excel.Application.DisplayAlerts = True
- 复制工作表(copy)
'复制工作表1,并且将其置于左起第二张工作表之后
Sheet1.Copy after:=Sheets(2)
'复制工作表1,并且始终将其置于最后端
Sheet1.Copy after:=Sheets(Sheets.Count)
三、Workbooks(工作簿)对象
1.顺序循环每个单元格(For Each)
Dim rng As Range '定义rng为单元格变量
Dim x As Integer '注意x是初始值是 0 !!!
For Each rng In Range("a1:a10") 'rng的范围为A1至A10的每一个单元格
x = x + 1
rng=x 'x顺序给A1至A10的每一个单元格(rng)赋值
Next
2.顺序循环每个工作表
Dim sht As Worksheet '定义sht为工作表变量
Application.DisplayAlerts = False '关闭警告
For Each sht In Sheets
If sht.Name <> "小驴嗷嗷叫" Then '如果单元格名称不等于“小驴嗷嗷叫”,则
sht.Delete '删除单元格(sht)
End If
Next
Application.DisplayAlerts = True
3.工作簿的打开、操作、保存与关闭
Application.ScreenUpdating = False '关闭屏幕刷新
Application.DisplayAlerts = False '关闭警告
Workbooks.Open Filename:="d:\小驴\嗷嗷叫.xlsx" '打开EXCEL文件
ActiveWorkbook.Sheets(1).Range("a1") = "五一学习VBA" '向当前文件中写入
ActiveWorkbook.Save '保存
ActiveWorkbook.Close '关闭
Application.DisplayAlerts = True '开启警告
Application.ScreenUpdating = True '开启屏幕刷新
4.新建工作表
Workbooks.Add
ActiveWorkbook.Sheets(1).Range("a1") = "五一学习VBA"
ActiveWorkbook.SaveAs Filename:="d:\小驴\嗷嗷叫.xlsx" '将工作薄保存到 d:\小驴,并命名为 嗷嗷叫.xlsx
ActiveWorkbook.Close
- 注意:执行Sheet1.copy(复制工作表1)时,VBA会自动新建一个工作薄,然后将复制的Sheet1粘贴过去。
5.拆分工作薄
Dim sht As Worksheet
For Each sht In Sheets
sht.Copy '复制工作表
ActiveWorkbook.SaveAs Filename:="d:\小驴\" & sht.Name & ".xlsx" '保存
ActiveWorkbook.Close '关闭
Next
6.新建表(避免重名)----第6课
Dim sht As Worksheet
Dim k As Integer
For i = 1 To 3
k = 0 '每次循环后,再重新定义K为0
For Each sht In Sheets
If sht.Name = Sheet1.Range("a" & i) Then
k = 1
End If
Next
If k = 0 Then
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = Sheet1.Range("a" & i)
End If
Next
7.VBA的输入框
i = InputBox("请输入你要按哪列分") '将用户的输入值赋给i
8.VBA的消息提示框
MsgBox "小驴嗷嗷叫"
七、VBA事件与典型应用案例
With sheet2
.range("a1")
.range("a3")
End With
'上下两端代码意义相同,此即为With语法的作用
sheet2.range("a1")
sheet2.range("a3")
1.对齐方式
2.字体格式
3.工作簿事件
4.工作表事件