在 Excel 中创建自定义函数

虽然 Excel 包含许多内置的工作表函数, 但实际上它不会为你执行的每种类型的计算提供函数。 Excel 的设计器可能无法预测每个用户的计算需求。 Excel 将为你提供创建自定义函数的功能, 本文将介绍这些函数。

您是否正在寻找有关如何创建可在 Excel for Windows、Excel for Mac 或 Excel 网页版 上运行的 Javascript 自定义函数的信息? 如果你是, 请参阅Excel 自定义函数概述一文。

自定义函数 (如宏) 使用Visual Basic For Applications (VBA)编程语言。 它们在两个显著方面不同于宏。 首先, 它们使用函数过程而不是Sub过程。 也就是说, 它们从函数语句 (而不是sub语句) 开始, 使用End 函数而不是end Sub结束。 其次, 它们执行计算, 而不是采取操作。 某些类型的语句 (如选择和设置范围格式的语句) 从自定义函数中排除。 在本文中, 你将了解如何创建和使用自定义函数。 若要创建函数和宏, 请使用Visual Basic 编辑器 (VBE), 该编辑器在与 Excel 分开的新窗口中打开。

假设您的公司提供产品销售的 10% 的数量折扣, 前提是订单超过100单位。 在以下段落中, 我们将演示用于计算此折扣的函数。

下面的示例显示了一个订单窗体, 其中列出了每个项目、数量、价格、折扣 (如果有), 以及得到的延伸价格。

没有自定义函数的示例订单表单

若要在此工作簿中创建自定义折扣功能, 请执行以下步骤:

  1. Alt + F11打开 Visual Basic 编辑器 (在 Mac 上, 按FN + Alt + F11), 然后单击 "插入>模块"。 "新模块" 窗口将显示在 Visual Basic 编辑器的右侧。

  2. 将以下代码复制并粘贴到新模块中。

    Function DISCOUNT(quantity, price)
       If quantity >=100 Then
         DISCOUNT = quantity * price * 0.1
       Else
         DISCOUNT = 0
       End If
     
     DISCOUNT = Application.Round(Discount, 2)
    End Function
    

注意: 若要使代码更易于阅读, 可以使用Tab键缩进行。 缩进仅用于你的福利, 并且是可选的, 因为代码将在运行时或不带它的情况下运行。 键入缩进线后, Visual Basic 编辑器假设下一行将按类似缩进。 若要向左移动 (即向左移动) 一个制表符, 请按Shift + tab

现在, 你可以使用新的折扣功能了。 关闭 Visual Basic 编辑器, 选择 "单元格 G7", 然后键入以下内容:

= 折扣 (D7, E7)

Excel 将每个单位 $47.50 的200单位计算 10% 的折扣, 并返回 $950.00。

在您的 VBA 代码的第一行中, 函数折扣 (数量, 价格) 表示折扣功能需要两个参数,数量价格。 当您在工作表单元格中调用该函数时, 必须包含这两个参数。 在 "公式 = 折扣 (D7, E7)" 中, D7 是 "数量" 参数, 而 E7 是 "价格" 参数。 现在, 您可以将折扣公式复制到 G8: G13 以获取下面所示的结果。

让我们来考虑 Excel 如何解释此函数过程。 按enter时, Excel 将在当前工作簿中查找名称折扣, 并发现它是 VBA 模块中的自定义函数。 括在括号、数量价格中的参数名称是折扣计算所基于的值的占位符。

带有自定义函数的示例订单表单

以下代码块中的 If 语句检查数量参数并确定所售项目的数量是否大于或等于 100:

If quantity >= 100 Then
 DISCOUNT = quantity * price * 0.1
Else
 DISCOUNT = 0
End If

如果售出的项目数大于或等于 100, 则 VBA 执行以下语句, 将数量值乘以price值, 然后将结果乘以 0.1:

Discount = quantity * price * 0.1

结果存储为可变折扣。 在变量中存储值的 VBA 语句称为赋值语句, 因为它将计算等号右侧的表达式, 并将结果赋给左侧的变量名称。 由于可变折扣与 function 过程具有相同的名称, 因此存储在变量中的值将返回到名为 "折扣" 功能的工作表公式。

如果数量小于 100, 则 VBA 执行以下语句:

Discount = 0

最后, 以下语句将分配给折扣变量的值四舍五入到两个小数位数:

Discount = Application.Round(Discount, 2)

VBA 没有 ROUND 函数, 但 Excel 确实如此。 因此, 若要在此语句中使用 ROUND, 请告诉 VBA 查找应用程序对象 (Excel) 中的 Round 方法 (函数)。 通过在 "循环" 之前添加 word应用程序来执行此操作。 当需要从 VBA 模块访问 Excel 函数时, 请使用此语法。

自定义函数必须以函数语句开头, 并以 End 函数语句结尾。 除了函数名称, 函数语句通常指定一个或多个参数。 但是, 你可以创建没有参数的函数。 Excel 包括几个内置函数 (例如, RAND 和 NOW), 这些函数不使用参数。

在函数语句后, 函数过程包含一个或多个 VBA 语句, 这些语句使用传递到函数的参数进行决策和执行计算。 最后, 函数过程中的某个位置, 必须包含一个语句, 该语句为变量赋值与函数同名的变量。 此值将返回到调用该函数的公式。

可在自定义函数中使用的 VBA 关键字的数量小于您可以在宏中使用的数字。 不允许自定义函数执行除将值返回到工作表中的公式或其他 VBA 宏或函数中使用的表达式之外的任何操作。 例如, 自定义函数无法调整窗口大小、编辑单元格中的公式或更改单元格中文本的字体、颜色或模式选项。 如果在 function 过程中包括此类型的 "操作" 代码, 则该函数将返回 #VALUE! 错误。

函数过程可以执行的一个操作 (除了执行计算) 会显示一个对话框。 你可以使用自定义函数中的InputBox语句作为获取来自执行该函数的用户的输入的方法。 可以使用MsgBox语句作为向用户传达信息的一种方法。 您也可以使用自定义对话框或用户表单, 但这是除了本简介的范围之外的主题。

即使是简单的宏和自定义函数也很难阅读。 你可以通过在批注形式中键入说明性文本使其更易于理解。 通过在说明文字前面加一个撇号来添加注释。 例如, 以下示例显示带批注的折扣函数。 添加类似于这些的注释使您或其他人能够更轻松地在时间传递时维护您的 VBA 代码。 如果你需要在将来对代码进行更改, 你将能够更轻松地了解你最初执行的操作。

带有批注的 VBA 函数的示例

撇号告诉 Excel 忽略同一行右侧的所有内容, 因此你可以自行或在包含 VBA 代码的行右侧的行上创建批注。 你可能会开始一个相对较长的代码块, 其中包含用于解释其总体用途的注释, 然后使用内联注释记录单个语句。

记录宏和自定义函数的另一种方法是为其提供描述性名称。 例如, 你可以将其命名为MonthLabels , 而不是为宏标签命名, 以便更明确地描述宏所服务的用途。 在创建了许多过程时, 使用宏和自定义函数的描述性名称非常有用, 尤其是当创建的过程具有相似但不完全相同的目的时。

如何记录宏和自定义函数是个人首选项的重要内容。 重要的是采用某种文档的方法, 并一致地使用它。

若要使用自定义函数, 包含您在其中创建该函数的模块的工作簿必须处于打开状态。 如果该工作簿未打开, 则会收到 #NAME? 尝试使用该函数时出错。 如果在其他工作簿中引用该函数, 则必须在函数名称前面加上该函数所驻留的工作簿的名称。 例如, 如果在名为 .xlsb 的工作簿中创建名为 "折扣" 的函数, 并且从另一个工作簿调用该函数, 则必须键入= .xlsb! 折扣 (), 而不只是= 折扣 ()

您可以通过从 "插入函数" 对话框中选择自定义函数来保存自己的击键 (和可能的键入错误)。 自定义函数显示在用户定义的类别中:

“插入函数”对话框

使自定义函数始终可用的一种更简单的方法是将它们存储在单独的工作簿中, 然后将该工作簿另存为加载项。 然后, 你可以在运行 Excel 时使加载项可用。 下面介绍了如何执行此操作:

  1. 创建所需的函数后, 单击 "文件" > "另存为"。

    在 Excel 2007 中, 单击 " Microsoft Office 按钮", 然后单击 "另存为"

  2. 在 "另存为" 对话框中, 打开 "保存类型" 下拉列表, 然后选择 " Excel 外接程序"。 将工作簿保存在 "加载项" 文件夹中的可识别名称 (如MyFunctions) 下。 "另存为" 对话框将建议该文件夹, 因此只需接受默认位置。

  3. 保存工作簿后, 单击 "文件> Excel 选项"。

    在 Excel 2007 中, 单击 " Microsoft Office 按钮", 然后单击 " Excel 选项"。

  4. 在 " Excel 选项" 对话框中, 单击 "加载项" 类别。

  5. 在 "管理" 下拉列表中, 选择 " Excel 加载项"。 然后单击 "转到" 按钮。

  6. 在 "加载项" 对话框中, 选中用于保存工作簿的名称旁边的复选框, 如下所示。

    加载项对话框

  1. 创建所需的函数后, 单击 "文件" > "另存为"。

  2. 在 "另存为" 对话框中, 打开 "保存类型" 下拉列表, 然后选择 " Excel 外接程序"。 将工作簿保存在可识别的名称下, 如MyFunctions

  3. 保存工作簿后, 单击 "工具> Excel 加载项"。

  4. 在 "加载项" 对话框中, 选择 "浏览" 按钮以查找外接程序, 单击 "打开", 然后在 "可用加载项" 框中选中外接程序旁边的框。

执行这些步骤后, 您的自定义函数将在您每次运行 Excel 时可用。 如果要添加到函数库, 请返回到 Visual Basic 编辑器。 如果你在 VBAProject 标题下的 Visual Basic 编辑器项目资源管理器中查看, 你将看到一个模块, 该模块在加载项文件后命名。 外接程序将具有扩展名 xlam。

vbe 中的命名模块

在 "项目资源管理器" 中双击该模块将导致 Visual Basic 编辑器显示你的函数代码。 若要添加新函数, 请将插入点置于代码窗口中终止最后一个函数的 End 函数语句之后, 然后开始键入。 你可以使用这种方式创建任意数量的函数, 并且这些函数将在 "插入函数" 对话框中的 "用户定义的类别" 中始终可用。

此内容最初是通过标记减减和 Craig Stinson 创作的, 作为其书籍中 Microsoft Office Excel 2007的一部分。 已将其更新为适用于较新版本的 Excel。

需要更多帮助吗?

可随时在 Excel 技术社区中咨询专家,在解答社区获得支持,或在 Excel User Voice 上建议新功能或功能改进。

注意:  本页面是自动翻译的,可能包含语法错误或不准确之处。 我们的目的是使此内容能对你有所帮助。 能否告知我们此信息是否有所帮助? 下面是该参考内容的英文版

扩展你的 Office 技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×