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

⚡ 智能摘要

Excel VBA 函数是一段代码块,它执行特定任务并将结果返回给调用它的对象。本页内容涵盖声明语法、返回值、加法示例以及如何在工作表单元格中使用函数。

  • 🎯 定义: 函数执行特定任务并向调用代码返回单个结果。
  • 🧾 语法: 函数名(参数)作为类型打开代码块,End Function 关闭代码块。
  • ↩️ 返回值: 将结果赋值给函数名,例如 add。Numbers = 第一个数字 + 第二个数字。
  • 🔢 退货类型: 声明为只要或 Double 避免使用速度较慢的默认版本。
  • 🖱️ 致电: 命令按钮可传递两个数字,并在消息框中显示返回的总和。
  • 📊 工作表用途: 标准模块中的公共函数在任何单元格中都会变成用户自定义公式。

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 操作
  • “私有函数 myFunction(…)”
  • 这里使用关键字“Function”声明一个名为“myFunction”的函数,并启动该函数的主体。
  • 关键字“Private”用于指定函数的范围
  • “ByVal arg1 作为整数,ByVal arg2 作为整数”
  • 它声明了两个整数数据类型的参数,分别名为“arg1”和“arg2”。
  • 我的函数 = arg1 + arg2
  • 计算表达式 arg1 + arg2 并将结果赋给函数名称。
  • “结束函数”
  • “End Function”用于结束函数体。

如何返回值并设置函数数据类型

函数比子程序多了一个功能:它会返回一个值。这个值由两个细节控制,而这两个细节都很容易被忽略。

首先是赋值。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. 创建用户界面
  2. 添加函数
  3. 编写命令按钮的代码
  4. 测试代码

步骤1) 用户界面

向工作表添加一个命令按钮,如下所示

VBA 函数和子程序

将 CommandButton1 的以下属性设置为以下内容。

S / N 通过积极争取让商标与其相匹配的域名优先注册来维护 特性 价值
1 命令按钮 1 姓名 按钮添加Numbers
2 标题 添加 Numbers 功能

您的界面现在应该显示如下

VBA 函数和子程序

步骤2) 功能代码。

  1. 按 Alt + F11 打开代码窗口
  2. 添加以下代码
Private Function addNumbers(ByVal firstNumber As Integer, ByVal secondNumber As Integer)
    addNumbers = firstNumber + secondNumber
End Function

在代码中,

Code 操作
  • “私人功能添加Numbers(......)“
  • 它声明了一个私有函数“addNumbers”它接受两个整数参数。
  • “ByVal 第一个数字作为整数,ByVal 第二个数字作为整数”
  • 它声明了两个参数变量 firstNumber 和 secondNumber
  • “添加Numbers =第一个数字+第二个数字”
  • 它将 firstNumber 和 secondNumber 值相加,并将总和赋给 addNumbers.

步骤 3)写 Code 调用该函数

  1. 右键单击 btnAddNumbers 命令按钮
  2. 选择视图 Code
  3. 添加以下代码
Private Sub btnAddNumbers_Click()
    MsgBox addNumbers(2, 3)
End Sub

在代码中,

Code 操作
“信息Box 加Numbers(2,3)“
  • 它调用函数 addNumbers 并传入 2 和 3 作为参数。该函数返回两个数字之和五 (5)

步骤4) 运行程序,会得到以下结果

VBA 函数和子程序

下载包含上述代码的 Excel

下载上述Excel表格 Code

上面的按钮通过 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。

常见问题

不直接返回。可以返回数组或自定义类型,以便在一个结果中携带多个值,或者将额外的参数声明为 ByRef,以便函数将值写回调用者的变量。

添加带有默认值的 Optional 关键字,例如 Optional ByVal Rate As Double = 0.05。可选参数之后的每个参数也必须是可选参数,并且它们必须位于列表的最后。

是的,可以通过 Application.WorksheetFunction 来实现,例如 Application.WorksheetFunction.Sum(Range(“A1:A10”))。VBA 本身提供的函数,例如 Left 或 Trim,可以直接调用,无需添加前缀。

是的。粘贴工作表公式后,AI 助手会返回一个等效的公共函数,该函数带有命名参数和声明的返回类型。在替换公式之前,请在示例行上比较这两个结果。

是的。提供函数和公式,人工智能助手就会指出问题原因,例如参数类型不匹配、缺少返回值赋值,或者试图从用户自定义函数内部更改单元格。

总结一下这篇文章: