ExcelVBA入门教程,实现自动化办公。(一)

彩虹网

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 结果子过程

ExcelVBA入门教程,实现自动化办公。(一)

(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("表名”) 表示的是工作簿中名称为“表名”的工作表

ExcelVBA入门教程,实现自动化办公。(一)

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 表示指定宫缩表的所用区域

注:只能适用于干净的数据区域,如果有多余的备注列,也会将其选中,视为工作表的一部分。

ExcelVBA入门教程,实现自动化办公。(一)

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)单元格

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。