导图社区 VBA
VBA是一个强大的工具,可以帮助用户自动化和优化Microsoft Office应用程序中的任务。
编辑于2024-04-10 14:10:09这是一篇关于产品设计创新:用户体验与交互设计的思维导图,主要内容包括:用户体验(UX)的重要性,交互设计(IXD)的核心要素,用户体验与交互设计的关系,用户体验设计流程,交互设计的实施步骤,用户体验与交互设计的工具和技术,用户体验与交互设计的未来趋势。
这是一篇关于财务造假2.0思维导图尽调要点的思维导图,主要内容包括:定义与背景,风险识别,尽职调查流程,技术手段应用,法律法规遵循,风险评估与应对,案例分析与学习,持续改进与创新。
这是一篇关于智能合约2.0思维导图安全防护的思维导图,主要内容包括:安全审计,合约设计,智能合约更新,智能合约保险,法律法规遵守,社区和开发者教育,持续监控和响应。
社区模板帮助中心,点此进入>>
这是一篇关于产品设计创新:用户体验与交互设计的思维导图,主要内容包括:用户体验(UX)的重要性,交互设计(IXD)的核心要素,用户体验与交互设计的关系,用户体验设计流程,交互设计的实施步骤,用户体验与交互设计的工具和技术,用户体验与交互设计的未来趋势。
这是一篇关于财务造假2.0思维导图尽调要点的思维导图,主要内容包括:定义与背景,风险识别,尽职调查流程,技术手段应用,法律法规遵循,风险评估与应对,案例分析与学习,持续改进与创新。
这是一篇关于智能合约2.0思维导图安全防护的思维导图,主要内容包括:安全审计,合约设计,智能合约更新,智能合约保险,法律法规遵守,社区和开发者教育,持续监控和响应。
VBA
程序
程序构成
模块
过程
代码
对象
对象.属性
对象.方法
实例:宏的录制
设置快捷键
指定按钮
指定常用工作栏按钮
设置安全级别
编程环境VBE
勘误 S2 p27 2.3 l1 basice应为basic
进入编辑器
Alt+F11
开发工具—Visual Basic
右键工作表标签—查看代码
开发工具—查看代码
主窗口
工程资源管理器
Excel对象
窗体对象
模块vs类模块
概念
保存VBA代码
创建特定的类或对象
建立后名称
模块1、模块2...
类1、类2...
属性窗口
代码窗口
立即窗口
菜单栏
工具栏
简单操作
模块添加与移除
编写程序
帮助
基础语法
数据类型
数据类型
Byte字节型
1
0~255,整数
年龄
加班天数
Boolean布尔型
2
逻辑判断,True/False
Integer整数型
2
-2768~32767,整数
人数
%
Long长整数型
4
-2147483648~2147483647,整数
人口数
&
Single单精度浮点型
4
-3.402823E38~-1.401298E-45
圆周率
!
Double双精度浮点型
8
负数: -1.79769313486232E308~ -4.94065645841247E-324
正数:4.94065645841247E-324~1.79769313486232E308
基本工资
#
Currency货币型
8
-922,337,203,685,477.5808~922,337,203,685,477.5807
@
Decimal小数型
不含小数时: +/-79,228,162,514,264,337,593,543,950,335
含小数时:+/-7.9228162514264337593543950335
最小的非零值:+/-0.0000000000000000000000000001
14
Date日期型
日期范围:100 年 1 月 1 日 到 9999 年 12 月 31 日
时间范围:0:00:00~23:59:59
8
日期
String字符串型-变长
10 +字符串长度
0 ~大约 20 亿
姓名、工号
$
String字符串型-定长
字符串长度
1 ~大约 65,400
$
Object
4
对象变量,用来引用对象
Variant
除定长String数据及用户自定义类型外,可包含任何种类的数据
如果是数值,最大可达Double的范围
如果是字符,与变长String范围一致
用户自定义
每个元素的范围与它本身的数据类型的范围相同
常量和变量
声明变量
变量名必须以字母/汉字开头,不能包含空格、句号、感叹号、@、&、$和# 最长不超过255字符/127字
声明多个变量
如果只声明变量名称,不声明数据类型,则默认数据类型为Variant Variant比其他数据类型占用更大存储空间,如非必要,避免声明为Variant类型
强制声明变量
变量作用域
单个过程
Dim/Static,作用于本过程,本地变量
单个模块
Dim/Private,作用于所在模块,模块级变量
所有模块
Public,作用于所有模块,公告变量
变量赋值
如果数据是文本,英文双引号 如果数据是日期,#之间
数据型变量赋值
对象型变量赋值
常量
圆周率、个人所得税税率等
常量赋值
常量赋值
数组
数组特征
共享一个名字:数组名
多个同类型变量构成一个数组
元素按序排列存储在数组中,通过索引号区分
数组是变量
声明数组
若无特别声明,数组起始索引号为0 若Option Base1,数组起始索引号是1
数组维数
声明动态数组
其他创建方式
Array函数
Sub 过程名() Dim 数组名 As Variant 数组名=Array(a,b,c,d,e,f,g,h,i,j,k...) '赋值过程 End Sub
Split函数
Sub 过程名() Dim 数组名 As Variant 数组名=Split("a,b,c,d,e,f",","...) '赋值过程 End Sub
Range函数
Sub 过程名() Dim 数组名 As Variant 数组名=Range("A1:C3").Value '赋值过程,单元格区域大小必须与数组相同 End Sub
UBound/LBound函数
UBound(数组名,维数)-LBound(数组名,维数)+1 '数组内元素总数
Join函数
Sub 过程名() Dim 数组名 As Variant,变量名 As String, 数组名=Array(a,b,c,d,e,f...) '赋值过程 变量名=Join(数组名,"分隔符号") '将数组元素连成字符串,以特定符号分隔 End Sub
数组写入单元格
Sub 过程名() Dim 数组名 As Variant 数组名=Array(a,b,c,d,e,f...) '赋值过程 Range("A1:A9").Value=Application.WorksheetFunction.Transpose(数组名) '将数组批量写入单元格一列,如无Transpose,则为一行 End Sub
对象
1.按照从大到小逐层引用 2.Book1是活动工作簿,则可简化为 Worksheets("Sheet2").Range("A2") 3.如果Sheet2工作表是活动表,则可简化为 Range("A2")
属性
相对性
方法
共享一个名字:数组名
运算符
算术
+
求和
-
求差,求相反数
*
求积
/
求商
\
整除
^
指数
Mod
取余
比较
=
等于
表达式1=表达式2
当两个表达式相等时返回Ture,否则返回False
小于
表达式1<表达式2
当表达式1小于表达式2时返回Ture,否则返回False
>
大于
表达式1>表达式2
当表达式1大于表达式2时返回Ture,否则返回False
小于或等于
表达式1<=表达式2
当表达式1小于或等于表达式2时返回Ture,否则返回False
>=
大于或等于
表达式1>=表达式2
当表达式1大于或等于表达式2时返回Ture,否则返回False
不等于
表达式1<>表达式2
当表达式1不等于表达式2时返回Ture,否则返回False
Is
比较两个对象的引用变量
对象1 Is 对象2
当对象1和对象2引用相同的对象时返回True,否则返回False
Like
比较两个字符串是否匹配
字符串1 Like 字符串2
当字符串1与字符串2匹配时返回Ture,否则返回False
连接
勘误p77 3.5.3 最后一行 何种尖形 应为 何种类型
+
两边表达式为文本字符串,执行连接;数值执行计算
&
无论运算符左右的数据类型,执行连接运算
逻辑
And
与
表达式1 And 表达式2
表达式1和表达式2的值都为Ture,返回Ture,否则返回False
Or
或
表达式1 Or 表达式2
表达式1和表达式2的值其一为Ture均返回Ture,否则返回False
Not
非
Not 表达式
表达式的值为Ture,返回False,否则返回Ture
Xor
异或
表达式1 Xor 表达式2
表达式1和表达式2的值不同时,返回Ture,否则返回False
Eqv
等价
表达式1 Eqv 表达式2
表达式1和表达式2的值相同时,返回Ture,否则返回False
Imp
蕴含
表达式1 Imp 表达式2
表达式1的值为Ture,表达式2的值为False时返回False,否则返回Ture;相当于Not表达式1Or表达式2
通配符
*
代替任意多个字符
?
代替任意一个字符
#
代替任意一个数字
[charlist]
代替位于[charlist]中任意一个字符
[!charlist]
代替不在[charlist]中任意一个字符
运算顺序
括号
()
指数
^
求相反数
-
乘法除法
*,/
整除
\
取余
Mod
加法减法
+,-
字符串连接
&,+
比较运算
=,<>,<,>,<=,>=,Like,Is
逻辑
And
Or
Not
Xor
Eqv
Imp
内置函数
基本语句结构
常用语句
If...Then语句
If Then ElseIf Else ------------------------------------ Sub 过程名() If 条件1 Then MsgBox"显示文字1" If 条件2 Then MsgBox"显示文字2" End Sub ------------------------------------ Sub 过程名() If 条件1 Then MsgBox"显示文字1" Else MsgBox"显示文字2" End Sub ------------------------------------ Sub 过程名() If 条件1 Then MsgBox"显示文字1" ElseIf 条件2 Then MsgBox"显示文字2" Else Msgbox"显示文字3" End Sub
Select Case语句
Select Case+数值/字符串 为减少判断次数,尽量将最有可能发生的情况写在前面 ------------------------------------ Sub 过程名() Select Case 比较对象 Case 条件1 MsgBox"显示文字1" Case 条件2 MsgBox"显示文字2" Case Else '可选语句,如果找不到与测试 表达式匹配的值则执行 MsgBox"显示文字3" End Sub
For...Next语句
步长为正负整数 负整数:初值大于终值 正整数:初值小于终值 --------------------------------- Sub 过程名() For 循环变量=初值 To 终值 [Step 步长值] '若省略,步长默认为1 [Exit For] '可在循环体任意处加入一句或多句Exit For, 遇到时退出For循环,执行Next后语句 [循环体] Next [循环变量] '循环变量名可省略 End Sub --------------------------------- Sub 过程名() Dim 变量名1 As 变量类型,循环变量 As 变量类型 For 循环变量=初值 To 终值 Step 1 'Step为1时可省略。初值、终值据单元格区域确定 Select Case Cells(循环变量,"取值列号") Case Is 条件1 变量1="文字1" Case Is 条件2 变量1="文字2" Case Is 条件3 变量1="文字3" Case Else 变量1="文字4" End Select Cells(循环变量,"赋值列号")=变量1 Next 循环变量 '更改循环变量的值,相当于i=i+步长,变量名可省略 End Sub
Do While语句
开头判断式 Sub 过程名() Do [While 逻辑表达式] '为True,执行循环体,否则执行Loop后语句 如省略,应使用Exit Do语句,满足一定条件后退出循环 [Exit Do] [循环体] Loop End Sub ------------------------------------ 结尾判断式 Do [Exit Do] [循环体] Loop [While 逻辑表达式]
Do Until语句
开头判断式 Sub 过程名() Do [Until 逻辑表达式] '为False,执行循环体,否则执行Loop后语句 [Exit Do] [循环体] Loop End Sub ------------------------------------ 结尾判断式 Do [Exit Do] [循环体] Loop [Until 逻辑表达式] '为False,返回Do执行循环体,否则执行Loop后语句
For Each...Next语句
在数组中执行循环时,不能对其中元素进行赋值或重新赋值 对已经赋值的对象也只能修改元素属性 ---------------------------------- For Each 元素变量 In 集合名称或数组名 '如是集合,元素变量定义为相应对象类型 如是数组,元素变量定义为Variant类型 [Exit For] Next [元素变量] '遍历集合或数组中每个元素,无论集合或数组里有多少原素, 总是从第一个开始,直到最后一个,然后退出循环
GoTo语句
目标代码所在行前,加上带冒号字符串或不带冒号数字作为标签 除非必须,应尽量避免使用
With语句
如:对同一个对象多个属性设置时 Sub FontSet() Worksheets("Sheet1").Range("A1").Font.Name="仿宋" Worksheets("Sheet1").Range("A1").Font.Size=12 Worksheets("Sheet1").Range("A1").Font.Bold=True Worksheets("Sheet1").Range("A1").Font.ColorIndex=3 End Sub -------------------------- Sub FontSet() With Worksheets("Sheet1").Range("A1").Font .Name="仿宋" .Size=12 .Bold=True .ColorIndex=3 End Sub
基本过程
Sub过程
编写位置
声明Sub过程
[Private/Public][Static] Sub 过程名([参数列表]) [语句块] [Exit Sub] [语句块] End Sub
执行Sub过程
从其他位置执行特定Sub过程 ------------ 过程名[参数1,参数2,...] ------------ Call 过程名[(参数1,参数2,...)] ------------ Application.Run 表示过程名的字符串(或字符串变量)[参数1,参数2,...]
作用域
公共过程
私有过程
不在【宏】对话框显示
Function过程
[Public/Private/Static] Function 函数名([参数列表]) [As 数据类型] [语句块] [函数名=过程结果] [Exit Function] [语句块] [函数名=过程结果] '最后必须将函数结果赋值给函数名 End Function
编写位置
Function 过程名() End Function
自定义函数
勘误p109 3.9.3 最后一段 应为"有多少个黄色单元格" ------------------------- 统计黄色单元格数 Function CountColor() If Range("A1").Interior.Color=RGB(255,255,0) Then '默认黄色值为255,255,0 CountColor=1 Else Countcolor=0 End If End Function Function CountColor() Dim rng As Range For Each rng In Range("A1:A10") If rng.Interior.Color=RGB(255,255,0) Then '等同于 Range("A1").Interior.ColorIndex=6 Countcolor=Countcolor+1 End If Next rng End Function ----------------------- 用参数指定计算区域 Function CountColor(arr As Range) Dim rng As Range For Each rng In arr If rng.Interior.Color=RGB(255,255,0) Then Countcolor=Countcolor+1 End If Next rng End Function Function CountColor(arr As Range,c As Range) Dim rng As Range For Each rng In arr If rng.Interior.Color=c.Interior.Color Then Countcolor=Countcolor+1 End If Next rng End Function ----------------------- 设置自定义函数为易失性函数,即重新计算工作表后重新计算结果 Public Function Fun() Appliction.Volatile True fun =Int(Rnd()*10)+1 End Function
代码排版
缩进
短行
多行合并
注释
设置(解除)注释块
常用对象
常用对象
Application
Excel应用程序
Workbook
工作薄
Worksheet
工作表
Range
单个单元格或单元格区域
Application
ScreenUpdating属性
不显示计算结果到屏幕上 Sub InputTest() Cells.ClearContents Application.ScreenUpdating=False '关闭屏幕更新 Range("A1:A10")=100 MsgBox"刚才在A1:A10输入数值100,你能看到结果吗?" Range("B1:B10")=200 MsgBox"刚才在B1:B10输入数值200,你能看到结果吗?" Application.ScreenUpdating=True '恢复屏幕更新 End Sub
DisplayAlerts属性
取消显示警告对话框 Sub DelSht() Dim sht As Worksheet Application.DisplayAlerts=False For Each sht In Worksheets If sht.NameActivesheet.Name Then sht Delete End If Next Application.DisplayAlerts=True End Sub
EnableEvents属性
触发事件实例 选中单元格,自动在该位置写入单元格地址 Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'Target代表用户当前选中单元格 Target.Value=Target.Address End Sub ---------------------------------- 禁用事件实例 Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'Target代表用户当前选中单元格 Target.Value=Target.Address Application.EnableEvents=False '禁用事件 Target.Offset(1,0).Select '选中活动单元格的下一个单元格 Application.EnableEvents=True '启用事件 End Sub
WorksheetFunction属性
Application常用属性
ActiveCell
当前活动单元格
ActiveChart
当前活动工作簿中的活动图表
ActiveSheet
当前活动工作簿中的活动工作表
ActiveWindow
当前活动窗口
ActiveWorkbook
当前活动工作簿
Charts
当前活动工作簿中的所有图表工作表
Selection
当前活动工作簿中所有选中的对象
Sheets
当前活动工作簿中所有Sheet对象,包括普通工作表、图表工作表、Ms Excel 4.0宏表工作表和Ms Excel 5.0对话框工作表
Worsheets
当前活动工作簿中的所有Worksheet对象(普通工作表)
Workbooks
当前所有打开的工作簿
实例:Excel界面设置
Workbook
ThisWorkbook.Name '代码所在工作簿名称 ThisWorkbook.Path '代码所在工作簿路径 ThisWorkbook.FullName '代码所在工作簿带路径的名称
引用
索引号
名称
常用操作
新增
打开
激活
保存
关闭
ThisWorkbook/ActiveWorkbook
Worksheet
引用
索引号或标签名称
代码名称
常用操作
代码窗口中,输入完对象的方法名称后按空格,VBE自动显示该方法的所有参数更改工作表标签
新建工作表
Worksheets.Add '插入一张新工作表 ---------------------------------------------------------- Worksheets.Add before:=Worksheet(1) '在第一张工作表前插入一张新工作表 Worksheets.Add after:=Worksheet(1) '在第一张工作表后插入一张新工作表 'before/after 只能选择其一 默认位置为活动工作表之前 --------------------------------------------------------- Worksheets.Add Count:=3 '在活动工作表前插入3张新工作表 'Count缺省值1 --------------------------------------------------------- Sub 过程名() worksheets.Add before:=Worksheets(Worksheets.Count), Count:=2 End Sub
更改工作表标签
Worksheets(2).Name="工资表" '更改第2张工作表标签名为"工资表" ---------------------------------------------------------- Sub 过程名() Worksheets.Add before:=Worksheets(1) ActiveSheet.Name="工资表" '将新建工作表更名为"工资表" '新建工作表总是活动工作表,可以用ActiveSheet引用 End Sub ---------------------------------------------------------- Sub 过程名() Worksheets.Add (before:=Worksheets(1)).Name="工资表" End Sub
删除工作表
Worksheets("Sheet1").Delete '删除Sheet1工作表 ---------------------------------------------------------- Sub 过程名() Worksheets.Add before:=Worksheets(1) ActiveSheet.Name="工资表" '将新建工作表更名为"工资表" '新建工作表总是活动工作表,可以用ActiveSheet引用 End Sub
激活工作表
Worksheets(1).Activate '激活第一张工作表 ---------------------------------------------------------- Worksheets(1).Select '激活第一张工作表 '和上个语句等效 '工作表隐藏时,Select出错,Activate方法不用同时选中多张工作表, 但时Select方法可以同时选中未隐藏的多张工作表
复制工作表
Sub 过程名() Worksheets("工资表").Copy before:=Worksheets("出勤登记表") '复制得到的新工作表总是活动工作表 End Sub ------------------------------------ Sub 过程名() Worksheets("工资表").Copy after:=Worksheets("职工档案") 'before/after只能选择其一 End Sub '不设参数,默认复制到新工作簿中 '使用参数复制工作表时,将复制工作表到同一工作簿中,Excel自动为工作表命名,与原工作表不同 '不使用参数复制工作表时,将把工作表复制到新工作簿中,名称与原来相同
移动工作表
Sub 过程名() '将"工资表"移动到"出勤登记表"之前 Worksheets("工资表").Move before:=Worksheets("出勤登记表") '将"工资表"移动到"职工档案"之后 Worksheets("工资表").Move after:=Worksheets("职工档案") '将"工资表"移动到新工作簿中 Worksheets("工资表").Move End Sub
隐藏/显示工作表
Worksheets("工资表").Visible=False Worksheets("工资表").Visible=xlSheetHidden Worksheets("工资表").Visible=0 '三句作用一样,等同于从格式菜单隐藏工作表 隐藏后不能在格式菜单中取消隐藏,只能用代码或属性窗口中设置显示 Worksheets("工资表").Visible=xlSheetVeryHidden Worksheets("工资表").Visible=2 '两句作用相同,与前三句作用不同 Worksheets("工资表").Visible=True '四句中任意一句取消各种方式造成的隐藏 Worksheets("工资表").Visible=xlSheetVisible Worksheets("工资表").Visible=1 Worksheets("工资表").Visible=-1
获取工作表数目
Sub 过程名() Dim 变量名% 变量名=Worksheets.Count '将结果保存在变量中 MsgBox"工作簿里一共有"&变量名&"张工作表" End Sub
Sheets
Excel共有四种不同类型工作表 Sheets表示工作簿里所有类型的工作表的集合 Worksheets表示普通工作表的集合
Range
引用
Worksheets("Sheet1").Range("A1").Value=50 '将值50保存在A1单元格中 --------------------------- Sub 过程名() Range("A1:A10").Value=200 '活动工作表的A1:A10区域输入数值200 Dim n As string n="B1:B10" Range(n)=100 '变量是参数,表示单元格地址的字符串变量 End Sub --------------------------- Sub 过程名() '单元格已定义名称,例如为date Range("date").Value=100 End Sub --------------------------- Sub 过程名() '引用多个不连续区域,各区域间以逗号隔开 Range("A1:A10,A4:E6,C3:D9").Select '运行程序后,三个区域被同时选中 '若是Range("A1:A10","A4:E6","C3:D9").Select,运行程序后,选中区域为涵盖三处的大矩形 End Sub --------------------------- Sub 过程名() '引用相交叉区域,在区域间添加空格 Range("B1:B10 A4:D6").Select End Sub --------------------------- [B2] 'B2单元格 [A1:D10] 'A1:D10单元格 [A1:A10,C1:C10,E1:E10] '3个单元格区域的合并区域 [B1:B10 A5:D5] '两个单元格区域的公共区域 [n] '名称n代表的单元格 '[]是Application对象的Evaluate的简写
单元格
Sub 过程名() '在第3行与第4列的相交单元格输入20 ActiveSheet.Cells(3,4).Value=20 '3为行号,只能是数字;4为列号,可以是数字,可以是字母 '等同于ActiveSheet.Cells(3,"D").Value=20 End Sub -------------------- Sub 过程名() '在B3:F9单元格区域内第2行与第3列的相交单元格输入100 Range("B3:F9").Cells(2,3)=100 End Sub -------------------- Sub 过程名() '选中活动工作表的A1:E30单元格 Range(Cells(1,1).Cells(10,5)).Select '等效的语句还包括Range("A1","E10").Select 或Range(Range("A1"),Range("E10").Select End Sub -------------------- Sub 过程名() '在活动工作表的第2个单元格输入200 '可以只使用一个参数 ActiveSheet.Cells(2).Value=200 'Worksheet对象的Cells属性,Excel2003中索引号值为1至16777216(65536行*256列) End Sub 'Range对象的Cells属性,索引号范围为1至单元格区域所包含单元格数 索引号可大于单元格个数,系统自动将单元格区域在行方向扩展,列数不变,然后引用 -------------------- Sub 过程名() ActiveSheet.Cells.Select '选中活动工作表中所有单元格 Range("B3:F9").Cells.Select '选中活动工作表中B3:F9单元格区域 不指定参数,Cells属性将返回指定对象中所有单元格 End Sub
属性
内容
Range默认属性,给区域赋值时可省略
个数
返回指定单元格区域所包含单元格个数
地址
Sub 过程名() MsgBox"当前选中单元格地址为:"&Selection.Address End Sub
操作
选中单元格
ActiveSheet.Range("A1:B10").Select '两条命令效果相同 ActiveSheet.Range("A1:B10").Activate '选中单元格区域后,再使用Active方法,区域仍然呈选中状态,只增加活动单元格区域为激活单元格;如使用Select方法,则只有选中单元格呈选中状态
选择性清除单元格
Range("A1").Clear Range("A1").ClearComments Range("A1").ClearContents Range("A1").ClearFormats
复制单元格区域
Sub 过程名() Range("A1").Copy [Destination:=]Range("C1") '源单元格区域.Copy 目标单元格 End Sub -------------------------------- Sub 过程名() Range("A1").CurrentRegion.Copy Range("G1") '不能确定复制区域大小,可指定单元格作为目标区域最左上角 End Sub -------------------------------- Sub 过程名() Range("A1:A10").Copy Range("F1:F10").PasteSpecial Paste:=xlPasteValue '只黏贴数值 End Sub Sub 过程名() Range("F1:F10").Value=Range("A1:A10").Value '只黏贴数值 End Sub
剪切单元格
Sub 过程名() Range("A1:A5").Cut [Destination:=]Range("G1") '剪切A1:A5到G1:K5 Range("A6:E10").Cut [Destination:=]Range("G6") '剪切A6:E10到G6:K10 End Sub
删除单元格
Range("B5").Delete Shift:=xlToLeft '删除后右侧单元格左移 Range("B5").Delete Shift:=xlUp '删除后下方单元格上移,默认 Range("B5").EntireRow.Delete '删除所在行 Range("B5").EntireColumn.Delete '删除所在列
其他操作
引用整行
ActiveSheet.Rows("3:3").Select '选中活动工作表第3行 ActiveSheet.Rows("3:5").Select '选中活动工作表第3行到第5行 ActiveSheet.Rows(3).Select '选中活动工作表第3行 ActiveSheet.Rows.Select '选中工作表中所有行,等同于ActiveSheet.Cells ---------------------------- Rows("3:10").Rows("1:1").Select '选中第3行到第10行区域中的第一行
引用整列
ActiveSheet.Columns("F:G").Select '选中活动工作表中F列 ActiveSheet.Columns(6).Select '选中活动工作表中第6列 ActiveSheet.Columns.Select '选中活动工作表中所有列 Columns("B:G").Columns("B:B").Select '选中B:G列区域中的第2列 ---------------------------- Rows("3:10").Rows("1:1").Select '选中第3行到第10行区域中的第一行
Application对象的Union方法
Sub 过程名() '同时选中2个单元格区域 Application.Union(Range("A1:A10"),Range("D1:D5")).Select 'Application可省略 不同参数英文逗号分隔;Range区域最少2个,最多30个 End Sub
Range对象的Offset属性
Range("A1").Offset(2,3).Value=500 '从A1开始,向下移动2行,再向右移动3列 '修改Offset参数可以控制移动的方向和距离 '如果第一个数是-3,则向上移动,第二个数如果为0,则不移动
Range对象的Resize属性
Sub 过程名() Range("B2").Resize(5,4).Select=500 '将B2单元格扩大为B2:E6 '扩展的起点为B2,单元格,第一个参数表示新区域行数,第二个参数表示新区域列数 '参数均为正整数,最小值1 End Sub -------------------------- Sub 过程名() Range("B2:E6").Resize(2,1).Select '将B2:E5单元格区域缩小为B2:B3 End Sub '等同于Rnage("B2:E6").Cells(1).Resize(2,1).Select
Worksheet对象的UsedRange属性
Sub 过程名() ActiveSheet.UsedRange.Select '选中工作表中已经使用的单元格围城的矩形区域 '范围包括其中空行、空列、空单元格
Range对象的CurrentRegion属性
Sub 过程名() Range("B5").CurrentRegion.Select '以空行、空列作为边界的当前区域 '相当于选中B5单元格后F5,定位"当前区域"所得 End Sub
Range对象的End属性
Sub 过程名() Range("C5").End(xlUP).Select '返回C5区域结尾处按向上方向键所得单元格 等同于在C5单元格按所得单元格 End Sub ---------------------- Sub 过程名() ActiveSheet.Range("A65536").End(xlUP).Offset(1,0).Value="张青" 'A列最后一个单元格按向上方向键得到A列最后一个非空单元格 '最后一个非空单元格向下移动一行,得到第一个空单元格,然后输入数据 End Sub
xlToLeft
向左,源单元格<Ctrl+左方向键>
xlToRight
向右,源单元格<Ctrl+右方向键>
xlUP
向上,源单元格<Ctrl+上方向键>
xlDown
向下,源单元格<Ctrl+下方向键>
其他常见对象
名称
AcitiveWorkbook.Name.Add Name:="date",RefersToR1C1:="=Sheet1!R5C[-2]" 'R5C[-2],表示指定行与指定列相交的单元格 '[],表示相对引用;内含正数,表示活动单元格下方或右边的行或列,负数则表示上方或左边的行或列 'R5表示工作表第5行,C[-2]表示活动单元格左边第2列 -------------- Range("A1:C10").Name="date" '定义名称 -------------- Sub 过程名() ActiveWorkbook.Name("date").Name="姓名" '定义名称名 ActiveWorkbook.Name("date")."姓名".RefersTo="张万平" '更改名称值 End Sub -------------- Sub 过程名() Dim i As Integer.mx As Integer mx=ActiveWorkbook.Names.Count '统计名称总数 For i =1 To mx ActiveWorkbook.Names(i).Visible=False '隐藏名称 Next End Sub
单元格批注
Sub 过程名() Range("B5").AddComment Text:="我用VBA新建的批注" 'AddComment,添加批注方法 End Sub '已有批注,再添加会出错 ------------------ Sub 过程名() If Range("B5").Comment Is Nothing Then '判断是否已存在批注 MsgBox"B5单元格没有批注!" Else MsgBox"B5单元格已有批注!" End If End Sub ------------------ Sub 过程名() Range("B5").Comment.Text="更改过的批注" '更改批注内容 Range("B5").Comment.Visible=False '隐藏批注 Range("B5").Comment.Delete '删除批注 End Sub
美化单元格
字体
Sub 过程名() With Range("A1:L1").Font .Name="宋体" .Size=12 .Color=RGB(255,0,0) '红色 .Bold=True .Italic=True .Underline=xlUnderlineStyleDouble '添加单下划线 End With End Sub
底纹
Sub InteriorSet() Range("A1:L1").Interior.Color=RGB(255,255,0) End Sub
边框
Sub BorderSet() With Range("A1").CurrentRegion.Borders .LineStyle=xlContinuous '设置单线边框 .Color=RGB(0,0,255) '设置边框颜色 .Weight=xlHairline '设置边框线条样式 End With End Sub
其他
实例:典型操作
创建工作簿
判断工作簿是否打开
判断工作簿是否存在
向关闭的工作薄录入数据
隐藏活动工作表外所有工作表
批量新建工作表
Sub 过程名() '根据数据表中的已有字段新建不同的工作表,工作表以字段中的数据命名 Dim i As Integer,sht As Worksheet i=2 Set sht=Worksheets("成绩表") Do While sht.Cells(i,"C")"" Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name=she.Cells(i,"C").Value i=i+1 Loop End Sub
批量对数据分类
Sub 过程名() Dim i As Long,bj As String,rng As Range i=2 bj=Cells(i,"C").Value Do While bj"" Set rng=Worksheets(bj).Range("A65536").End(xlUp).Offset(1,0) Cells(i,"A").Resize(1,7).Copy rng i=i+1 bj=Cells(i,"C").Value Loop End Sub ---------------------- Sub 过程名() '清楚工作表中原数据 Dim sht As Worksheet For Each sht In Worksheets If sht.Name"成绩表" Then sht.Range("A2:G65536").ClearContents End If Next End Sub
将工作表保存为新工作表
快速合并多表数据
Sub 过程名() Rows("2:65536").Clear Dim sht As Worksheet.xrow As Integer, rng As Range For Each sht In Worksheets '遍历所有工作表 If sht.NameActiveSheet.Name Then Set rng=Range("A65536").End(xlUp).Offset(1,0) '获得A列第一个空单元格 xrow=sht.Range("A1").CurrentRegion.Rows.Count-1 '获得分表中记录条数 sht.Range("A2").Resize(xrow,7).Copy rng '黏贴记录到汇总表 End If Next End Sub
汇总同文件夹下多工作簿数据
Sub 过程名() '每个工作簿只有结构相同工作表,工作表表头相同 Dim bt As Range.r As Long, c As Range r=1 c=8 Range(Cells(r+1),"A",Cells(65536,c)).ClearContents '清除汇总表中原数据 Application.ScreenUpdating=False Dim FileName As String,wb As Workbook,Erow As Long,fn As String,arr As Variant FileName=Dir(ThisWorkbook.Path&"\*.xls") Do While FileName"" If FileNameThisWorkbook.Name Then '判断文件是否本工作簿 Erow=Range("A1").CurrentRegion.Rows.Count+1 '取得汇总表中第一条空行行号 fn=ThisWorkbook.Path&"\"&FileName Set wb=GetObject(fn) '将fn代表的工作簿对象赋给变量 Set sht=wb.Worksheets(1) '汇总第一张工作表 arr=sht.Range(sht.Cells(r,"A"),sht.Cells(65536,"B").End(xlUp).Offset(0,8)) '将数组arr中的数据写入工作表 Cells(Erow,"A").Resize(UBound(arr,1),UBound(arr,2))=arr wb.Close False End If FileName=Dir Loop Application.ScreenUpdating=True End Sub
为工作表建立目录
Sub 过程名() '为工作簿中所有工作表建立目录 Rows("2,65536").ClearContents '清楚工作表中原有数据 Dim sht As Worksheet,irow As Integer irows=2 '在第2行写入第一条记录 For Each sht In Worksheets '遍历工作表 Cells(irow,"A").Value=irow-1 '写入序号 '写入工作表名,并建立超链接 ActiveSheet.Hyperlinks.Add Anchor:=Cells(irow,"B"),Adress:="",_ SubAdress:=" ' "&sht.Name&" '!A1 ",TextToDisplay:=sht.Name irow=irow+1 Next End Sub
Excel事件
Worksheet事件
Worksheet事件列表
Activate
激活工作表时发生
BeforeDoubleClick
双击工作表后,默认双击操作之前发生
BeforeRightClick
右击工作表后,默认右击操作之前发生
Calculate
重新计算工作表之后发生
Change
单元格发生更改时发生
Deactivate
由活动工作表变为不活动工作表时发生
FollowHyperlink
单机工作表中任意超链接时发生
PivotTableUpdate
更新数据透视表之后发生
SelectionChange
所选内容发生更改时发生
自动提示更改内容
Private Sub Worksheet_Change(ByVal Target As Range) MsgBox Target.Address&"单元格的值被更改为:"&Target.Value End Sub
选中对象
Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox"当前选中的单元格区域为:"&Target.Address End Sub
激活工作表时运行程序
Private Sub Worksheet Active() MsgBox"当前活动工作表为:"&ActiveSheet.Name End Sub
禁止选中其他工作表
Private Sub Worksheet_Deactive() MsgBox"不允许选中Sheet工作表外的其他工作表!" Worksheets("Sheet1").Select End Sub
Worksbook事件
Activate
激活工作表时发生
AddinInstall
当工作簿作为加载宏安装时发生
AddinUninstall
当工作簿作为加载宏卸载时发生
AfterXmlExport
在保存或导出指定工作簿中的XML数据之后发生
AfterXmlImport
在刷新现有XML数据连接或新的XML数据被导入任意一个打开的工作簿后发生
BeforeClose
在关闭工作簿前发生,如果已更改,则此事件在询问用户是否保存更改之前发生
BeforePrint
在打印指定工作簿或其中任何内容之前发生
BeforeSave
在保存工作簿前发生
BeforeXmlExport
在保存或导出指定工作簿中XML数据之前发生
BeforeXmlImport
在刷新现有XML数据连接或新XML数据被导入任意一个打开的工作簿前发生
Deactivate
在工作簿从活动状态转为非活动状态时发生
NewSheet
在工作簿新建工作表时发生
Open
在打开工作簿时发生
PivotTableCloseConnection
在数据透视表连接关闭之后发生
PivotTableOpenConnection
在数据透视表连接打开之后发生
SheetActivate
在激活任意工作表时发生
SheetBeforeDoubleClick
在双击任意工作表时(默认双击操作之前)发生
SheetBeforeRightClick
在右击任意工作表时活在图标上绘制更改的数据之后发生
SheetCalculate
在重新计算工作表时活在图表上绘制更改的数据之后发生
SheetChange
在更改了任何工作表中的单元格时发生
SheetDeactivate
当工作表从活动工作表变为不活动工作表时发生
SheetFollowHyperlink
当单击工作簿中任何超链接时发生
SheetSelectionChange
任意工作表上选定区域发生更改时发生(图表工作表例外)
Sync
当作为“文档工作区”一部分的工作簿的本地副本与服务器副本进行同步时发生
WindowActivate
激活任意工作簿窗口时发生
WindowDeactivate
任意工作簿窗口由活动窗口变为不活动窗口时发生
WindowResize
调整任意工作簿窗口大小时发生
自动程序
MouseMove事件
Application方法
OnKey
OnTime
实例:典型技巧
快速录入数据
快速寻找数据
自动保存文件
用户界面设计
控件
窗体控件:只能在工作表中通过设置格式或指定宏使用,多做编辑数据 ActiveX控件:可以在工作表和用户窗体中使用,多在编辑数据同时做其他操作
窗体控件
标签
用于输入和显示静态文本
分组框
用于组合其他多个控件
按钮
用于执行宏命令
复选框
选择控件,可以多项选择
选项按钮
选择,通常几个选项按钮用组合框合在一起使用,只能同时选择其中之一
列表框
显示多个选项列表,可以从中选择之一
组合框
提供可选择的多个选项,可以选择其中之一
滚动条
包括水平和垂直
微调控件
单击控件的箭头选择数值
ActiveX控件
用户交互
InputBox函数
InputBox(Prompt【对话框上提示文字】, Title【对话框标题,默认为MicrosoftExcel】,Default【默认输入值,缺省为空】, xpos【对话框左端与屏幕左端距离,默认在水平方向居中显示】, ypos【对话框顶端与屏幕顶端距离,默认在屏幕高度三分之一位置】) '除prompt参数,参数名可省略
Application对象的InputBox方法
MsgBox函数
显示按钮
显示图标样式
缺省按钮
对话框类型
返回值
Application对象的FindFile方法
Application对象的GetOpenFilename方法
Application对象的GetSaveAsFilename方法
Application对象的FileDialog方法
用户窗体
添加窗体
窗体属性
添加窗体内控件
显示窗体
手动
代码
模式
关闭窗体
手动
代码
使用控件
初始化窗体
命令按钮
数据录入
键盘控制控件
实例:典型技巧及范例
调查问卷设计
职工信息管理
登陆窗体
代码调试与优化
错误
编译错误
运行错误
逻辑错误
程序状态
设计模式
运行模式
中断模式
调试工具
中断模式
运行错误
编译错误
中断执行
断点设置
Stop语句
立即窗口
本地窗口
监视窗口
错误处理
Go Error GoTo标签
On Error Resume Next
On Error GoTo 0
加快代码运行速度
变量设置
声明变量为合适数据类型
尽量不适用Variant型数据
避免变量一直存在内存中
避免反复引用相同对象
with语句简化
使用变量简化引用对象
尽量使用函数
去掉多余激活和选择
合理使用数组
关闭屏幕更新
关于本导图