导图社区 VBA速学,属性、方法、函数、语句、错误代码查询
VBA速学,属性、方法、函数、语句、错误代码查询,通过深入学习并实践这些核心概念,您将能够编写出强大而灵活的VBA程序,自动化您的日常工作,提高工作效率。
编辑于2024-09-18 16:43:17VBA速学
参数
单元格参数
comment
批注
add.comment 新建批注
comment.visible 显示批注
comment.shape.textframe.autosize = true 自动调整批注框大小
Font
字体
Font.Color 字体颜色
工作表参数
函数参数
对象

"Application:是Excel对象模型中的顶级对象,代表Excel应用程序本身"
属性
ActiveCell 属性 Range 返回活动工作表中的活动单元格
ActiveSheet 属性 Object 返回活动工作簿中的活动工作表
ActiveChart 属性 当前活动工作簿中的活动图表
ActiveWindow 属性 Window 返回Excel应用程序的活动窗口
ActiveWorkbook 属性 Workbook 返回Excel中的活动工作簿
Charts 属性 当前活动工作簿中的所有图表工作表
Calculation 属性 Long 设置或返回 Excel中的计算方式
Caller 属性 Variant 返回关于调用 Visual Basic 的信息
Caption 属性 String 设置或返回Excel主窗口中的标题
Cells 属性 Range 返回活动工作表中的所有单元格
CommandBars属性 CommandBars 返回Excel可用的命令栏集合
DefaultFilePath 属性 String 设置或返回打开文件的默认文件夹
DisplayAlerts属性 Boolean 设置是否显示Excel消息提示
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 属性 Boolean 设置是否允许触发 Excel中的事件
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
FileDialog 属性 FileDialog 返回一个文件对话框
Name 属性 String 返回 Excel应用程序的名称
Path 属性 String 返回Excel应用程序的安装路径
Range 属性 Range 返回指定的单元格或单元格区域
ScreenUpdating 属性 Boolean 设置或返回运行代码时 Excel 是否更新显示
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
Selection 属性 Object 返回在活动窗口中选定的对象
Sheets 属性 Sheets 返回活动工作簿中的工作表集合
StartupPath 属性 String 返回Excel 自启动文件夹的路径
StatusBar 属性 String 设置或返回状态栏中的文本
TemplatesPath属性 String 返回 Excel的模板文件夹的路径
ThisCell 属性 Range 设置或返回正在调用 Excel 自定义函数的单元格
ThisWorkbook 属性 Workbook 返回包含当前 VBA代码的工作簿
UserName 属性 String 设置或返回 Excel应用程序用户名
Version属性 String 返回Excel应用程序的版本号
Visible 属性 Boolean 设置 Excel应用程序是否可见
Windows 属性 Windows 返回所有打开的Excel窗口
Workbooks属性 Workbooks 返回所有打开的工作簿
WorksheetFunction 属性 WorksheetFunction 返回包含能够在 VBA 中使用的所有Excel工作表函数
Worksheets 属性 Sheets 返回活动工作簿中的所有工作表
方法
GetOpenFilename 方法 Variant 返回在[打开]对话框中选择的文件名及其路径
GetSaveAsFilename方法 Variant 返回在[另存为]对话框中输入的文件名及保存文件的路径
Goto 方法 无 选定任意工作簿中的任意区域或任意VBA过程
InputBox方法 Variant 显示一个指定接收输入数据类型的对话框
Intersect 方法 Range 返回多个单元格区域的重叠部分
OnKey方法 无 为VBA过程指定快捷键
OnTime方法 无 设置定时运行指定的VBA过程
Quit 方法 无 退出Excel 应用程序
SendKeys方法 无 发送按键到 Excel应用程序
Union 方法 Range 合并多个单元格区域
Volatile方法 无 设置自定义函数的易失性。如果设置函数为易失性(Volatile 方法参数为 True),则当计算工作表的某个单元格时,易失性函数会自动计算
工作簿

ThisWorkbook/ActiveWorkbook
Workbooks
属性
Count 属性 Long 返回打开的工作簿的总数
Item 属性 Workbook 指定引用的工作簿的索引值或名称
方法
Add 方法 Workbook 新建一个工作簿
Close 方法 无 关闭所有打开的工作簿
Open 方法 Workbook 打开指定的工作簿
Workbook
ThisWorkbook.Name '代码所在工作簿名称 ThisWorkbook.Path '代码所在工作簿路径 ThisWorkbook.FullName '代码所在工作簿带路径的名称
属性
ActiveSheet 属性 Object 返回工作簿中的活动工作表
FullName 属性 String 返回工作簿的名称和路径
HasPassword 属性 Boolean 返回工作簿是否包含密码
IsAddin 属性 Boolean 设置或返回当前工作簿是否是一个加载项
Name 属性 String 返回工作簿的文件名
Password 属性 String 设置或返回工作簿的打开密码
Path 属性 String 返回工作簿的路径
Saved 属性 Boolean 设置或返回工作簿是否需要保存
Sheets 属性 Sheets 返回工作簿中的所有工作表,包含图表工作表
Windows 属性 Windows 返回工作簿的所有窗口
Worksheets 属性 Sheets 返回工作簿中的所有工作表,不包含图表工作表
方法
Activate 方法 无 激活一个工作簿窗口
Close 方法 无 关闭工作簿
Protect 方法 无 设置对工作簿的保护状态
Save 方法 无 保存工作簿
SaveAs方法 无 另存工作簿
工作表

Worksheets 工作簿中的所有工作表,不包含图表工作表
属性
Count 属性 Long 返回工作簿中包含的工作表总数
Visible 属性 Boolean 设置或返回工作表是否可见
方法
Add 方法 Object 新建工作表
Copy方法 无 复制工作表
Delcte 方法 无 删除工作表
Move方法 无 移动工作表
Select 方法 无 选择工作表
Worksheet 工作簿中特定工作表
属性
Cells 属性 Range 返回工作表中的所有单元格
Columns 属性 Range 返回工作表中的所有列
Name属性 String 设置或返回工作表的名称
Names 属性 Names 返回工作表中包含的名称集合
Range 属性 Range 返回工作表中指定的单元格或单元格区域
Rows 属性 Range 返回工作表中的所有行
UsedRange 属性 Range 返回工作表中已被使用的区域
Visible 属性 Boolean 设置或返回工作表是否可见
方法
Activate 方法 无 激活一个工作表
Copy 方法 无 复制工作表
Delete方法 无 删除工作表
Move 方法 无 移动工作表
Paste 方法 无 将剪贴板中的内容粘贴到工作表中
PasteSpecial 方法 无 以指定的格式将剪贴板中的内容粘贴到工作表中
Protect 方法 无 设置工作表的保护状态
SaveAs方法 无 将工作表保存到其他工作簿中
Select 方法 无 选择工作表
常用操作
代码窗口中,输入完对象的方法名称后按空格,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表示普通工作表的集合
属性
Visible 属性 Variant 设置或返回工作表是否可见
方法
Add 方法 Object 新建一个工作表
Copy方法 无 复制工作表
Delete 方法 无 删除工作表
Move 方法 无 移动工作表
Select 方法 无 选择工作表
单元格

Range
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
常用属性
Address 属性 String 返回单元格或单元格区域的地址
Cells 属性 Range 返回单元格区域内的所有单元格
Count 属性 Long 返回单元格区域中的单元格总数
Column 属性 Long 返回单元格区域中第一列的列号
Columns 属性 Range 返回单元格区域中的所有列
Row 属性 Long 返回单元格区域中第一行的行号
Rows 属性 Range 返回单元格区域中的所有行
CurrentRegion 属性 Range 返回周围由空行空列包围的单元格区域
End 属性 Range 返回单元格区域边界的单元格
Font 属性 Font 返回包含单元格区域中文本字体选项的对象
Name 属性 Variant 设置或返回单元格或单元格区域的名称
Offset 属性 Range 返回在指定区域的基础上经过偏移后的新区域
Resize 属性 Range 返回对指定区域进行行、列扩展后的新区域
Text 属性 String 返回单元格中包含数值格式的内容
Value 属性 Variant 返回单元格中不包含数值格式的内容
其它
Areas 属性 Areas 返回当前选择的多个不连续区域的区域集合
CountLarge 属性 Variant 返回单元格区域中的单元格总数,比Count具有更大的数值范围
EntireColumn 属性 Range 返回单元格区域占用的整列
EntireRow 属性 Range 返回单元格区域占用的整行
Formula属性 Variant 设置或返回单元格中的公式
MergeArea Variant 返回包含指定单元格的合并区域
MergeCells 属性 Variant 设置或返回单元格区域是否包含合并单元格
NumberFormat 属性 Variant 设置或返回与单元格区域相关的数值格式
WrapText 属性 Variant 设置或返回单元格中的文本是否自动换行
方法

单元格方法
条件定位
specialcells

语法

案例1
 
案例2
 
类似于查找
筛选
AutoFilter
 
按列筛选
案例1

案例2
Sub拆分工作簿2() Dim x As Byte,f As Range,wb As Workbook Range("a2",Cells(Rows.Count,1).End(xlUp)).Copy [hl] Range("h:h").RemoveDuplicates Columns:=1,Header:=xlNo x = Application.WorksheetFunction.CountA([h:h]) Do y =y+1 Range("al").AutoFilter 1,Cells(y,"h") Set f =Range("al").CurrentRegion Set wb=Workbooks.Add f.Copy wb.Sheets(1).[al] wb.SaveAs ThisWorkbook.Path & ”\” &ThisWorkbook.Sheets(1).Cells(y,"h") wb.Close Loop Until y =x Sheet1.AutoFilterMode =False [h:h].Delete End Sub
自动填充
AutoFill
 
案例
Sub test() Range("f2") = 1 Range("f3") = 2 Range("f2:f3").AutoFill Range("f2:f20") End Sub 
替换
Replace

示例

InStr 也有相同作用
案例
Sub test() 'Range("c1:f5").Replace what:="excel", replacement:="快学excel" 'Range("c1:f5").Replace what:="vba", replacement:="快学vba", MatchCase:=True 'Range("c1:f5").Replace what:="南昌", replacement:="南昌市", lookat:=True 'Range("c1:f5").Replace what:="love", replacement:="*", matchbyte:=True Application.ReplaceFormat.Interior.ColorIndex = 3 Range("c1:f5").Replace what:="ppt", replacement:="word", ReplaceFormat:=True End Sub Sub test1() Application.FindFormat.Interior.ColorIndex = 3 Application.ReplaceFormat.Interior.ColorIndex = 5 Range("c1:f5").Replace what:="", replacement:="", SearchFormat:=True, ReplaceFormat:=True End Sub 
Activate 方法 Boolean 激活一个单元格
AutoFilter 方法 Variant 创建对单元格区域的自动筛选
AutoFit 方法 Variant 根据单元格中的文本量自动调整单元格的大小
Clear 方法 Variant 清除单元格中的所有内容
ClearContents 方法 Variant 清除单元格中的公式和值
ClearFormats 方法 Variant 清除单元格中的格式
Copy 方法 Variant 复制单元格到指定的位置
Find 方法 Range 在指定区域内进行查找操作
FindNext 方法 Range 查找下一个符合条件的内容
Select 方法 Variant 选择单元格或单元格区域
PasteSpecial方法 Variant 对数据进行选择性粘贴
Sort方法 Variant 排序单元格区域中的数据
SpecialCells 方法 Range 返回单元格区域中符合指定条件的一个或多个单元格
Replace方法 Boolean 在指定区域内进行替换操作
Merge 方法 无 合并单元格
Subtotal 方法 Variant 分类汇总单元格区域中的数据
UnMerge 方法 无 拆分合并的单元格
常用方法
activate 活动的
copy 复制
PasteSpecial xlPasteValues 粘贴值
需写成两行,写一行需要在copy后面加 :
delete 删除
clear 清除
cleear contents 清除值
clear comments 清除注释
clear formats 清除格式
Cut 移动
Select 选择
Selection 当前选上的单元格(区域)
其他操作
引用整行
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+下方向键>
输入/输出
inputbox 输入
msgbox 输出
其他常见对象
名称
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
变量
 
声明数据类型的方式

数据类型的种类

数组
 
数组函数
UBound
Sub test() Dim arr(1 To 5, 2 To 6) MsgBox UBound(arr) '返回数组第一维的上界(最大下标) MsgBox UBound(arr, 2) '返回数组第二维的上界(最大下标) MsgBox LBound(arr, 2) '返回数组第二维的下界(最小下标) End Sub Sub 转置() Dim arr(), brr(1 To 6 * 100, 1 To 3) arr = Range("a1").CurrentRegion For i = 2 To UBound(arr) For j = 2 To UBound(arr, 2) n = n + 1 brr(n, 1) = arr(i, 1) '姓名 brr(n, 2) = arr(1, j) '科目 brr(n, 3) = arr(i, j) '成绩 Next j Next i [i2].Resize(UBound(brr), 3) = brr End Sub
Application.Transpose
Application[.WorksheetFunction].Transpose 转制 一维变二维 二维变一维 行变列 列变行
Split

案例
Sub 拆分1() Dim a As String a = "你好,欢迎学习,VBA" arr = Split(a, ",") For i = LBound(arr) To UBound(arr) MsgBox arr(i) Next i End Sub Sub 拆分2() Dim a As String a = "你好 欢迎学习 VBA" arr = Split(a) For i = LBound(arr) To UBound(arr) MsgBox arr(i) Next i End Sub Sub 拆分3() Dim a As String a = "你好/欢迎/学习/VBA" arr = Split(a, "/", 3) For i = LBound(arr) To UBound(arr) MsgBox arr(i) Next i End Sub Sub 拆分4() Dim a As String a = "111n222N333n444N555" arr = Split(a, "n") For i = LBound(arr) To UBound(arr) MsgBox arr(i) Next i End Sub
案例2
Sub test() arr = WorksheetFunction.Transpose(Range("a1").CurrentRegion) ReDim arr1(1 To UBound(arr)) For Each i In arr y = y + 1 arr1(y) = Split(i) Next i arr1 = Application.Transpose(Application.Transpose(arr1)) Range("b1").Resize(UBound(arr1), 1) = arr1 [b:b].RemoveDuplicates Columns:=1 End Sub 
Join
案例
Sub test() Dim arr(), t$ arr = Array(1, 2, 3, 4, 5, 6) t = Join(arr, "/") End Sub Sub test1() arr = WorksheetFunction.Transpose(Range("a1").CurrentRegion) For i = 1 To UBound(arr) brr = Split(arr(i), "-") For j = 0 To UBound(brr) brr(j) = brr(j) + 1 Next j arr(i) = Join(brr, "-") Next i Range("b1").Resize(UBound(arr), 1) = WorksheetFunction.Transpose(arr) End Sub 
Filter

案例
Sub test1() arr = Array("a", "ab", "c", "d", "e") brr = Filter(arr, "a") MsgBox Join(brr) End Sub Sub test2() arr = Array("a", "ab", "c", "d", "e") brr = Filter(arr, "a", False) MsgBox Join(brr) End Sub Sub test3() arr = Array("a", "Ab", "c", "d", "e") brr = Filter(arr, "a", , 1) MsgBox Join(brr) End Sub
案例2
Sub 拆分工作簿() Dim bt As Range, arr() Set bt = [a1:E3] '1、把数组合并成字符串,然后写入数组arr For Each ss In Range("a4", [a4].End(xlDown)) n = n + 1 ReDim Preserve arr(1 To n) arr(n) = Join(Application.Transpose(Application.Transpose(ss.Resize(1, 5))), "/") Next ss Range("a4", [a4].End(xlDown)).Copy [g1] [g:g].RemoveDuplicates Columns:=1 h = Application.CountA([g:g]) For x = 1 To h pm = Cells(x, "g") brr = Filter(arr, pm) '筛选字符串 ReDim crr(1 To UBound(brr) + 1) For Each ar In brr k = k + 1 crr(k) = Split(ar, "/") '拆分字符串 Next ar Workbooks.Add bt.Copy [a1] [a4].Resize(k, 5) = Application.Transpose(Application.Transpose(crr)) ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & pm ActiveWorkbook.Close k = 0 Next x [g:g].Delete MsgBox "拆分完毕" End Sub 
Erase
清空数组 Erase brr '清空数组
声明数组的方法
 
赋值
Array(1,2,3,5,6,7,8,9)
动态数组
 
工作表函数在数组中的使用
Sub test() On Error Resume Next arr = Range("a1").CurrentRegion brr = WorksheetFunction.Index(arr, 0, 1) brr = WorksheetFunction.Transpose(brr) r = WorksheetFunction.Match([j1], brr, 0) If r > 0 Then [i4:o4] = WorksheetFunction.Index(arr, r, 0) Else MsgBox "未查询到记录" End If End Sub
去除空值
Sub test() ar = [a1:a10] arr = Split(Application.Trim(Join(Application.Transpose(ar)))) [b1:b6] = Application.Transpose(arr) End Sub
解析
Sub 解析() Dim ar, arr arr = Application.Transpose([a1:a10]) t = Join(arr) MsgBox Len(t) t = Application.Trim(t) MsgBox Len(t) arr = Split(t) [b1:b6] = Application.Transpose(arr) End Sub 
去除重复项
案例
Sub test() [a2:a21].Copy [c1] [c:c].RemoveDuplicates Columns:=1 End Sub 
集合

工作簿集合
工作表集合
单元格集合
集合和数组的区别

字典
dictionary

关键字具有唯一性
前期绑定和后期绑定
前期绑定创建字典

后期绑定代码
CreateObject ("scripting.dictionary")
案例

六个方法和四个属性
 
正则表达式
元字符
元字符 \d 匹配所有单个数字(可以代替[0-9],但不能取代) \D 匹配单个数字以外的字符(包括字母,汉字,空格,下划线,各类符号。可以替代[a-zA-Z],但不能取代) [一-龢]或[\u4E00-\u9FA5]只匹配汉字 \w 匹配单个字母、汉字、数字、和_ \W 匹配任何非单词字符(包括空格,各类符号,但不能识别下划线) \s 匹配任何空白字符(空格、制表符、换行符等,眼睛看不到的) \S 匹配任何非空白字符(眼睛能看到的) \n 匹配一个换行符 \r 匹配一个回车符 \t 匹配一个制表符(Tab键) . 匹配除 "\n" 之外的任何单个字符 \b 匹配一个字母和空格的位置(不支持汉字) \B 匹配非字母与空格的位置(跟\b相反) 如果想表示其本身去除\ .加上\
量词

表达式
Sub 提取数字() Dim ss As Range, sj, n Set reg = CreateObject("vbscript.regexp") '创建正则表达式引用并赋值给变量reg With reg .Global = True '全局匹配,默认为false .Pattern = "\d+" '指定匹配模式,引号内写正则表达式 For Each ss In Range("a2", Cells(Rows.Count, 1).End(xlUp)) Set sj = .Execute(ss) '对()内的字符执行正则表达式搜索 For Each ss1 In sj n = n + 1 ss.Offset(0, n) = ss1 Next ss1 n = 0 Next ss End With End Sub
程序
程序构成
模块
过程
代码
对象
对象.属性
对象.方法
实例:宏的录制
设置快捷键
指定按钮
指定常用工作栏按钮
设置安全级别
编程环境VBE
勘误 S2 p27 2.3 l1 basice应为basic
进入编辑器
Alt+F11
开发工具—Visual Basic
右键工作表标签—查看代码
开发工具—查看代码
主窗口
工程资源管理器
Excel对象
窗体对象
模块vs类模块
概念
保存VBA代码
创建特定的类或对象
建立后名称
模块1、模块2...
类1、类2...
属性窗口
代码窗口
立即窗口
菜单栏
工具栏
简单操作
模块添加与移除
编写程序
帮助
代码调试与优化
错误
编译错误
运行错误
逻辑错误
错误代码查询
3 无GoSub返回
5 无效的过程调用或参数
6 溢出
7 内存溢出
9 下标越界
10 该数组被固定或暂时锁定
11 除数为零
13 类型不匹配
14 溢出串空间
16 表达式太复杂
17 不能执行所需的操作
18 出现用户中断
20 无错误恢复
28 溢出堆栈空间
35 子过程或函数未定义
47 DLL应用程序客户太多
48 加载DLL错误
49 DLL调用约定错误
51 内部错误
52 文件名或文件号错误
53 文件未找到
54 文件模式错误
55 文件已打开
57 设备I/O错误
58 文件已存在
59 记录长度错误
61 磁盘已满
62 输入超出文件尾
63 记录号错误
67 文件太多
68 设备不可用
70 拒绝的权限
71 磁盘未准备好
74 不能更名为不同的驱动器
75 路径/文件访问错误
76 路径未找到
91 对象变量或With块变量未设置
92 For 循环未初始化
93 无效的模式串
94 无效使用Null
96 由于对象已经激活了事件接收器支持的最大数目的事件,不能吸收对象的事件
97 不能调用对象的友元函数,该对象不是所定义类的一个实例
98 属性或方法调用不能包括对私有对象的引用,不论是作为参数还是作为返回值
321 无效文件格式
322 不能创建必要的临时文件
325 资源文件中格式无效
380 无效属性值
381 无效的属性数组索引
382 运行时不支持 Set
383 (只读属性)不支持 Set
385 需要属性数组索引
387 Set 不允许
393 运行时不支持 Get
394 (只写属性)不支持 Get
422 属性没有找到
423 属性或方法未找到
424 要求对象
429 ActiveX部件不能创建对象
430 类不支持自动化(Automation)或不支持期待的接口
432 自动化(Automation)操作时文件名或类名未找到
438 对象不支持该属性或方法
440 自动化(Automation)错误
442 远程进程到类型库或对象库的连接丢失。按下对话框的[确定]按钮取消引用
443 Automation对象无缺省值
445 对象不支持该动作
446 对象不支持命名参数
447 对象不支持当前的本地设置
448 未找到命名参数
449 参数不可选
450 错误的参数号或无效的属性赋值
451 propertylet 过程未定义,property get 过程未返回对象
452 无效的序号
453 指定的 DLL函数未找到
454 代码资源未找到
455 代码资源锁定错误
457 该关键字已经与该集合的一个元素相关联
458 变量使用了一个Visual Basic不支持的自动化(Automation)类型
459 对象或类不支持的事件集
460 无效的剪贴板格式
461 方法和数据成员未找到
462 远程服务器不存在或不可用
463 类未在本地机器上注册
481 无效的图片
482 打印机错误
735 不能将文件保存到TEMP
744 要搜索的文本没有找到
746 替换文本太长
1004 应用程序定义或对象定义错误
程序状态
设计模式
运行模式
中断模式
调试工具
中断模式
运行错误
编译错误
中断执行
断点设置
Stop语句
立即窗口
本地窗口
监视窗口
错误处理
Go Error GoTo标签
On Error Resume Next
On Error GoTo 0
加快代码运行速度
变量设置
声明变量为合适数据类型
尽量不适用Variant型数据
避免变量一直存在内存中
避免反复引用相同对象
with语句简化
使用变量简化引用对象
尽量使用函数
去掉多余激活和选择
合理使用数组
关闭屏幕更新
用户界面设计
控件
窗体控件:只能在工作表中通过设置格式或指定宏使用,多做编辑数据 ActiveX控件:可以在工作表和用户窗体中使用,多在编辑数据同时做其他操作
窗体控件
标签
用于输入和显示静态文本
分组框
用于组合其他多个控件
按钮
用于执行宏命令
复选框
选择控件,可以多项选择
选项按钮
选择,通常几个选项按钮用组合框合在一起使用,只能同时选择其中之一
列表框
显示多个选项列表,可以从中选择之一
组合框
提供可选择的多个选项,可以选择其中之一
滚动条
包括水平和垂直
微调控件
单击控件的箭头选择数值
ActiveX控件
用户交互
InputBox函数
InputBox(Prompt【对话框上提示文字】, Title【对话框标题,默认为MicrosoftExcel】,Default【默认输入值,缺省为空】, xpos【对话框左端与屏幕左端距离,默认在水平方向居中显示】, ypos【对话框顶端与屏幕顶端距离,默认在屏幕高度三分之一位置】) '除prompt参数,参数名可省略
Application对象的InputBox方法
MsgBox函数
显示按钮
显示图标样式
缺省按钮
对话框类型
返回值
Application对象的FindFile方法
Application对象的GetOpenFilename方法
Application对象的GetSaveAsFilename方法
Application对象的FileDialog方法
用户窗体
添加窗体
窗体属性
添加窗体内控件
显示窗体
手动
代码
模式
关闭窗体
手动
代码
使用控件
初始化窗体
命令按钮
数据录入
键盘控制控件
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
实例:典型技巧
快速录入数据
快速寻找数据
自动保存文件
类事件编程
在模块中编程
nokey方法
自定义快捷键 
按键代码
  
案例
 新建工作表并命名
在所有活动工作簿中有效
不需要使用时,将第二参数取消
beforeclose事件也可关闭
notime方法
 参数1、2为必选
定时执行
案例1

案例2

案例3

事件编程
 
worksheet对象的事件列表

workbook对象的事件列表
open事件
Private Sub Workbook_Open() Sheets(1).Select End Sub 在打开此工作簿时,将首先显示“sheets(1)”工作表。
beforeclose时间

案例1
 vbYesNo 是指定按钮类型,提示的按钮是yes和no两个 cancel是过程的参数,确定是否关闭工作簿,fasle时关闭,true时不关闭
案例2
 if用于判断当前工作簿是否保存
beforesave事件
案例
 保存当前工作表时,自动插入时间。
sheetchange事件
Application.EnableEvents = false/true 以上代码可以打开或关闭事件 
公式与函数
内置函数
信息函数

数学函数

rna生成随机数

int是取整函数
案例
Sub 生成随机数() Dim ss As Range For Each ss In Range("b2:b50") ss = Int((99 - 55 + 1) * Rnd + 55) Next ss End Sub
文本函数

日期和时间函数

数据类型转换函数

函数
A
Abs 返回一个数的绝对值
Array 返回一个包含数组的变量
Asc 将字符串中的第一个字符转换为其ASCII值
Atn 返回一个数的正切值
C
CallByName 执行一个对象的方法,或设置或返回一个对象的属性
CBool 将表达式转换为Boolean数据类型
CByte 将表达式转换为Byte数据类型
CCur 将表达式转换为Currency数据类型
CDate 将表达式转换为Date数据类型
CDbl 将表达式转换为Double数据类型
CDec 将表达式转换为Decimal数据类型
Choose 选择并返回参数列表中的某个值
Chr 将字符代码转换为与其对应的字符串
CInt 将表达式转换为Integer数据类型
CLng 将表达式转换为Long数据类型
Cos 返回一个数的余弦值
CreateObject 创建并返回一个OLE自动化对象
CSng 将表达式转换为Single数据类型
CStr 将表达式转换为String数据类型
CurDir 返回当前的路径
CVar 将表达式转换为Variant数据类型
CVDate 将表达式转换为 Variant数据类型的Date,并非是真正的Date数据类型,不建议使用
CVErr 返回对应于错误编号的用户定义错误值
D
Date 返回当前的系统日期
DateAdd 为某个日期添加时间间隔
DateDiff 返回两个日期的时间间隔
DatePart 返回日期的指定时间部分
DateSerial 根据给定的表示年、月、日的数字,返回对应的日期
DateValue 将字符串转换为日期
Day 返回指定日期中的天
DDb 返回一笔资产在一段时间内的折旧
Dir 返回与模式匹配的文件或文件夹的名称
DoEvents 转让控制权以便让操作系统处理其他任务
E
Environ 返回一个操作系统环境的字符串
EOF 如果到达文本文件的末尾则返回 True
Error 返回对应于错误编号的错误消息
Exp 返回自然对数底(e)的某次方
F
FileAttr 返回文本文件的文件模式
FileDateTime 返回创建文件或最后一次修改文件时的日期和时间
FileLen 返回文件中的字节数
Filter 返回指定筛选条件下的一个字符串数组的子集
Fix 返回一个数的整数部分
Format 以指定的格式显示给定的表达式
FormatCurrency 返回用系统货币符号格式化后的表达式
FormatDateTime 返回格式化为日期或时间的表达式
FormatNamber 返回格式化为数值的表达式
FormatPercent 返回格式化为百分数的表达式
FroeFile 返回用于打开文本文件的下一个可用的文件号
FV 返回年金终值
G
GetAlISettings 返回Windows注册表中与应用程序相关的所有设置项及其对应值
GetAttr 返回文件或文件夹的属性信息
GetObject 返回文件中的OLE 自动化对象
GetSetting 返回Windows注册表中应用程序特定项的设置
H
Hex 将十进制数转换为十六进制数
Hour 返回时间中的小时
I
IIf 根据表达式的真假返回对应的部分
Input 返回顺序文本文件中指定个数的字符
InStr 返回一个字符串在另一个字符串第一次出现的位置
InStrRev 从字符串的末尾算起,返回一个字符串在另一个字符串第一次出现的位置
Int 返回一个数的整数部分
IPmt 返回在一段时间内对年金所支付的利息值
IRR 返回一系列周期性现金流的内部利率
IsArray 当变量为数组时返回True
IsDate 当变量为日期时返回True
IsEmpty 当变量未被初始化时返回 True
IsError 当变量为错误值时返回 True
IsMissing 如果没有向过程传递可选参数则返回 True
IsNull 当变量含有Null值时返回 True
IsNumeric 当变量是一个数值时返回True
IsObject 当变量引用了一个OLE 自动化对象时返回 True
J
Join 将包含在数组中的多个字符串连接起来
L
LBound 返回数组的下限
LCase 将英文字母转换为小写
Left 返回字符串左侧指定数量的字符
Len 返回字符串的字符数量
Loc 返回当前文本文件的读/写位置
lOF 返回打开的文本文件的字节数
Log 返回一个数的自然对数
LTrim 返回没有前导空格的字符串
M
Mid 从一个字符串的指定位置开始提取指定数量的字符
Minute 返回时间中的分钟
MIRR 返回一系列修改过的周期性现金流的内部利率
Month 返回日期中的月份
MonthName 返回指定月份的字符串形式
MsgBox 显示模态消息对话框,返回一个 Integer 数值告诉用户单击了哪个按钮
N
Now 返回当前的系统日期和时间
NPer 返回年金总期数
NPV 返回投资净现值
O
Oct 将十进制数转换为八进制数
P
Partition 返回代表值写入的单元格区域的字符串
Pmt 返回年金支付额
PPmt 返回年金的本金偿付额
PV 返回年金现值
Q
QBColor 返回红/绿/蓝(RGB)颜色码
R
Rate 返回每一期的年金利率
Replace 返回一个字符串,该字符串中指定的子字符申被替换成另一个子字符串
RGB 返回代表RGB颜色值的数值,每个颜色分量的取值范围都是0-255
Right 返回字符串右侧指定数量的字符
Rnd 返回0~1之间的某个随机数
Round 返回四舍五入后的数值
RTrim 返回没有尾随空格的字符串
S
Second 返回时间中的秒数
Seek 返回文本文件中当前的读/写位置
Sgn 返回代表数值正负的整数
Shell 运行可执行的程序,如果成功则返回该程序的任务ID
Sin 返回一个数的正弦值
SLN 返回一期里一项资产的直线折旧
Space 返回包含指定空格数的字符串
Spc 对要打印的文件进行输出定位
Split 返回一个下标从零开始的一维数组,它包含指定数目的子字符串
Sqr 返回一个数的平方根
Str 返回一个数值的字符串形式
StrComp 返回代表两个字符串比较结果的值
StrConv 返回按指定类型转换后的字符串
String 返回指定长度的重复字符
StrReverse 返回顺序方向的字符串
Switch 计算一组 Boolean 表达式的值,返回与第一个为True的表达式关联的值
SYD 返回某项资产在一指定期间用年数总计法计算的折旧
T
Tab 对要打印的文件进行输出定位
Time 返回当前的系统时间
Timer 返回从午夜开始到现在所经过的秒数
TimeSerial 根据给定的表示时、分、秒的数字,返回对应的时间
TimeValue 将字符串转换为时间
Trim 返回不包含前导空格和尾随空格的字符串
TypeName 返回代表变量数据类型的字符串
Tan 返回一个数的正切值
U
UBound 返回数组的上限
UCase 将英文字母转换为大写
V
Val 返回包含于字符串内的数字。在它不能识别为数字的第一个字符上停止读入字符串
VarType 返回代表变量子类型的数值
W
Weekday 返回代表星期几的数值
WeekdayName 返回代表星期几的字符串
Y
Year 返回日期中的年份
常用vba函数
vba函数
参数
 
参数与变量的区别

Dir 遍历文件

第二参数

一般搭配 do loop until 使用
案例
Sub test1() Dim ss$ ss = Dir("D:\Desktop\VBA1-56\演示文件夹\*写真*.*") Do n = n + 1 Cells(n, 1) = ss ss = Dir Loop Until ss = "" End Sub 
InStr

搜索一个字符串在另一个字符串中的位置
查询方向:从左往右
可用来替换
可判断是否包含
区分大小写
案例
Sub test() Dim ss As Range, ss1 As Range For Each ss In Range("f2", Cells(Rows.Count, "f").End(xlUp)) For Each ss1 In Range("d2", Cells(Rows.Count, "d").End(xlUp)) If InStr(ss1, ss) > 0 Then n = n + 1 End If Next ss1 ss.Offset(0, 1) = n n = 0 Next ss End Sub 
InStrRev
查询 同InStr
查询方向:从右往左
返回的位数还是同InStr
mid
提取函数
Byval参数声明
Target

columns
选择列

entirecolumn
属性,用于选择整列
autofit
自动调整列宽
并集
union

案例1

案例2
Sub test() Dim ss As Range,ssl As Range For Each ss In Range("c2",Cells(Rows.Count,3).End(xlUp)) If ss.Value >=5000 Then If ssl Is Nothing Then Set ssl=ss.Offset(0,-2).Resize(1,3) Set ssl =Union(ssl,ss.Offset(0,-2).Resize(1,3)) End If Next ss ss1.Copy [gl] ssl.Interior.ColorIndex =3 MsgBox ss1.Count /3 MsgBox Application.WorksheetFunction.Sum(Intersect(ssl,[c:c])) MsgBox Application.WorksheetFunction.Average(Intersect(ssi,[c:c])) End Sub 
相当于多选单元格
交集
intersect

案例
Sub test() Dim ss As Range,ssl As Range For Each ss In Range("c2",Cells(Rows.Count,3).End(xlUp)) If ss.Value >=5000 Then If ssl Is Nothing Then Set ssl=ss.Offset(0,-2).Resize(1,3) Set ssl =Union(ssl,ss.Offset(0,-2).Resize(1,3)) End If Next ss ss1.Copy [gl] ssl.Interior.ColorIndex =3 MsgBox ss1.Count /3 MsgBox Application.WorksheetFunction.Sum(Intersect(ssl,[c:c])) MsgBox Application.WorksheetFunction.Average(Intersect(ssi,[c:c])) End Sub 
案例2
 判断用户当前所选择的单元格和指定的单元格区域是否有交集, 以确定接下来的操作。
RandBetween
生成随机数

Mod
计算除数余数 a Mod b
工作表函数
公式

利用单元格公式返回值
Evalutate

借用工作表函数

利用VBA函数

语句
判断
if语句

用于单条件判断
语法结构: if 条件 then 成立的结果 else 不成立的结果 end if
案例
Sub test4() Dim n As Byte n = InputBox("请输入你的分数") If n >= 60 Then MsgBox "及格" Else MsgBox "不及格" End If End Sub
嵌套

elseif语句
用于多条件判断
语法结构: If 条件1 then 成立的结果1 Elseif 条件2 then 成立的结果2 Elseif 条件3 then 成立的结果3 Else 不成立的结果 enf if
案例
Sub 判断2() If Range("f2") >= 15000 Then Range("g2") = "贵宾" ElseIf Range("f2") >= 10000 Then Range("g2") = "高级" ElseIf Range("f2") >= 5000 Then Range("g2") = "中级" Else Range("g2") = "普通" End If End Sub
多选一
select case语句

用于多条件判断
语法结构: select case 需要参照的标准 case is 条件1 成立的结果1 case is 条件2 成立的结果2 case is 条件3 成立的结果3 ... ... case else 不成立的结果 end select
案例1

多选一
IIF

循环

限定次数的循环
for
 
多变量嵌套
Sub test() Dim n%, y%, x% For n = 1 To 3 ' MsgBox "外层循环第" & n & "次" For y = 1 To 10 ' MsgBox "内层循环第" & y & "次" x = x + 1 Next y Next n MsgBox "内层循环代码被执行了" & x & "次" End Sub
嵌套案例
Sub test() Dim n%, y% For n = 2 To 26 For y = 2 To 8 Step 2 If Cells(n, y) < 60 Then Cells(n, y).Interior.ColorIndex = 3 End If Next y Next n End Sub
Step 步长
Sub test() Dim n%, cj% For n = 4 To 52 Step 4 cj = cj + Cells(n, 3) Next MsgBox "英语成绩的总和为" & cj & "分" End Sub
案例
Sub test() Dim n% For n = 2 To 19 If Cells(n, 2) < 60 Then Cells(n, 2).Interior.ColorIndex = 3 End If Next End Sub
for each循环
  在数组中执行循环时,不能对其中元素进行赋值或重新赋值 对已经赋值的对象也只能修改元素属性 ---------------------------------- For Each 元素变量 In 集合名称或数组名 '如是集合,元素变量定义为相应对象类型 如是数组,元素变量定义为Variant类型 [Exit For] Next [元素变量] '遍历集合或数组中每个元素,无论集合或数组里有多少原素, 总是从第一个开始,直到最后一个,然后退出循环
案例
Sub test() Dim n%, cj% For n = 4 To 52 Step 4 cj = cj + Cells(n, 3) Next MsgBox "英语成绩的总和为" & cj & "分" End Sub
案例2
Sub test() Dim s As Range For Each s In Sheets("2").UsedRange MsgBox s Next End Sub
案例3
Sub test3() Dim ss As Range, n% For Each ss In Range(Sheet1.[b2], Sheet1.Cells(Rows.Count, 2).End(xlUp)) n = n + 1 If ss.Value = "男" Then Worksheets.Add(after:=Sheets(Sheets.Count)).Name = Sheet1.Cells(n + 1, 1) End If Next ss End Sub 
Do loop 无限循环

案例
Sub test() Dim n As Date On Error Resume Next Do n = InputBox("输入我的生日(yyyy/mm/dd)") If n = [d1] Then MsgBox "回答正确,爱你哦,么么哒" Exit Do Else MsgBox "我的生日都忘了,你完蛋了,重新回答" End If Loop End Sub
do while循环 和do until循环
 开头判断式 Sub 过程名() Do [Until 逻辑表达式] '为False,执行循环体,否则执行Loop后语句 [Exit Do] [循环体] Loop End Sub ------------------------------------ 结尾判断式 Do [Exit Do] [循环体] Loop [Until 逻辑表达式] '为False,返回Do执行循环体,否则执行Loop后语句
带条件循环

案例

先判断再执行

先执行再判断
案例1
Sub test() Dim n%, i% n = 2 Do MsgBox Cells(n, 3) If Cells(n, 3) = 100 Then Cells(n, 3).Interior.ColorIndex = 3 i = i + 1 End If n = n + 1 Loop Until i = 3 End Sub 
案例2

要加入退出条件

动态数据区域
End

中间不能有断连
案例
Sub test() Dim n%, y% x = Range("a1").End(xlToRight).Column h = Range("a1").End(xlDown).Row For n = 2 To h For y = 2 To x Step 2 If Cells(n, y) < 60 Then Cells(n, y).Interior.ColorIndex = 3 End If Next y Next n End Sub
UsedRange

案例
Sub test() Dim n%, y% x = ActiveSheet.UsedRange.Columns.Count h = ActiveSheet.UsedRange.Rows.Count For n = 2 To h For y = 2 To x Step 2 If Cells(n, y) < 60 And Cells(n, y) <> "" Then Cells(n, y).Interior.ColorIndex = 3 End If Next y Next n End Sub
CurrentRegion

案例
Sub test() Dim n%, y% x = Range("a1").CurrentRegion.Columns.Count h = Range("a1").CurrentRegion.Rows.Count For n = 2 To h For y = 2 To x Step 2 If Cells(n, y) < 60 Then Cells(n, y).Interior.ColorIndex = 3 End If Next y Next n End Sub
offset

案例
Sub test3() Dim ss As Range For Each ss In Range(Sheet1.[b2], Cells(Rows.Count, 2).End(xlUp)) If ss.Value = "男" Then Worksheets.Add(after:=Sheets(Sheets.Count)).Name = ss.Offset(0, -1) End If Next ss End Sub 
Resize

案例
Sub test1() Dim ss As Range For Each ss In Range("c2", Cells(Rows.Count, 3).End(xlUp)) If ss.Value < 60 Then ss.Offset(0, -2).Resize(1, 3).Interior.ColorIndex = 3 End If Next ss End Sub
Exit

案例1
Sub test1() For i = 1 To 10 For x = 1 To 5 If x = 3 Then Exit Sub Next x Next i End Sub
案例2
Sub test() Dim n%, i%, x% Range("e2", Cells(2, "g").End(xlDown)).Clear n = Cells(Rows.Count, 1).End(xlUp).Row For i = n To 2 Step -1 If Cells(i, 2) = "牛肉" Then x = x + 1 If x <= 3 Then Cells(i, 2).Offset(0, -1).Resize(1, 3).Copy Cells(Rows.Count, "e").End(xlUp).Offset(1, 0) Else Exit For '改sub不运行 msgbox的话 End If End If Next i MsgBox "已为你找到最后三次的采购单价" End Sub 
row 和rows的区别

案例
Sub test() Dim n%, y% x = Range("a1").End(xlToRight).Column h = Range("a1").End(xlDown).Row For n = 2 To h For y = 2 To x Step 2 If Cells(n, y) < 60 Then Cells(n, y).Interior.ColorIndex = 3 End If Next y Next n End Sub
跳转语句
Go To
 目标代码所在行前,加上带冒号字符串或不带冒号数字作为标签 除非必须,应尽量避免使用
案例
Sub test() Dim n As Date On Error Resume Next '当代码运行错误时忽略,继续向下运行 Do n = InputBox("输入我的生日(yyyy/mm/dd)") If Err.Number <> 0 Then MsgBox "你输入的格式有误!!!": GoTo 100 If n = [d1] Then MsgBox "回答正确,爱你哦,么么哒" Exit Do Else MsgBox "我的生日都忘了,你完蛋了,重新回答" End If 100: Err.Clear Loop End Sub
引用语句
引用工作表函数
Application.WorksheetFunction.AverageIf
WorksheetFunction.CountIfs
案例
Sub test() [g2] = Application.WorksheetFunction.AverageIf([b:b], "女", [c:c]) [g3] = WorksheetFunction.CountIfs([b:b], "女", [c:c], ">=90") End Sub 
排序
Sort

案例
Sub 排序() Dim ss As Range Set ss = Range("j1").CurrentRegion ss.Sort Range("j1"), 1, Range("m1"), , 2, Header:=xlYes End Sub 
查询
find

案例
Sub test() MsgBox Range("c:c").Find("e", , xlValues, 1, , 2, 1).Address(0, 0) End Sub 
案例2
Sub 生成选手名单() Dim xy%, y%, sj%, h%, p% p = Application.WorksheetFunction.CountA([c:c]) y = Application.WorksheetFunction.CountA([a:a]) hh = y - 1 - (p - 1) If hh < 8 Then MsgBox "没有足够人数生成小组": Exit Sub Do sj = Int((y - 2 + 1) * Rnd + 2) h = Cells(Rows.Count, 3).End(xlUp).Row Set ss = Range("c:c").Find(Cells(sj, 1)) If ss Is Nothing Then If xy = 0 And h <> 1 Then h = h + 1 Cells(h + 1, 3) = Cells(sj, 1) xy = xy + 1 End If Loop Until xy = 8 End Sub 
FindNext

案例
Sub test() Dim ss As Range, d$, fz As Range, zt As Range Range("f3:i1000000").Clear Set ss = Range("a:a").Find("*", , xlComments) d = ss.Address Do Set ss = Range("a:a").FindNext(ss) Set fz = ss.Resize(1, 4) Set zt = Cells(Rows.Count, "f").End(xlUp).Offset(1, 0) fz.Copy zt Loop Until ss.Address = d End Sub 
定位
SpecialCells

案例
Sub test() Range("c1:g11").SpecialCells(11).Select End Sub
案例2
Sub test1() Dim ss As Range, rng As Range Set ss = Range("a1").CurrentRegion.SpecialCells(xlCellTypeBlanks) For Each rng In ss rng.AddComment "缺考" rng.Comment.Shape.TextFrame.AutoSize = True rng.Comment.Visible = True Next rng End Sub 
命名
Name

案例
Sub tt() Name "D:\Desktop\VBA1-66Name语句\我的\2.xlsx" As "D:\Desktop\VBA1-66Name语句\123.xlsx" End Sub
MkDir

案例
Sub 新建2018年-2021年4个文件夹,然后每个文件夹下新建1-12个月子文件夹() For i = 2018 To 2021 MkDir ThisWorkbook.Path & "\" & i & "年" For y = 1 To 12 MkDir ThisWorkbook.Path & "\" & i & "年" & "\" & y & "月" Next y Next i End Sub
语句关键字
声明
Sub 声明一个子过程
Dim 声明变量及其数据类型
Enum 声明枚举类型
Event 声明一个用户定义的事件
Declare 声明对动态链接库DLL中外部过程的引用
Punction 声明一个函数过程
Option Compare 声明字符串的默认比较方式
Option Explicit 强制显式声明模块中的所有变量
Option Base 声明数组的默认下限
Option Private 指明当前模块是私有的
Private 声明模块级的私有变量
Property Get 声明一个获取属性值的过程
Property Let 声明一个给属性赋值的过程
Property Set 声明一个设置对象引用的过程
Public 声明一个公共变量
Static 声明静态变量,在程序运行期间始终保存该变量的值
Type 定义一个自定义数据类型
变量
DefBool 以指定字母开头的变量的默认数据类型设置为 Boolean
DefByte 以指定字母开头的变量的默认数据类型设置为 Byte
DefCur 以指定字母开头的变量的默认数据类型设置为 Cur
DefDate 以指定字母开头的变量的默认数据类型设置为 Date
DefDec 以指定字母开头的变量的默认数据类型设置为 Dec
DefDbl 以指定字母开头的变量的默认数据类型设置为 Dbl
Deflnt 以指定字母开头的变量的默认数据类型设置为Int
DefLng 以指定字母开头的变量的默认数据类型设置为 Lng
DefObi 以指定字母开头的变量的默认数据类型设置为 Obj
DefSng 以指定字母开头的变量的默认数据类型设置为 Sng
DefStr 以指定字母开头的变量的默认数据类型设置为 Str
DefVar 以指定字母开头的变量的默认数据类型设置为 Var
常量
Const 声明一个常量
逻辑
判断
If-Then-Else 按条件执行代码
Select Case 根据表达式的值,有条件的执行代码
循环
Do-Loop 当条件为 True 时,或直到条件变为 True 时,重复执行指定的代码
For Each-Next 对一个数组或集合中的每个元素重复执行指定的代码
For-Next 对指定的代码循环执行指定的次数
While-Wend 当条件为 True 时,重复执行指定的代码
错误
On Error 启动错误处理程序
操作
创建/激活/打开/初始化
AppActivate 激活一个应用程序窗口
MkDir 创建一个新的文件夹
Open 打开一个文本文件
Name 重命名一个文件或文件夹
Erase 重新初始化大小固定的数组的元素,以及释放动态数组的存储空间
Randomize 初始化随机数生成器
With 在一个对象上执行一系列代码,主要用于设置对象的多个属性和方法
赋值/写入/修改
Let 为变量或属性赋值
Print# 向顺序文本文件中写入数据
Put 将一个变量中的数据写入文本文件中
ReDim 修改动态数组的维度
SetAttr 修改一个文件的属性信息
Set 将对象引用赋值给一个变量或属性
Write# 向顺序文本文件中写入数据
读取/保存
Get 从文本文件中读取数据
Input# 从顺序文本文件中读取数据
Line Input# 从顺序文本文件中读取一行数据
SaveSetting 在Windows注册表中保存或创建应用程序记录
格式
LSet 将字符串变量中的字符串左对齐
RSet 将字符串变量中的字符串右对齐
Width# 设置文本文件的输出行宽度
跳转
Call 将控制权转移到另一个过程
ChDir 改变当前目录
ChDrive 改变当前驱动器
GoSub-Return 从一个过程跳转到另一个过程并执行代码,执行后返回到之前的过程
GoTo 跳转到指定的代码行
GoSub 根据条件跳转到指定的代码行
GoTo 根据条件跳转到指定的代码行
复制/替换
FileCopy 复制一个文件
Mid 使用其他字符替换字符串中的字符
暂停/关闭
Close 关闭一个文本文件
Reset 关闭所有打开的文本文件
Stop 暂停程序的执行
删除/退出
Kill 从磁盘中删除文件
RmDir 删除一个空文件夹
Unload 从内存中删除一个对象
End 退出指定的过程
Exit Do 退出一个Do-Loop循环
Exit For 退出一个For-Next 循环
Exit Function 退出一个函数过程
Exit Property 退出一个属性过程
Exit Sub 退出一个子过程
声音
Beep 通过计算机喇叭发出声音
时间/日期
Date 设置当前系统日期
Time 设置系统时间
错误
Error 模拟错误的发生
Resume 在错误处理程序结束后,恢复原有的运行
其它
Rem 对代码添加注释
Implements 指定将在类模块中实现的接口或类
Load 将对象加载到内存中,但不显示该对象
Lock,Unlock 对访问一个文本文件进行控制
RaiseEvent 引发一个用户定义的事件
Seek 设置文本文件中下一个读/写操作的位置
SendKeys 发送按键到活动窗口中
运算符

算术运算符

比较运算符

Like

案例
Sub test() Dim ss As Worksheet For Each ss In Worksheets If ss.Name Like "[a-zA-Z]####[一-龢][一-龢]" Then ss.Range("a1").CurrentRegion.Copy _ Sheets("汇总").Cells(Rows.Count, "a").End(xlUp).Offset(1, 0) End If Next ss End Sub 
参数中的通配符

注意事项

文本运算符

逻辑运算符

or

and

通配符

运算优先级
 
常用语句
调整单元格颜色
ss.Interior.ColorIndex = 3 '调整单元格颜色为红色
最后一行
Range("a2", Cells(Rows.Count, 1).End(xlUp))
动态获取单元格范围
CurrentRegion

案例
Range("a1").CurrentRegion.Rows.Count 获取总行数 With Sheets("开奖号").Range("a3").CurrentRegion '逐个复制需要转移的数据,只复制数据 Range("a3:v" & h).Value = .Value '将复制好的数据装入新的单元格区域 End With 复制单元格数据(不含格式)
resize
案例
Sub MyGetvalueResize0 With Sheet1.Range("A1").CurrentRegion Sheet3.Range("A1").Resize(.Rows.Count,Columns.Count).Value = Value End With End Sub
获取最大行号/列号
rows.count columns.count
调用其他sub
call xxx 从其他位置执行特定Sub过程 ------------ 过程名[参数1,参数2,...] ------------ Call 过程名[(参数1,参数2,...)] ------------ Application.Run 表示过程名的字符串(或字符串变量)[参数1,参数2,...]
Function.shcount
end
终止程序
打印(显示)结果
Debug.Print
格式
Format

FindFormat 查找格式
ReplaceFormat 替换格式
clear format 清除格式
一些技巧
动态获取数据区域
h = Range("b1").End(xlDown).Row 
查看颜色一共有多少种

动态整列
Range("b2", Cells(Rows.Count, 2).End(xlUp))
给单元格添加背景色
Range("c" & i).Interior.ColorIndex = 3
提高运算的方法
with语句

案例
Sub test() With Range("b3:e7") .Borders(xlInsideVertical).LineStyle = xlContinuous '列黑框 .Borders(xlInsideHorizontal).LineStyle = xlContinuous '行黑框 .Borders(xlEdgeLeft).LineStyle = xlContinuous '左边框 .Borders(xlEdgeTop).LineStyle = xlContinuous '上边框 .Borders(xlEdgeBottom).LineStyle = xlContinuous '下边框 .Borders(xlEdgeRight).LineStyle = xlContinuous '右边框 With .Font .Bold = True .Italic = True .Size = 12 End With End With End Sub
name语句

关闭屏幕刷新
Application.ScreenUpdating = False Application.ScreenUpdating = True
错误语句处理
On Error Resume Next '当代码运行错误时忽略,继续向下运行
生成随机数

案例
Sub test() Dim ss As Range For Each ss In Range("C2:C500") ss = Int((90 - 35 + 1) * Rnd + 35) Next ss End Sub
案例2
Sub test() Dim s1%, s2%, s3%, h% 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) n = n + 1 Loop Until h = [c2] Cells(s1, 1).Interior.ColorIndex = 3 Cells(s2, 1).Interior.ColorIndex = 3 Cells(s3, 1).Interior.ColorIndex = 3 MsgBox "循环了" & n & "次" End Sub 
重新定义数组并保留前值
Redim Preserve arr(1 to 3,1 to 5)
也可用于声明带变量数组
修改格式
Format(Now(),"yyyy-mm-dd")