文章目录

  • 函数定义
  • 传值和传引用
  • 函数返回对象
  • 使用默认参数
  • 使用不定长参数
  • 一些函数示例
    • 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函数定义及说明相关推荐

  1. access vba函数

    access vba函数 Abs 函数 返回参数的绝对值,其类型和参数相同. 语法 Abs(number) 必要的 number 参数是任何有效的数值表达式,如果 number 包含 Null,则返回 ...

  2. vba九九乘法表代码_Excel中使用vba函数制作九九乘法表的操作方法

    在excel中使用vba制作九九乘法表,如何进行具体操作的呢?今天,学习啦小编就教大家在Excel中使用vba函数制作九九乘法表的操作技巧. Excel中使用vba函数制作九九乘法表的操作步骤如下: ...

  3. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

  4. Go 学习笔记(15)— 函数(01)[函数定义、函数特点、多值返回、实参形参、变长参数,函数作为参数调用]

    1. 函数定义 Go 语言最少有个 main() 函数.函数声明告诉了编译器函数的名称,返回类型和参数. func funcName(parameter_list)(result_list) {fun ...

  5. 【python教程入门学习】Python函数定义及传参方式详解(4种)

    这篇文章主要介绍了Python函数定义及传参方式详解(4种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.函数初识 1.定 ...

  6. python系统提供构造函数传入参数_[ Python入门教程 ] Python函数定义和使用

    函数是一段可以重复多次调用的代码,通过输入的参数值,返回需要的结果.通过使用函数,可以提高代码的重复利用率.本文主要介绍Python函数的定义.调用和函数参数设置方法. 函数的定义 Python函数定 ...

  7. vscode 无法跳转到函数定义_玩转VS Code

    (以下快捷键操作针对 windows,括号内是针对 macOS) 代码编辑器--------高效能编程 学习新的编辑器的方法: 第一步:了解编辑器的快捷键和语言支持,快捷键值得多花时间: 第二步:开始 ...

  8. python函数定义和其四种参数_python入门第九课:函数的定义及多种参数传递方式...

    本教程使用的课本是<Python编程:从入门到实践>,作者:[美] Eric Matthes 本节介绍Python中的函数,函数是可以反复使用的一段代码,有了函数能大大简化编程工作量,还能 ...

  9. python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce、map、filter)

    python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce.map.filter) Python 中函数的应用非常广泛,比如 input() .print().range( ...

  10. oracle字符串提取函数,oracle字符串分割和提取函数定义

    oracle字符串分割和提取函数定义 oracle字符串分割和提取 分割 create or replace function Get_StrArrayLength ( av_str varchar2 ...

最新文章

  1. Eclipse 中导入jar包
  2. php的v_PHPV是什么意思
  3. Redis RDB、AOF持久化详解
  4. python 三维散点图拟合曲面_python实现三维拟合的方法
  5. pcjome新闻图片替换效果
  6. mysql开发要注意什么_Mysql日常开发注意要点
  7. 马克·扎克伯格帝国的衰落
  8. de4dot不能反编译的混淆工具 ILProtector
  9. android二维码扫描、读取、识别、生成、带logo
  10. Struts1.x使用入门
  11. linux copy 复制文件夹及子文件夹
  12. 佳能7660cdn 评价_佳能LBP7660Cdn说明书
  13. js中函数的this指向
  14. android绘制正态分布曲线,Excel表格中如何制作正态分布图和正态曲线模板
  15. Term Weighting
  16. 2021年机修钳工(中级)考试资料及机修钳工(中级)新版试题
  17. 三,python基础初识。
  18. 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解
  19. 该设备正在使用中.请关闭可能使用该设备的所
  20. oauth2 ldap sso

热门文章

  1. Java爬虫入门(一)
  2. Allwinner(全志)V5 SPI Flash Support List
  3. nbu备份软件异机恢复需要注意问题
  4. java se和ocjp_OCJP 考试题之七 - osc_sejhgcp0的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. 3D LUT调色预设如何导入并应用?(fcpx/PR/AE/PS/LR/达芬奇)
  6. linux环境生成pdf字体问题,字体概述与Linux字体常见问题的解决.pdf
  7. dev万能头文件_CSP-J/S考试中是否可以使用万能头文件
  8. Go程序设计语言读书笔记-1
  9. Scratch编程与科学结合-串联与并联
  10. 160个破解练习之CrackMe 006