导图社区 Excel VBA基本应用
Excel VBA基本应用思维导图,包括操作对象、常用语句结构、数据基础、对象的事件、Sub子程序过程、Function函数过程等内容。
编辑于2021-11-19 14:36:05Excel VBA基础应用
操作对象
工作簿对象
引用工作簿
Workbooks.Item("文件名称.扩展名"),Item可以省略
通过文件名称引用一个已经存在的文件,最好在文件名称中带上扩展名
对于未保存过的文件,无论系统是否设置显示扩展名,文件名称都不能带扩展名
打开工作簿
Workbooks.open Filename:="含路径的文件名称"
Filename:=可以省略,文件名称包含扩展名
关闭工作簿
Workbooks.Close savechanges:=True(或False)
savechanges:=可以省略,参数表示是否保存
新建工作簿
Workbooks.Add Template:="含路径的文件名称"
Template:=可以省略,参数表示以该文件作为模板新建工作簿
另存工作簿
文件名称.SaveAs Filename:="含路径的文件名称"
Filename:=可以省略,关闭原文件打开新文件
文件名称.SaveCopyAs "含路径的文件名称",保留原文件不打开新文件
获取工作簿信息
文件名称.Name,获取文件名称
文件名称.Path,获取文件路径
文件名称.FullName,获取带路径的文件名称
工作表对象
新建工作表
Worksheets.Add before(或after):=位置,count:=n
before(或after)指定新建工作表的位置,省略位于活动工作表之后
count新建工作表数量,注意参数名后使用“:=”
Worksheets.Add(after:=Sheet1).Name ="名称"
新建工作表并重命名,参数必须放在括号内
移动工作表
工作表名称.Move after(或before):=位置
before(或after)省略,工作表移动至新建工作簿
显示隐藏工作表
工作表名称.Visible=参数
xlSheetHidden或0或False:隐藏,可以取消隐藏
xlSheetVeryHidden或2:深度隐藏,仅VBE中取消隐藏
xlSheetVisible或1或True:可见或取消隐藏
单元格引用
引用单个单元格
[A1]:简便,不支持变量
Range("A1")或Range("A"&1):自带方法属性,支持变量
Cells(1,1)或Cells(1,"A"):运算效率高,支持变量
Range("B3:F9").Cells(2,3):返回区域中第2行与第3列交叉处单元格
工作表名称.Cells(2):返回工作表第2个单元格(B1),按“从左到右、从上到下”顺序
引用固定单元格区域
[A1:B10]:简便,不支持变量
Range("A1:B10")或Range("A"&1&":B"&10):繁琐,支持变量
Range("A1","B10")或Range(Cells(1,1),Cells(10,2)):少用,支持变量
Range("A1").Resize(10,2):常用,搭配数组,支持变量
n="A1:B10":Range(n):字符串引用,支持变量
引用行
Rows(1):引用第1行,支持变量
Range("A1").EntireRow:引用第1行,支持变量
Rows("3:10").Rows("1:1"):引用第3~第10行区域中的第1行,即工作表第3行
Rows("1:2")或Rows(1 & ":" & 2):引用第1行和第2行,支持变量
[1:3]:引用第1~3行
引用列
Columns(1):引用第1列,支持变量
Columns("A:A")或Columns("A"):引用第1列,支持变量
Columns("B:G").Columns("B:B"):引用B:G列中的第2列
Columns("A:C"):引用第1~3列,支持变量
Range("A1").EntireColumn:引用第1列,支持变量
[A:C]:引用第1~3列
引用不连续单元格区域
Range("A1:A10,C1:C10,F1:F10"):直接引用,不支持变量
Union(Range("A1:A10"),Range("C1:C10"),Range("F1:F10"):高效批量,支持变量
引用公共区域
Range("B1:B10 A4:D6"):返回公共区域,用空格分隔
Intersect([C:D],工作表名称.UsedRange):返回工作表所有已使用区域与C、D两列交叉部分
引用合并区域
Range("B6:B10","D2:D8"):返回两个区域围成的最小矩形区域,用逗号分隔
特殊单元格定位
即定位功能,快捷键F5或Ctrl+G,可通过录制宏获取代码
Cells.SpecialCells(xlCellTypeFormulas,16):定位错误值单元格
Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete:快速删除A列单元格为空白的记录行
单元格操作
Offset属性返回相对单元格或区域
单元格.Offset(行偏移,列偏移):返回偏移后的单元格,以选定单元格为基准进行偏移
单元格区域.Offset(行偏移,列偏移):返回偏移后的单元格区域,以选定矩形区域左上角单元格为基准
参数为正整数,向下或向右偏移;参数为负整数,向上或向左偏移;参数为0,不偏移
省略行偏移则竖向不偏移,省略列偏移则水平不偏移,均省略不偏移
Resize属性返回扩展后区域
单元格.Resize(行扩展,列扩展):返回扩展后的矩形区域,以选定单元格为基准进行扩选
单元格区域.Resize(行扩展,列扩展):返回扩展后的矩形区域,以选定单元格区域左上角单元格为基准进行扩选,相当于选定左上角单元格后扩选,参数值小于选定区域的行、列数,返回一个较小的区域
参数值均为正整数,可以省略
UsedRange属性返回工作表已使用区域
工作表名称.UsedRange:返回工作表所有已使用的最小矩形区域
工作表名称.UsedRange.Offset(1).ClearContents:清除除第1行以外工作表已使用矩形区域的内容
已使用单元格不仅包含已写入数据、插入过批注,还包含设置过格式(底纹、边框、调整行高),矩形区域内可存在空行、空列或空单元格的不连续区域
CurrentRegion属性返回指定单元格在内的连续区域
单元格.CurrentRegion:返回包含指定单元格无空行或空列分隔的矩形区域
操作等同于选中单元格的同时,按Ctrl+A或“定位”当前区域
Copy方法复制单元格区域
源单元格区域.Copy Destination:=目标单元格
Destination参数名可以省略,可以指定一个单元格作为目标区域最左上角单元格
执行复制单元格操作,会把源区域包括数值、格式、公式等全部粘贴
PasteSpecial方法选择性粘贴
单元格.PasteSpecial 参数
参数包括:Paste、Operation、SkipBlanks、Transpose
参数可通过录制宏获得,省略则全部粘贴
常用语句结构
判断选择语句
IFF函数
IFF(比较运算式,操作或计算1,操作或计算2)
比较运算式返回True,执行操作1,否则执行操作2
IF...Then语句
If...Then...Else:一行语句,等同于IFF函数
If 条件表达式 Then 条件表达式返回True时执行的操作和计算 Else 条件表达式返回False时执行的操作和计算 EndIf ——多行语句,结构清晰,执行操作可多步
If 条件表达式 Then 条件表达式返回True时执行的操作和计算 ElseIf 条件表达式 Then 条件表达式返回True时执行的操作和计算 ...... Else 条件表达式返回False时执行的操作和计算 EndIf ——多行嵌套语句,实现“多选一”
Select Case语句
Select Case 用来判断和比较的表达式 Case 表达式1 操作或计算1 Case 表达式2 操作或计算2 ...... Case Else 其他操作或计算 End Select
Case Else为可选子句,Case子句无匹配则执行该子句操作
Case子句后是与Select Case后表达式进行比较的值,可以是To、Is或英文逗号隔开的数据列表
例:Case 1 To 3,Case Is 1,2,3,Case Is > 60
重复执行语句
For...Next语句
For 循环变量 = 初值 to 终值 [Step 步长值] 循环体(要重复执行的操作或计算) [Exit For] [循环体] Next [循环变量名]
[]内的代码可以省略,Exit For表示跳出For...Next循环
Do...Loop语句
Do [While 循环条件] 循环体 [Exit Do] [循环体] Loop
当循环条件的值为True时,执行循环体,否则执行Loop后的代码
Do 循环体 [Exit Do] [循环体] Loop [While 循环条件]
当循环条件的值为True时,返回Do While语句开始处再执行一次循环体,否则执行Loop后的代码
Do [Until 循环条件] 循环体 [Exit Do] [循环体] Loop
只有循环条件的值为True时,才会中止循环,执行Loop后的代码
Do 循环体 [Exit Do] [循环体] Loop [Until 循环条件]
执行一次循环体后,再判断循环条件是否为False,只有循环条件的值为False时,才会返回Do Until语句开始处,再次执行一次循环体,否则执行Loop后的代码
For Each...Next语句
For Each 变量 In 集合名称 语句块1 [Exit For] [语句块2] Next [变量]
循环处理集合中的每个成员,使用For Each...Next更方便
变量应声明为与集合中对象相同的类型
不用另外设置循环条件,在集合的所有对象里进行循环,每个对象只循环一次
跳转简化语句
Goto语句跳转执行行
在目标语句的代码行的前一行加上一个带冒号的字符串或不带冒号的数字标签,然后在GoTo的后面协商标签名
…… GoTo 跳转语句行 [跳过以下代码执行] …… 跳转语句行: [执行以下代码] ……
With语句简化引用对象
With 对象 [省略输入对象,仅输入点号].对象属性或方法 End With
With 工作表名称.单元格地址.Font .Name = "仿宋" .Size = 12 .Bold = True .ColorIndex = 3 End With
数据基础
变量
变量存储执行过程中需要临时保存的数据或对象
给变量赋值
数据类型变量赋值:[Let] 变量名称 = 数据
对象类型变量赋值:Set 变量名称 = 对象
变量的作用域及声明
本地变量:单个过程,Dim或Static语句声明变量位于过程中
模块级变量:单个模块,Dim或Private语句声明变量位于第一个过程之前
公共变量:所有模块,Public语句声明变量位于任何模块的第一个过程之前
Static用于声明静态变量,存储的数据在过程执行结束后继续保留
常量
常量用来一些固定、不会被修改的数据
常量作用域及声明
Const 常量名称 As 数据类型 = 数据
本地变量:单个过程,Const语句声明变量位于过程中
模块级变量:单个模块,Const或Private Const语句声明变量位于第一个过程之前
公共变量:所有模块,Public Const语句声明变量位于任何模块的第一个过程之前
数据类型
数值型
布尔型
Boolean:2字节,逻辑值True和False
整数
Byte:1字节,整数0-125
Integer:2字节,整形-32768-32767
Long:4字节,长整型,-2147483648-2147483647
小数
Single:4字节,单精度
负数:-3.4×10^38到-1.4×10^-45
正数:1.4×10^-45到3.4×10^38
Double:8字节,双精度
负数:-1.7×10^308到-4.9×10^-324
正数:4.9×10^-324到1.7×10^308
Currency:8字节,-9.2×10^14到9.2×10^14
Decimal:14字节
不含小数:±7.9×10^28
包含28位小数:±7.9×10^28
文本型
String:10字节+字符串长度,变长字符串,0-大约20亿个字符
String:字符串长度,定长字符串,1到65400个字符
日期时间
Date:8字节,100年1月1日-9999年12月31日
其他类型
各种对象
Object:4字节,对象变量,用来引用对象
变体型
Variant:16字节,数字,任意数值及Empty、Error、Nothing、Null类特殊数据
Variant:22字节+字符串长度,字符,0-大约20亿个字符
自定义
Type:存储用户自定义数据类型,存储范围与数据本身类型范围相同
VBA内置函数
信息函数Information
IsNumeric:判断参数中数据是否为数字
IsDate:判断参数中数据是否为日期
IsEmpty:判断参数中的变量是否为Empty(是否初始化)
IsArray:判断参数是否为数组
IsError:判断参数是否为错误值
IsNull:判断参数是否不包含任何有效数据
IsObject:判断参数是否为一个对象
数学函数Math
Int:返回小于或等于参数指定数值的第一个整数
Fix:返回参数指定数值的整数部分
Round:按指定的小数位数对参数指定的数值进行四舍五入
Sqr:求参数指定数值的平方根
Abs:求参数指定数值的绝对值
Rnd:生产一个0到1之间的随机数
Randomize:初始化随机函数Rnd
文本函数String
Len:求参数中数据包含的字符个数
Left、Right、Mid:截取指定字符串最左端、最右端、任意位置开始、指定数量的字符
Ltrim、Rtrim、Trim:去掉参数指定字符串最左端、最右端、左右两端多余的空格
DateSerial:返回参数指定年、月、日组成的日期数据
Year、Month、Day:返回参数指定日期中的年、月、日信息
TimeSerial:返回参数指定时、分、秒组成的时间数据
Hour、Minute、Second:返回参数指定时间中的时、分、秒信息
DateValue:将具有日期数据外观的字符串转为日期数据
TimeValue:将具有时间数据外观的字符串转为时间数据
DateDiff:求两个日期的间隔
数据类型转换函数Conversion
Val:转换为数值类型
Clng:转换为Long类型
Clnt:转换为Integer类型
CByte:转换为Byte类型
CDbl:转换为Double类型
CStr:转换为String类型
CDate:转换为Date类型
CBool:转换为Boolean类型
CVar:转换为Variant类型
数组
数组基础
特殊变量集合
数组是由多个变量组成的特殊变量,是同种类型多个变量的集合,每个变量称作元素
声明数组
Dim/Public/Private 数组名称(a To b) As 数据类型
声明数组时同时指定数组大小(起止索引号)
起止索引号a和b为整数(不能是变量),a可以任意整数
省略a则默认起始索引号为0,除非模块第一句写上“OPTION BASE 1”指定起始索引号为1
给数组赋值
给数组赋值时,需要给每个元素赋值,可借助循环语句
Dim Arr(1 To 100) As Byte, n As Byte For n = 1 To 100 Arr(n) = n Next
多维数组
数组的维数及引用
一维数组:一行数据,数组名称(索引号)
二维数组:多行多列矩形区域,数组名称(行数,索引号)
三维数组:多张工作表包含相同大小的矩形区域,数组名称(工作表数,行数,索引号)
四维数组:一个文件夹内多个工作簿包含多张工作表,每个工作表包含相同大小的矩形区域,数组名称(工作簿数,工作表数,行数,索引号)
声明多维数组
Dim 数组名称(a To b,c To d) As 数据类型
a、b为行起止索引号,表示存储b-a+1行
c、d为每行数据起止索引号,表示每行存储d-c+1个数据
维数之间采用英文逗号分隔,起始索引号可省略,同一维数组
动态数组
声明动态数组
Dim 数组名称( ) As 数据类型
预先不明确数组大小,括号内为空
ReDim语句重置数组大小并清空数据
Dim 数组名称() As 数据类型, a As Integer a = 表达式 ReDim 数组名称(1 To a)
1、首先声明无大小的空数组,以及一个确定数组大小的数据变量
2、然后计算数组大小并赋值给数据变量
3、最后利用数据变量重置数组大小
ReDim语句可以重新设置动态数组大小,但会清空原数组内数据
ReDim Preserve语句重置数组大小并保留数据
Dim 数组名称() As 数据类型, a As Integer a = 表达式 ReDim 数组名称(1 To a) <给数组赋值> ReDim Preserve 数组名称(1 To a+1)
前3步与ReDim语句相同,数组赋值后执行ReDim Preserve语句重置数组大小,已赋值数组内存储数据将会保留
创建特殊数组
Array函数创建一维数组
Dim 数组名称 As Variant 数组名称 = Array(英文逗号分隔的数据列表)
创建数组前,应将该数组声明为Variant类型的变量
数据列表为空,则创建不包含数据的空数组
创建的一维数组默认起始索引号为0,除非使用“OPTION BASE 1”改为1
Split函数将字符串拆分为一维数组
Dim 数组名称 As Variant 数组名称 = Split(包含分隔符的字符串或字符串变量,"分隔符")
创建数组前,应将该数组声明为Variant类型的变量
创建的一维数组默认起始索引号为0
通过单元格区域直接创建二维数组
Dim 数组名称 As Variant 数组名称 = 单元格区域.Value
创建的二维数组起始索引号为1,引用元素需要2个数字
将数组内数据填入单元格区域必须与数组维数相同
数组操作函数
Join函数合并一维数组为字符串
Dim 数组名称 As Variant,字符串变量 as String 数组名称 = Array(英文逗号分隔的数据列表) 字符串变量 = Join(数组名称,"分隔符")
仅能合并一维数组,分隔符省略将使用空格分隔
求数组最大和最小索引号
UBound/LBound(数组名称):一维数组最大/最小索引号
UBound/LBound(数组名称,维数):二维数组最大/最小索引号
UBound(数组名称)-LBound(数组名称)+1:一维数组包含元素个数
对象的事件
工作表事件
SelectChange更改选中单元格
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 语句代码块 End Sub
更改选中工作表任意单元格或区域时执行
变量Target代表被选中的单元格区域
Change更改单元格
Private Sub Worksheet_Change(ByVal Target As Range) 语句代码块 End Sub
更改单元格中保存的数据(清除内容、输入数据、双击单元格、Enter或方向键结束输入)均会触发事件
公式重算、改变单元格格式、排序或筛选等都不会触发事件
变量Target代表被修改的单元格
EnableEvents属性禁用事件
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False [禁用事件] Target.Offset(0, 1).Value = "自动执行填入" Application.EnableEvents = True [重新启用事件] End Sub
手动或通过VBA代码更改单元格,都会触发Change事件,以上代码会在手动更改的单元格之后一直输入“自动执行填入”,出现意外错误
禁用原理:更改单元格会首先触发事件并执行事件过程,然后判断是否禁用,未禁用继续执行触发事件,禁用则过程执行结束
过程结束前要重新设置启用事件,禁用事件属性无法禁用控件事件
常用工作表事件
Activate
激活工作表时发生
BeforeDelete
删除工作表之前发生
BeforeDoubleClick
双击工作表之后,默认双击操作之前发生
BeforeRightClick
右击工作表之后,默认右击操作之前发生
工作簿事件
BeforeClose关闭工作簿
Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("是否关闭工作簿?", vbYesNo) = vbNo Then Cancel = True End If End Sub
关闭工作簿之前自动执行,Cancel是过程参数,确定是否关闭工作簿
Cancel值为False执行关闭工作簿操作,为True不执行关闭工作簿操作
结合示例代码理解Cancel值对应的操作
常用工作簿事件
Activate
在激活工作簿时发生
AddinInstall
在工作簿作为加载宏安装时发生
AddinUninstall
在工作簿作为加载宏卸载时发生
AfterSave
在保存工作簿之后发生
BeforePrint
在打印指定工作簿前发生
BeforeSave
在保存工作簿前发生
Deactivate
在工作簿从活动状态转为不活动状态时发生
NewChart
在工作簿中新建一个图表时发生
NewSheet
在工作簿中新建工作表时发生
SheetActivate
在激活任意工作表时发生
SheetBeforeDoubleClick
在双击任意工作表时发生(默认双击操作发生之前)发生
SheetBeforeRightClick
在右击任意工作表时(默认右击操作之前)发生
SheetCalculate
在重新计算工作表时或在图表上绘制更改的数据之后发生
SheetChange
当更改任意工作表中的单元格时发生
SheetDeactivate
当任意工作表从活动变为不活动时发生
SheetFollowHyperlink
当单击工作簿中的任意超链接时发生
SheetPivotTableUpdate
当更新任意数据透视表之后发生
SheetSelectChange
当改变任意工作表中选中的区域时发生
WindowActivate
当激活任意工作簿窗口时发生
WindowDeactivate
当任意工作簿窗口由活动窗口变为不活动窗口时发生
WindowResize
当调整任意工作簿窗口的大小时发生
类似事件的方法
OnKey方法设置快捷键
设置当按下键盘上指定的键或组合键时,自动执行指定的过程
Sub OnKey方法() Application.OnKey "快捷键代码", "要执行的过程名称" End Sub
快捷键代码及要执行的过程名称均为文本字符串,应在英文双括号内
组合键代码:Shift—+,Ctrl—^,Alt—%
OnKey方法在执行该过程后,在所有打开的工作簿中都有效
OnKey方法在关闭当前工作簿时必须关闭,不设置第2参数即可取消
OnTime方法设置时间自动执行
Sub OnTime方法() Application.OnTime EarliestTime, Procedure, [LatestTime], [Schedule] End Sub
EarliestTime:必须,要执行过程的时间,可以用TimeValue指定具体时间、用Now+TimeValue指定经过时间段、用DateSerial+TimeValue指定具体日期时间
Procedure:必须,要执行过程的名称(英文双引号内)
LaterTime:可选,执行过程的最晚时间,超过该时间后不再执行,指定方式同EarliestTime
Schedule:可选,清除OnTime方法的设置,值为True设置执行过程,值为False清除之前OnTime方法设置,默认值为True
方法使用说明
OnKey方法和OnTime方法均需先执行方法所在过程,不会自动执行
如需自动执行,可设置工作簿或工作表事件
Sub子程序过程
Sub过程基本结构
[Private|Public][Static] Sub 过程名([参数列表]) [语句块] [Exit Sub] [语句块] End Sub
Private和Public同时只能使用一个,用来声明过程作用域,省略等同于Public
Static,过程结束后,VBA会继续保存过程中变量的值
Exit Sub可选,执行该语句将中断执行并退出过程
过程参数可选,写在过程名称后面的括号中
Sub过程作用域
Public公共过程
[Public] Sub 过程名([参数列表])
公共过程可以被工程中的所有过程调用,关键字Public可以省略
Private私有过程
Private Sub 过程名([参数列表])
私有过程只有所在模块的过程才能调用,且在【宏】对话框中不显示
整个模块私有化
模块第一个过程之前写上“Option Private Module”,将模块声明为私有模块
模块中所有过程都将声明为私有过程,包括已声明为公共过程的过程
过程调用另一过程
直接使用过程名称
直接将过程名称写成单独的一行代码
过程名,参数1,参数2,……
调用过程有参数,过程名称与参数、参数与参数之间用英文逗号分隔
Call关键字
Call 过程名(参数1,参数2,……)
调用过程无参数,不用写括号
Run方法
Application.Run "过程名",参数1,参数2,……
表示过程名的字符串,必须写在英文双引号内
过程参数传递
引用方式传递
Sub 子程序(变量名 As 数据类型) 变量名 = "子程序" End Sub Sub 主程序() Dim 新变量名 As 数据类型 新变量名 = "主程序" Call 子程序(新变量名) MsgBox 新变量名 End Sub
执行结果:两个过程变量引用内存同一数据,虽然主程序指定了过程参数值“主程序”,但子程序重新设置了过程参数值“子程序”,故返回的值为“子程序”
传递的是变量指向内存地址而非数据本身,在过程中对参数的任何修改都会影响该地址存储的数据
按值的方式传递
Sub 子程序(ByVal 变量名 As 数据类型) 变量名 = "子程序" End Sub Sub 主程序() Dim 新变量名 As 数据类型 新变量名 = "主程序" Call 子程序(新变量名) MsgBox 新变量名 End Sub
执行结果:虽然子程序重新设置了过程参数值“子程序”,但因过程参数声明为“按值的方式传递(ByVal)”,子程序设置的过程参数值“子程序”不影响主程序指定的过程参数值“主程序”,故返回的值为“主程序”
传递的是变量存储数据的副本作为执行过程所需参数,在过程中对参数的修改不会影响原变量中存储的值
在参数前带上ByVal关键字,该参数将按值的方式传递
Function函数过程
Function过程基本结构
[Private|Public][Static] Function 过程名([参数列表]) [As 数据类型] 语句块 函数名 = 代码执行结果 [Exit Function] [语句块] [函数名 = 代码执行结果] End Function
无论Function过程包含多少代码,要执行多少计算,都应该将最后的计算结果保存在过程名称中,这一步必不可少。保存在过程名称中的数据就是自定义函数返回的结果。
自定义函数未设置参数,使用时,函数名称后面写上一对空括号
Function过程作用域
Function过程作用域与Sub过程作用域相同,分为私有过程和公共过程
私有过程只能在该过程所在模块中被调用,在其他模块及工作表中都不能使用,也不会显示在【插入函数】对话框中
公共过程可以在所有模块及工作表中使用自定义函数
Function过程参数
参数1 As 数据类型,参数2 As 数据类型,……
参数设定告诉Excel对什么数据类型、按什么规则进行计算
可选参数
Optional 参数名 As 数据类型 = 默认值
可选参数未设置默认值,数据类型应设置为Variant
过程中可用IsMissing函数判断是否设置了默认值,并重新赋值
未设置默认值,IsMissing(参数)返回True,否则返回False
不定个数参数
ParamArray 数组名() As Variant
Function 替换字符(原字符串 As String, ParamArray 替换数组() As Variant) As String Dim i As Integer 替换字符 = 原字符串 For i = 0 To UBound(替换数组) Step 2 替换字符 = Replace(替换字符, 替换数组(i), 替换数组(i + 1)) Next End Function
不定个数参数设置为Variant类型的数组,参数名前加ParamArray
不定个数参数必须设置为最后一个参数,或设置为唯一参数
参数按值的方式传递数据
Function 函数名(ByVal 参数名 As 数据类型)
除非特殊需要,一般将函数参数设置为按值的方式传递,参数名前加ByVal关键字
设置易失性
语句块第一行写入:Application.Volatile True
工作表做了任意更改,均强制让自定义函数自动重算
内置对话框
InputBox函数交互对话框
InputBox(Prompt, [Title], [Default], [XPos], [YPos], [HelpFile], [Context]) As String
InputBox(Prompt, [Title], [Default], [XPos], [YPos])
参数说明
Prompt:必选,文本表达式,设置对话框显示的提示信息
Title:可选,文本表达式,设置对话框标题栏显示内容
Default:可选,文本表达式,设置对话框默认输入内容
XPos:可选,数值表达式,对话框距离屏幕左边缘距离,省略居中
YPos:可选,数值表达式,对话框距离屏幕顶边缘距离,省略1/3
InputBox方法交互对话框
Application.InputBox(Prompt, [Title], [Default], [Left], [Top], [HelpFile], [HelpContextID], [Type])
参数说明
Prompt:必选,文本表达式,设置对话框显示的提示信息
Title:可选,文本表达式,设置对话框标题栏显示内容
Default:可选,文本表达式,设置对话框默认输入内容
Left:可选,数值表达式,对话框在Excel窗口水平位置
Top:可选,数值表达式,对话框在Excel窗口垂直位置
Type:可选,返回的数据类型,省略返回String类型数据
Type单数据类型设置项
0—公式;1—数字;2—文本(字符串);4—逻辑值;8—单元格引用(Range对象);16—错误值;64—数值数组
Type多数据类型设置项
将单数据类型相加或求和,如Type:=1+2(等同Type:=3)表示数字和文本数据类型
MsgBox函数对话框显示信息
MsgBox(Prompt, [Buttons], [Title], [HelpFile], [Context])
常用参数说明
Prompt:必选,设置对话框显示的提示信息
Buttons:可选,设置对话框按钮数量、按钮类型、图表样式
Title:可选,对话框标题显示内容
Buttons按钮样式
按钮格式
vbOkonly—0—【确定】
vbOkCancel—1—【确定】【取消】
vbAbortRetryIgnore—2—【中止】【重试】【忽略】
vbYesNoCancel—3—【是】【否】【取消】
vbYesNo—4—【是】【否】
vbRetryCancel—5—【重试】【取消】
图标
vbCritical—16—【关键信息】
vbQuestion—32—【警告询问】
vbExclamation—48—【警告窗口】
vbInformation—64—【通知消息】
同时设置显示按钮和图标,将两个常量或数值相加或求和
MsgBox函数返回值
【确定】—vbOK——1;【取消】—vbCancel—2
【中止】—vbAbort—3;【重试】—vbRetry—4
【忽略】—vbIgnore—5;【是】—vbYes—6;【否】—vbNo—7
FindFile方法选择并打开文件
Application.FindFile,显示【打开】对话框,可以多选
选择并打开文件返回True,点击【取消】返回False
GetOpenFilename方法选择并获取文件名称
Application.GetOpenFilename([FileFilter], [FilterIndex], [Title], [MultiSelect])
显示【打开】对话框,不会打开文件,仅返回包含路径的文件名称
选择文件并点击【打开】,返回文件名称(String类型);点击【取消】返回False;变量声明应为Variant类型。
参数说明
FileFilter:可选,文件类型
参数用来设置对话框中文件筛选条件,省略则默认显示所有文件类型
单类型(逗号):FileFilter:="说明,*.扩展名"
多类型(逗号):FileFilter:="说明1,*.扩展名1,说明2,*.扩展名2"
多类型多扩展(逗号分号):FileFilter:="说明1,*.扩展名1;*.扩展名2,说明2,*.扩展名3;扩展名4"
FilterIndex:可选,默认选项
对于多类型,设置参数值将默认选择参数值对应位置设置的文件类型
Title:可选,对话框标题
设置对话框标题,省略默认标题“打开”
MultiSelect:可选,多选文件
参数值True表示可以同时选择多个文件,省略或False只能选择一个
选择多个文件后点击【打开】,返回所选文件名称组成的一维数组
GetSaveAsFilename方法另存获取文件名称
Application.GetSaveAsFilename([InitialFilename], [FileFilter], [FilterIndex], [Title])
调出【另存为】对话框,选择文件获得该文件包含路径名的文件名称
注意:该方法仅能获取带路径的文件名称,返回
参数说明
InitialFilename:可选,默认显示的文件名称,省略则为空
FileFilter:可选,可以显示的文件类型,同GetOpenFilename
FilterIndex:可选,默认显示的文件类型,同GetOpenFilename
Title:可选,设置对话框标题,省略默认标题“另存为”
FileDialog属性获取文件夹路径及名称
Application.FileDialog (fileDialogType)
With Application.FileDialog(filedialogtype:=msoFileDialogFilePicker) .InitialFileName = "设置起始目录路径" .Title = "设置对话框标题" .Show '显示对话框 End With
fileDialogType参数说明
msoFileDialogFilePicker:允许用户选择文件
msoFileDialogFolderPicker:允许用户选择文件夹
msoFileDialogOpen:允许用户打开文件
msoFileDialogSaveAs:允许用户保存文件
ActiveX控件
子主题