VBA函数定义及说明
文章目录
- 函数定义
- 传值和传引用
- 函数返回对象
- 使用默认参数
- 使用不定长参数
- 一些函数示例
- text_split:字符串分割
- file_exists:判断文件是否存在
- basename:路径提取文件名
- sheet_exists:工作表是否存在
- workbook_is_open:工作表是否存在
- text_join:split的反函数
- ifs:多判断
- range_workbook_name:返回单元格所在的工作簿名称
- text_speak:说出文本
- is_like:模式匹配
函数定义
VBA定义的函数可以在工作表使用,如果是在加载插件中定义函数,本机所有打开工作簿都可以使用该函数,当然可以在过程sub中调用函数;
VBA函数与sub过程不同的是,函数有返回内容;过程和函数都可以传入参数。
函数使用Function关键字定义,定义规则如下:
Function 函数名称(形参及类型)
函数主体
函数名称= 函数返回
End Function
示例:
'定义一个数值平方的函数,形参:a,形参a类型:long,函数返回:a ^ 2;函数名称:test
Function test(a as long)
test = a ^ 2
End Function'定义全局函数,使用public关键字,这个关键字跟变量定义是一致的。后面跟的as long是返回类型
Public Function test(a as long) as long
test = a ^ 2
End Function
传值和传引用
函数或方法传值使用关键字ByVal
,传引用使用关键字ByRef
Sub num_print()
Dim i, num As Long ' 定义一个变量
num = 0
For i = 1 To 10s = add(num) ' 调用add函数sDebug.Print num ' 函数参数是传引用,会依次打印1,2,3,,,,10
Next
End SubFunction add(ByRef a As Variant)
a = a + 1
End Function
如果上述函数参数为传值ByVal,则函数不影响方法num_print中变量num的改变,全打印0;
函数返回对象
函数也可以返回对象,返回对象要使用set关键字;
示例:返回字典
Function aa()
Dim d As ObjectSet d = CreateObject("scripting.dictionary")
today = Date
the_month_date = CDate(Year(Date) & "-" & Month(Date) & "-" & 20) '这个月的20号
last_month_date = Application.WorksheetFunction.EDate(the_month_date, -1) '上个月的20号
d("today") = today
d("the_month_date") = the_month_date
d("last_month_date") = last_month_date
d("the_month") = Month(last_month_date) '这个月
d("last_month") =Month(Date) '上个月Set aa = d '返回对象使用set关键字
End Function'函数调用
sub test1()
dim d1 as objectset d1 = aa()
debug.print d1("today") '打印字典键today对应的值
end sub
使用默认参数
函数传入参数格式:形参 as 参数类型 = 参数默认值
示例:正则提取函数
Function regexp(rg As Variant, str As String, Optional mat As Byte = 0, Optional group As Variant = Empty)
'Optional表示参数不是必需的关键字。如果使用了该选项,则参数表中该参数后的参数都必须是可选的,而且必须都使用 Optional 关键字声明。
Dim re As Object
Set re = CreateObject("vbscript.regexp")With re.Global = True.Pattern = strIf re.test(rg) ThenIf group = Empty Thenregexp = re.Execute(rg)(mat)Elseregexp = re.Execute(rg)(mat).submatches(group)End IfEnd IfEnd With
Set re = Nothing
End Function
使用不定长参数
形参及类型固定写法:ParamArray 参数名称() As Variant(必须放在参数最后面)
示例:只要有一个单元格为空,返回空字符串
Function if_blank(goal_rg As Variant, ParamArray rngs() As Variant)
Dim rg
For Each rg In rngsIf rg.Value = "" Thenif_blank = ""Exit FunctionEnd If
Next
if_blank = goal_rg
End Function
示例:单元格求和sum
Function rng_sum(ParamArray values() As Variant)
Dim result As Variant
Dim val0 As Variant ' for循环里的变量必须是变体型变量,否则会报错
result = 0
For Each val0 In valuesFor Each val1 In val0result = result + val1Next
Next
rng_sum = result
End Function'然后我们在工作表里写了这么一个函数
=rng_sum(K21:L21,M22:N22,L23:N23)
一些函数示例
text_split:字符串分割
EXCEL里面没有split函数,可以使用vba定义该函数,在工作表内使用
Function text_split(str As String, sep As String, index As Long)
' 参数:str:被分割的字符串,sep:分隔符,index:分割后返回数组该索引的值,如果小于0返回数组
' 样例:text_split("abc,de,fg",",")(1) 返回:deIf index >= 0 Thentext_split = Split(str, sep)(index)
Elsetext_split = Split(str, sep)
End If
End Function
file_exists:判断文件是否存在
判断文件是否存在,dir函数可以使用通配符:*
Function file_exists(full_name As String) As Boolean
file_exists = (Dir(full_name) <> "")
End Function
basename:路径提取文件名
传入一个带路径完整的文件名,返回文件名,比如:test.xlsx
Function basename(full_name)
' Application.PathSeparator:反斜杠
' basename("d:/filedir/text.xlsx"),返回:text.xlsx
Dim arr As Variant
arr = Split(full_name, Application.PathSeparator)
basename = arr(UBound(arr))
End Function
sheet_exists:工作表是否存在
Function sheet_exists(sheet_name As Variant) As Boolean
' 传入工作表名称,返回是否存在:boolean
' sheet_exists("工作表2")
Dim st As Object
On Error Resume Next
Set st = ActiveWorkbook.Sheets(sheet_name)
If Err.Number = 0 Then ' 如果没有报错,返回truesheet_exists = True
Elsesheet_exists = False
End If
workbook_is_open:工作表是否存在
Function workbook_is_open(wb_name As Variant) As Boolean
' 传入工作簿名称,返回是否打开:boolean
' sheet_exists("工作表2")
Dim st As Object
On Error Resume Next
Set st = Workbooks(wb_name)
If Err.Number = 0 Then ' 如果没有报错,返回trueworkbook_is_open = True
Elseworkbook_is_open = False
End If
text_join:split的反函数
该函数在Excel2019版已经引入,早期的版本可以通过自定义函数实现
Function text_join(sep As String, is_skip_blank As Boolean, ParamArray ranges() As Variant)
' sep:分隔符,is_skip_blank:是否跳过空值,ranges:数组
Dim rngs, sub_rng As Variant
Dim s As String
s = ""
For Each rngs In rangesFor Each sub_rng In rngsIf is_skip_blank = True Then ' 是否跳过空格If Len(sub_rng) > 0 Thens = s & sep & RngEnd IfElses = s & sep & RngEnd IfNext
Next
text_join = Replace(s, sep, "", 1, 1) ' 把开头的分隔符去掉
End Function
ifs:多判断
该函数在excel2019版本后才有,早期的版本可以在vba中定制;无须重复if嵌套
Function udf_ifs(ParamArray args() As Variant)
Dim i As Byte
Dim args_len As Byteargs_len = UBound(args) ' 参数索引下标从0开始
If args_len < 1 Then Exit FunctionFor i = 0 To UBound(args) Step 2If args(i) = True Thenudf_ifs = args(i + 1) ' 如果参数是true,返回后面一个参数值Exit FunctionEnd If
Next' 如果都没有是,参数个数是基数,返回最后一个参数
If args_len Mod 2 = 0 Then udf_ifs = args(args_len): Exit Functionudf_ifs = "#N/A" ' 参数是偶数,且没有true对象,返回错误值
End Function
range_workbook_name:返回单元格所在的工作簿名称
返回单元格所在工作簿的名称,parent表示父对象,比如单元格的父对象是工作表,工作表的父对象是工作簿,这里调用了两次
Function range_workbook_name(rng As Variant) As String
range_workbook_name = rng.Parent.Parent.Name
End Function
text_speak:说出文本
使用的是Excel的文本转化成语音的转化生成器,讲述传入的字符串
Function text_speak(text)
' Application.Speech.Speak ("hello alice")
Application.Speech.Speak (text)
text_speak = text
End Function
is_like:模式匹配
使用vba的like函数,类似于sql中的like,like中pattern参数的字符
pattern字符 | 解释 |
---|---|
? | 任意单个字符 |
* | 0个或多个字符 |
# | 任意单个数字(0-9) |
[charlist] | 字符列表中的任意单个字符 |
[!charlist] | 不在字符列表中的任意单个字符 |
Function is_like(str As String, pattern As String) As Boolean
is_like = str Like pat
End Function
VBA函数定义及说明相关推荐
- access vba函数
access vba函数 Abs 函数 返回参数的绝对值,其类型和参数相同. 语法 Abs(number) 必要的 number 参数是任何有效的数值表达式,如果 number 包含 Null,则返回 ...
- vba九九乘法表代码_Excel中使用vba函数制作九九乘法表的操作方法
在excel中使用vba制作九九乘法表,如何进行具体操作的呢?今天,学习啦小编就教大家在Excel中使用vba函数制作九九乘法表的操作技巧. Excel中使用vba函数制作九九乘法表的操作步骤如下: ...
- C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)
每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...
- Go 学习笔记(15)— 函数(01)[函数定义、函数特点、多值返回、实参形参、变长参数,函数作为参数调用]
1. 函数定义 Go 语言最少有个 main() 函数.函数声明告诉了编译器函数的名称,返回类型和参数. func funcName(parameter_list)(result_list) {fun ...
- 【python教程入门学习】Python函数定义及传参方式详解(4种)
这篇文章主要介绍了Python函数定义及传参方式详解(4种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.函数初识 1.定 ...
- python系统提供构造函数传入参数_[ Python入门教程 ] Python函数定义和使用
函数是一段可以重复多次调用的代码,通过输入的参数值,返回需要的结果.通过使用函数,可以提高代码的重复利用率.本文主要介绍Python函数的定义.调用和函数参数设置方法. 函数的定义 Python函数定 ...
- vscode 无法跳转到函数定义_玩转VS Code
(以下快捷键操作针对 windows,括号内是针对 macOS) 代码编辑器--------高效能编程 学习新的编辑器的方法: 第一步:了解编辑器的快捷键和语言支持,快捷键值得多花时间: 第二步:开始 ...
- python函数定义和其四种参数_python入门第九课:函数的定义及多种参数传递方式...
本教程使用的课本是<Python编程:从入门到实践>,作者:[美] Eric Matthes 本节介绍Python中的函数,函数是可以反复使用的一段代码,有了函数能大大简化编程工作量,还能 ...
- python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce、map、filter)
python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce.map.filter) Python 中函数的应用非常广泛,比如 input() .print().range( ...
- oracle字符串提取函数,oracle字符串分割和提取函数定义
oracle字符串分割和提取函数定义 oracle字符串分割和提取 分割 create or replace function Get_StrArrayLength ( av_str varchar2 ...
最新文章
- Eclipse 中导入jar包
- php的v_PHPV是什么意思
- Redis RDB、AOF持久化详解
- python 三维散点图拟合曲面_python实现三维拟合的方法
- pcjome新闻图片替换效果
- mysql开发要注意什么_Mysql日常开发注意要点
- 马克·扎克伯格帝国的衰落
- de4dot不能反编译的混淆工具 ILProtector
- android二维码扫描、读取、识别、生成、带logo
- Struts1.x使用入门
- linux copy 复制文件夹及子文件夹
- 佳能7660cdn 评价_佳能LBP7660Cdn说明书
- js中函数的this指向
- android绘制正态分布曲线,Excel表格中如何制作正态分布图和正态曲线模板
- Term Weighting
- 2021年机修钳工(中级)考试资料及机修钳工(中级)新版试题
- 三,python基础初识。
- 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解
- 该设备正在使用中.请关闭可能使用该设备的所
- oauth2 ldap sso
热门文章
- Java爬虫入门(一)
- Allwinner(全志)V5 SPI Flash Support List
- nbu备份软件异机恢复需要注意问题
- java se和ocjp_OCJP 考试题之七 - osc_sejhgcp0的个人空间 - OSCHINA - 中文开源技术交流社区...
- 3D LUT调色预设如何导入并应用?(fcpx/PR/AE/PS/LR/达芬奇)
- linux环境生成pdf字体问题,字体概述与Linux字体常见问题的解决.pdf
- dev万能头文件_CSP-J/S考试中是否可以使用万能头文件
- Go程序设计语言读书笔记-1
- Scratch编程与科学结合-串联与并联
- 160个破解练习之CrackMe 006