VBA 函数(Function)入门教程和实例
在今天的这篇文章,学习函数的基础,包括如何写、传入参数、返回参数、执行过程等。
VBA 函数基础语法
VBA 函数与 VBA 过程很相似,除了使用的关键词外,主要区别是,函数可以返回值。
无参数函数
无参数 VBA 函数的基本语法如下:
Function [函数名]() As [返回值类型]
语句1
语句2
...
语句n
[函数名] = [返回值]
End Function
可以看到,函数使用 Function
和 End Function
语句作为函数的开始和结束。
函数包含的语句中,相比过程,可以看到多一个 [函数名] = [返回值]
语句,这是函数的返回值语句。函数名后制定该函数返回值的类型,语法与声明变量类似。
看一个实际的例子。
'声明函数,该函数随机返回 true 或 false。函数需指定返回值类型。
Function RandomLogic() As Boolean
RandomLogic = Rnd() > 0.5
End Function
该函数的名称是 RandomLogic
,返回值类型时 Boolean
类型,运行调用后,随机返回一个 true
或 false
值。实现方法是,使用 VBA 内置函数 Rnd(随机产生0-1的数字),随机数与0.5对比大小,产生 true 或 false 值,并把值赋值给函数名。
有参数函数
函数与过程一样,也可以接收参数,其语法与过程相同。
Function [函数名]([变量名1] As [数据类型1],...[变量名n] As [数据类型n]) As [返回值类型]
语句1
语句2
...
语句3
[函数名] = [返回值]
End Function
同样,函数接收的参数,在函数主体中使用。
我们看一个实际的例子。
Function Add2Number(num1 As Double, num2 As Double) As Double
Add2Number = num1 + num2
End Function
上述函数接受2个 Double
类型的数字作为参数,两者相加,返回和,其类型也是 Double
类型。
调用函数(Function)
函数与子过程的区别是,函数可以返回值。如果一个函数不返回值,它与子过程并无区别,其中调用方式与子过程相同。
调用有返回值的函数时,一般有两种情形:
- 一是,使用一个变量存储函数返回的值
- 二是,函数返回的值参与其他计算
两种情形调用函数方式相同,无参数函数直接书写,有参数函数将参数放在括号内。
Sub Main()
'使用变量存储函数返回的值
Dim result1 As Double
result1 = Add(12, 345)
'函数返回值继续参与计算
Dim result2 As Double
result2 = RandNum + Add(12, 345)
End Sub
'函数:返回一个随机值
Function RandNum()
RandNum = Rnd * 100
End Function
'函数:返回两数的和
Function Add(num1 As Double, num2 As Double) As Double
Add = num1 + num2
End Function
提前退出函数
正常情况下,函数使用 Function
和 End Function
语句作为函数的开始和结束。但有时根据实际情况,可能需要提前结束并退出函数。VBA 提供 2 种提前退出过程的方法,Exit Function
和 End
方法。
Exit Function 语句
在一个函数中,当程序运行到 Exit Function
语句时,立即结束当前函数,提前退出。
这里需要注意的是,Exit Function
语句只作用于当前过程,不影响调用它的父过程或函数。
End 语句
在一个函数,当程序运行到 End
语句时,立即结束当前运行的所有 VBA 过程和函数。
在实际开发中,应谨慎使用 End
结束语句。End
语句的效果类似于电脑的强制关机命令,立即结束所有程序,不会保存任何值,于 VBA 有以下效果:
- 程序中对象的各类事件不会被触发;
- 任何在运行的 VBA 程序都会停止;
- 对象引用都会失效;
- 任何打开的窗体都被关闭。
总结
函数与过程类似,大部分用法相同,主要区别是函数可以返回一个值,而过程不可以。两者均可以接受0个或多个参数,参数可以在过程或函数里使用。调用函数时,参数需要放置在括号内部,接函数名后。
忍不住再次夸赞一下,作者有其他博客吗?你写的教程很好,想关注你学学其他技术
Sub Main()
‘使用变量存储函数返回的值
Dim result1 As Double
result1 = num1
Range(“A11”) = result1
‘函数返回值继续参与计算
Dim result2 As Double
result2 = RandNum + num2
Range(“A12”) = result2
End Sub
‘函数:返回一个随机值
Function RandNum()
RandNum = Rnd * 100
End Function
‘函数:返回两数的和
Sub Add(num1 As Double, num2 As Double)
Add 8, 345
End Sub
将最后一段改写成引用,为啥result1和result2的值都不对?result1一直等于0,怎样把它变成8?
Main函数里的 num1、num2变量的初始值没有指定,Add函数也有些乱,不明白整个流程的逻辑,需要解释一下
能否讲解一下回调函数的概念?
回调函数是特定时机触发运行的函数,VBA 中没有直接的回调函数的概念。类似的,有事件函数,发生指定事件时,触发对应的事件函数,携带事件相关的一些信息,在这里面可以嵌套运行其他函数。
例如,工作表有单元格内容变化事件,每次单元格值变化时,就会运行该函数,该函数有变化的单元格对象参数,可以做进一步的处理。
代码编缉器怎么可以实现智能代码提示。
基本上以下几种方法:
1、调用或引用模块里的过程或函数时,先输入模块名称;
2、使用内置对象,先输入 VBA;
3、使用用户窗体,使用窗体名称和Me对象;
4、正则、字典等对象,使用前期绑定的方法。
为什么我debug add的时候立即窗口出现了两个相同值
可以贴一下你的具体代码吗
调用函数那里怎么输出啊
输出到哪里?立即窗口就用Debug.Print;工作表的话,就用range
你好,如何打印啊?
可以看一下打印专题,Excel打印专题
22222222222222222
调用函数章节
Dim result1 As Double
result = Add(12, 345)
‘函数返回值继续参与计算
Dim result2 As Double
result = RandNum + Add(12, 345)
下面返回两个都result,应该一个是result1一个是result2吧。
感谢反馈,已修正
无参数函数那个实例为什么运行不了啊?
他是一个函数,不能自己运行,需要在一个过程里调用该函数
Dim result As Double
报错:重复声明。
感谢反馈,已更正
为什么不在num1 和 num2 前面加上 dim
Function Add(dim num1 As Double,dim num2 As Double) As Double
Add = num1 + num2
End Function
这是VBA的语法,是固定写法。可以理解成VBA后台自动添加了Dim
感谢
good
请问为什么调用函数示例中,定义Function RandNum()的时候没有声明RandNum的类型呢?
如果不指定类型,默认是 variant 类型。
这里的randnum不是函数名吗?为什么要指定类型?变量和常量才需要声明吧。若是理解错了,麻烦能指出。谢谢。
函数是需要指定类型的,这里的类型是函数返回值的类型。如果省略,默认类型是 Variant