1-01 VBA是什么
(1)VBA能干什么
基本的办公自动化功能,解决日常中的重复性工作
Exp:数据整理、批量处理
(2)学习VBA基础
对Excel有一定了解,熟悉基本的函数
(1)VBA编写前提准备
①调出开发工具
【文件】-【选项】-【自定义功能区】勾选【开发工具】
②启用所有的宏
【文件】-【选项】-【信任中心】-【宏设置】-【启用所有的宏】
(2)进入VBA编辑界面
①快捷键 Alt+F11
②【开发工具】-【Visual Basic】
③选中下放栏工作表-右键-查看代码、
(3)调整VBA编辑窗口
①调整代码字体格式
编辑窗口【工具】-【选项】-【编辑器格式】
②调出本地窗口
【视图】-【本地窗口】 同时查看运行情况
(4)VBA代码编写规范
①Sub 过程名称()
过程名称不能使用保留字(如 Sub Input(),运行会报错)
End Sub 结果子过程
(4)VBA代码编写基本操作
①保存代码
【文件】-【另存为】-【保存类型】-启用宏的工作簿.xlsm
②注释
写完代码后进行注释,方便理解
Exp:'我是一串注释
【设置注释快】-选中后批量注释
【解除注释】-选中后解除注释
③断行
_+回车
单行代码太长时,为了方便理解美观进行断行
④缩进
Tab缩进 方便理解层级
⑤逐句运行
F8 用于检查代码错误
对照Excel表格 逐句运行发现错误
1-03 Excel录像机-宏
(1)录制宏
【开发工具】-【录制宏】/【停止录制】
宏的录制经常出现冗余代码,一般不使用
1-04 变量
变量是一个自定义名称的储存单位
1-05 变量的数据类型
Dim n as 变量类型
当数据量较大时,可以声明变量类型解决运行时间
1-06 对象
(1)工作簿对象
WorkBooks(“工作簿名”)
ActiveWorkBook 活动工作簿(当前工作簿)
ThisWorkBook 代码所在的工作簿
Exp: =AcitiveWorkbooks.Name-在b1单元格中写入当前工作簿的名称
(2)工作表对象
Sheets(n) 按对象顺序确定的第n个工作表
Sheetn 按系统工作表名确定的工作簿
Sheets(“工作表名”) 按工作表名称确定的工作簿
Exp:Sheets(3)表示的是VBA对象中的排行的第三个工作簿
Sheet3 表示的是工作簿中对象的名称
sheets("表名”) 表示的是工作簿中名称为“表名”的工作表
MsgBox Sheets(3).Name 弹窗提示第三个工作表的名称
Sheets("老吴 ").Delete 删除名称为“老吴”的工作表
(3)单元格对象
Range("单元格地址")
Cells(行,列)
单元格简写
Activecell 活动单元格
Range( ).Select 选中单元格
1-07 属性
Range("单元格").value 单元格的值
workbooks("工作表").工作表的路径
sheets.count 工作表的数量
sheets("工作表").Name 工作表名称
Exp:sheets("sheet1").Name 工作表名称=“快学Excel”-将“快学Excel”赋值为shee1工作的名称
ActiceCell.Adress 单元格位置
Range("a1").Interior.ColorIndex 单元格颜色
1-08 方法
(1)工作簿
Workbook.Add 新增工作簿
Workbook.Add.Name=“快学excel” 新增工作簿并命名为“快学excel”
Workbook.Open 打开工作簿
Exp1:打开当前工作簿位置下的其他工作簿
WorkBook.Open(ThisWorkBook.Path&"\""日报.xlsx“”-打开当前工作簿位置下名称为“日报”的工作簿
Exp1:动态链接当前工作簿位置下的其他工作
a=Workbook.Path
Workbooks.Open(a&"\""日报.xlsx“”-打开当前工作簿当前位置下名称为“日报”的工作簿
ActiveWorkbook.Close 关闭活动工作簿
ThisWorkbook.Sheets("工作表").Copy
复制工作表中内容
Exp:ThisWorkbook.Sheets("工作表").Copy ActiveWorkbook.Sheets(1)-将当前工作簿中“工作表”工作表的内容复制到活动工作表的sheet1工作表中
(1)单元格
Range("b1").Activate 光标选中单元格
光标选中b1单元格
Range("a1”).Copy 复制单元格
把a1单元格复制到b1单元格
Range(“b1”).xlPasteSpecial xlPasteValues 复制单元格只粘贴值
(因为使用了两个命令,必须要写成两行,如果非要在一行,则写成Range(“a1”).Copy:Range(“b1”).xlPasteSpecial )
只粘贴a1单元值到b1单元格
Range("a1").Delete 删除单元格
删除a1单元格
(直接删除单元格,会使得下方单元格上移)
Range(“b1”).clear 清除单元格内容
清除b1单元格内容
(与Delete区别,清除单元格内容,而不是删除单元格)
Range(“b1”).clearcoutents-清除单元格值
清除b1单元格的值,但不清除格式(保留填充色等)
Range("a1").Cut 移动单元格
-将a1单元格移动到a13单元格
1-09 If语句
(1)If Else
If n>x Then Msgbox “n大于x”
Else
Msgbox "n小于x”
如果结果为true,则输出“n大于x”;结果为false 则运行Else 输出“n小于x ”
Tip1:如果不写入else情况,则结果为false时 直接结束过程
Tips2:①If n>x Then
如果在同一行 可省略End If
②If n>x Then
命令
命令如果不在同一行 需要输入End If
(2)ElseIf (多重条件)
If Range("f2")>=1500 Then
Range("f3")="贵宾"
ElseIf Range("f2")>=1000 Then
Range("f3")="高级"
Else
Range("f3")="普通"
End If
1-10 For循环语句
For 变量名 x to y
"循环的内容"
End For
Exp:For N=2 to 19
If Cell(n,2)
Cells(n,2).Interio.ColorIndex=3
End If
Next
判断 第2列第2至9行中小于60的数字,然后标注为红色
Exp: For n=4 To 52 step 4
CJ=CJ+Cells(n,3)
Next
求第3列 第4至第52行,每4个单元格的成绩总和
1-11 For循环嵌套
For n=2 to 26
For y=2 to 8 step 2
If Cells(n,y)
Cells(n,y).Interior.ColorIndex=3
End If
Next y
Next n
查找 第2至8列,第2至第26行中小于60的数并标注为红色,每列跳过1列
1-12 End 获取数据边界
End(xlUo)上
End(xlDown)下
End(xlToLeft)左
End(xlToRight)右
Row 行号
Column 列号x=range("A1").End(xlToRight),Column
y=range("A1").End(xlToRight),Row
从A1单元格开始找到最右边界的单元格,并获取它的行号和列号
x=range("A1").End(xlToRight),Column
y=range("A1").End(xlToRight),Row
For n=2 to x
For m=2 to y step 2
If Cells(m.n)
Cells(m,n).Interior.ColorIndex=3
End If
Next y
Next n
查找 第2至8列,第2至第26行中小于60的数并标注为红色,每列跳过1列
1-13 Row 和Rows
Row 返回单元格所在的行号,如果是区域则返回这个区域首行的行号
Rows 代表行的集合,返回range对象
Rows.("1").Select 返回当前工作表的首行
Range("a5:e10").Rows.("1").Select 返回a5:e10区域的首行
Range("a5:e10").Rows.("6").Select 超出区域时会选择最大值
Range("a1").End(xlDown).Rows 获取al最下边界的单元格
Range("a1").End(xlDown).Row 获取al最下边界的行数
Range("a1").End(xlDown).Rows 获取al最下边界的单元格并复制到k1单元格
Rows.Count 最大的行号
Columns.Count 最大的列号
1-14 表中有空单元格情况下的边界获取Cells(Rows.Count."f").End(xlUp).Row
从最大的行开始向上获取到表格中的最末行
注:是为了避免从a1开始向右向下取数时,中间有空单元格导致无法取到正确的边界,但如果边界单元格也是空的,仍无法获取
1-15 Usedrange
Usedrange 表示指定宫缩表的所用区域
注:只能适用于干净的数据区域,如果有多余的备注列,也会将其选中,视为工作表的一部分。
ActiveSheet.UsedRange.Rows.Count 获取工作表的边界列数
1-15 CurrentRegion
Range("A1").CurrentRegion.Column.Count 获取A1相连区域的最大列数
注:与UsedRange的不同在于,如果表外有多余的注释单元格,也不会获取到,类似excel中Ctrl+A的全选功能
1-16 For Each 循环对象集合
For Each s In Worksheets
n=n+1
s.Name=n
Next
遍历当前工作簿的所有工作表,并将工作簿命名为1、2、3…
Selection 当前光标选中的动态区域
For Each s In Range("a1:f14")
For Each s In Selection
For Each s In Sheets("2").UsedRange
Dim ss As Range
For Each ss In Range(shee1.,Sheet1.Cells(Rows.Count,2).End(xlUp)
n=n+1
If ss.Value="男" Then
Wordsheets.Add(after:Sheets(Sheets.Count)).Name=Sheet1.Cells
End If
Add(after:Sheets(Sheets.Count)表示按顺序向后新增工作表
1-17 Offset 偏移
单元格(偏移行,偏移列)
1-18 Resize属性
调整制定区域的大小,返回range对象,该对象表示重新定义的区域
单元格.resize(新
ss.Offset(0,-2).Resize(1,3).Interior,ColorIndex=32 表示将ss单元向左偏移两个单元格,并横向选中三个单元格标注为红色
1-19 Exit
给代码提前结束的出口
Exit语句和End语句不能彼此替代
Exit不定义结构的末尾
Exit Do 只能写在Do循环里面
Exit For 只能写在for循环里面
Exit Sub 只能写在sub子过程里面
For i =1 To 10
For x= 1 to 5
if x=3 then exit for
Next x
Next
在运行到3时跳过,再在4时继续运行
1-20 DO LOOP
Do
Loop
On Error Resume Next 当代码运行错误时 忽略错误继续向下运行
1-21 GOTO
GOTO 100
If Err.Number0 Then Msgbox“错误” : GoTo 100
End If
100:
Err.Clear
Err.Number0 返回错误类型
GoTo 100 100:跳跃到100时的情况
当To 100后,相当跳出循环,再输入正确的日期也无法正确的结构,因此需要Err.Clear进行返回
1-22 Do While 和Until
Do While i 3 当i不等于3的时候继续循环
Do Until i=3 当i=3的时候停止循环
1-23 在VBA中使用工作表函数
=application.WorksheetFunction.AverageIf(,"女”,)
=WorksheetFunction.CountIfs(,"女” )
赋值average函数的结果给G2单元格
1-24 VBA随机函数
Int((最大值-最小值+1)*Rnd+最小值)
Int 向下取整函数
1-25 随机数凑数
Do
s1=Int((22-2+1)*Rnd+2)
s2=Int((22-2+1)*Rnd+2)
s3=Int((22-2+1)*Rnd+2)
h=Cells(s1,1)+Cells(s2,1)+Cells(s3,1)
Loop Until h =
随机取第2到22行第1列之间的三个随机数,然后进行循环,知道三个数的和为c2的值
on Error Resume Next (当代码错误时继续向下运行)
For i =2 to 200
For y =3 to 200
x = cells(i,1)+cells(y,1)
If x< Then
c=-x
t=Application.WorksheetFunction.Match(c,,0)
If t>=1 Then GoTo 100
End If
Next y
Next i
100:
Cell(i,1).Interior.colorindex=3
Cell(y,1).Interior.colorindex=3
Cell(t,1).Interior.colorindex=3
选择任意两个数字加总,然后判断是否小于c2单元格,如果小于则查找与c2单元格的差额,如有此值,则返回这三个值并标红,如没有,则忽略错误继续运行
代码字典
1.基础命令
(1)弹窗
Msgbox "我会写代码了"-弹出一个内容消息框
Inputbox(“请输入你的出生年份”)-弹出一个填空消息框
Exp:Sub 输出当年年龄()
y= InputBox("请输出你的出生年份“)
n=2022-y
MsgBox "你已经“&n&"岁了”
(2)单元格