Excel VBA 函数教程:返回、调用、示例

什么是函数?
函数是执行特定任务并返回结果的一段代码。函数主要用于执行重复性任务,例如格式化数据以供输出、执行计算等。
假设你正在开发ping 编写一个计算贷款利息的程序。您可以创建一个函数,该函数接受贷款金额和还款期限作为参数。然后,该函数可以使用贷款金额和还款期限来计算利息并返回结果。
为什么要使用函数
使用函数的优势与使用子程序的优势相同:它们将冗长的程序拆分成易于管理的部分,可以在项目的任何位置重复使用,并且描述性的名称可以清楚地说明代码的功能。 Excel VBA 子程序教程 全面涵盖这些福利。
函数命名规则
函数的命名规则与子程序的命名规则相同。函数名不能包含空格,必须以字母或下划线开头,且不能是保留字符。 VBA 关键字,例如 Function、Private 或 End。
用于声明函数的 VBA 语法
Private Function myFunction (ByVal arg1 As Integer, ByVal arg2 As Integer) myFunction = arg1 + arg2 End Function
语法中,
| Code | 操作 |
|---|---|
|
|
|
|
|
|
|
|
如何返回值并设置函数数据类型
函数比子程序多了一个功能:它会返回一个值。这个值由两个细节控制,而这两个细节都很容易被忽略。
首先是赋值。VBA 没有 Return 语句。相反,你需要将结果赋值给函数本身的名称,这就是为什么这行代码会这样写: 我的函数 = arg1 + arg2如果该赋值操作从未执行,则该函数会默默地返回一个空值,而不是引发错误,因此代码的每个分支都必须设置该值。
第二点是返回类型。上面的声明以右括号结束,因此该函数返回的是 Variant 类型。在括号后添加 As 子句可以修正类型,这样速度更快、内存占用更少,并且可以让编译器捕获类型不匹配的情况。
| 声明 | Returns & Exchanges | 什么时候使用 |
|---|---|---|
| 函数 f(x As Long) | 变种 | 只有当结果类型真正发生变化时才会如此 |
| 函数 f(x As Long) As Long | 长 | 整数,例如计数和行数 |
| 函数 f(x As Long) As Double | Double | 任何产生小数的计算 |
| 函数 f(x As Long) As String | 串 | 返回用于显示的格式化文本 |
| 函数 f(x As Long) As Boolean | 布尔 | 验证检查,回答“是”或“否”。 |
💡提示: 使用 Exit Function 可以在设置返回值后提前退出,就像 Exit Sub 可以退出子程序一样。
示例演示的功能:
函数与子程序非常相似。子程序与函数之间的主要区别在于,函数在调用时会返回一个值。而子程序在调用时不会返回值。假设您要将两个数字相加。您可以创建一个接受两个数字并返回这两个数字之和的函数。
- 创建用户界面
- 添加函数
- 编写命令按钮的代码
- 测试代码
步骤1) 用户界面
向工作表添加一个命令按钮,如下所示
将 CommandButton1 的以下属性设置为以下内容。
| S / N | 通过积极争取让商标与其相匹配的域名优先注册来维护 | 特性 | 价值 |
|---|---|---|---|
| 1 | 命令按钮 1 | 姓名 | 按钮添加Numbers |
| 2 | 标题 | 添加 Numbers 功能 |
您的界面现在应该显示如下
步骤2) 功能代码。
- 按 Alt + F11 打开代码窗口
- 添加以下代码
Private Function addNumbers(ByVal firstNumber As Integer, ByVal secondNumber As Integer) addNumbers = firstNumber + secondNumber End Function
在代码中,
| Code | 操作 |
|---|---|
|
|
|
|
|
|
步骤 3)写 Code 调用该函数
- 右键单击 btnAddNumbers 命令按钮
- 选择视图 Code
- 添加以下代码
Private Sub btnAddNumbers_Click() MsgBox addNumbers(2, 3) End Sub
在代码中,
| Code | 操作 |
|---|---|
| “信息Box 加Numbers(2,3)“ |
|
步骤4) 运行程序,会得到以下结果
下载包含上述代码的 Excel
上面的按钮通过 VBA 代码调用函数。也可以直接从工作表调用函数,无需使用任何按钮。
如何在工作表单元格中使用 VBA 函数
用 VBA 编写的函数可以像 SUM 或 VLOOKUP 函数一样直接输入到单元格中。Excel 将其称为用户自定义函数 (UDF),这也是许多人先学习函数再学习子程序的原因。必须满足三个条件。
- 将其放入标准模块中: 在编辑器中插入“模块”。存储在工作表或“ThisWorkbook”中的函数在公式栏中不可见。
- 公开: 上面的示例使用了“私有”属性,这会将其对 Excel 隐藏。“公共”是默认值,因此只需删除该关键字即可。
- 返回一个值,不做任何更改: 用户自定义函数 (UDF) 无法格式化单元格、删除行或向其他单元格写入数据。Excel 会阻止这些操作,并且单元格会显示 #VALUE! 错误。
下面这个函数可以转换温度,并且可以在表格中的任何位置使用。
Public Function CelsiusToF(ByVal Celsius As Double) As Double CelsiusToF = (Celsius * 9 / 5) + 32 End Function
将工作簿另存为启用宏的 .xlsm 文件,然后键入 =CelsiusToF(A1) 将公式输入到任意单元格。A1 单元格的内容更改时,结果也会随之更新,并且公式名称会出现在“用户定义”类别下的公式自动完成列表中。由于工作簿现在包含宏,因此任何打开该工作簿的用户都必须先启用内容,公式才会返回值,而不是 #NAME?。
常见的VBA函数错误及其修复方法
有四个问题导致大多数函数能够编译但返回错误答案。
- 该函数返回空值或 0: 结果从未被赋值给函数名,或者if语句的某个分支跳过了赋值操作。在每个路径上都设置返回值。
- 工作表单元格中的 #NAME? 该函数是私有的,位于工作表模块而不是标准模块中,或者保存工作簿时未启用宏。
- 整数参数溢出: 示例中使用的是 As Integer 类型,最大只能处理 32,767 个整数。要处理任何实际数据,请将两个参数和返回类型都更改为 Long 类型。
- 对方改变说法让来电者感到惊讶: 省略 ByVal 会导致 VBA 直接传递变量本身,因此函数可以修改调用者的值。除非需要这种效果,否则请务必使用 ByVal。



