VBA 中的“函数”和“子”过程

内置 VBA 函数

在开始创建自己的 VBA 函数之前,最好知道 Excel VBA 具有丰富的预建内置函数集合,您可以在编写代码时使用这些函数。

这些函数的列表可以在 VBA 编辑器中查看:

  • 打开 Excel 工作簿并启动 VBA 编辑器(单击以执行此操作 Alt + F11键),然后按 F2.
  • 从屏幕左上角的下拉列表中选择一个库 VBA.
  • 将出现一个内置 VBA 类和函数的列表。 单击函数名称可在窗口底部显示其简要说明。 紧迫 F1 将打开该功能的在线帮助页面。

此外,可以在 Visual Basic 开发人员中心找到带有示例的内置 VBA 函数的完整列表。

VBA 中的自定义过程“Function”和“Sub”

在 Excel Visual Basic 中,一组执行特定任务的命令被放置在一个过程中。 功能 (功能)或 小组 (子程序)。 程序的主要区别 功能 и 小组 是那个程序 功能 返回结果,过程 小组 - 不是。

因此,如果您需要执行操作并获得一些结果(例如,将几个数字相加),则通常使用过程 功能,并且为了简单地执行一些操作(例如,更改一组单元格的格式),您需要选择过程 小组.

参数

可以使用参数将各种数据传递给 VBA 过程。 声明过程时指定参数列表。 例如,程序 小组 在 VBA 中,将给定的整数 (Integer) 添加到所选范围内的每个单元格。 您可以使用参数将此数字传递给过程,如下所示:

Sub AddToCells(i As Integer) ... End Sub

请记住,对过程有论据 功能 и 小组 在 VBA 中是可选的。 有些过程不需要参数。

可选参数

VBA 过程可以有可选参数。 这些是用户可以根据需要指定的参数,如果省略它们,则程序使用它们的默认值。

回到前面的例子,要使函数的整数参数成为可选的,它可以这样声明:

Sub AddToCells(可选 i As Integer = 0)

在这种情况下,整数参数 i 默认值为 0。

一个过程中可以有多个可选参数,所有这些参数都列在参数列表的末尾。

按值和按引用传递参数

VBA 中的参数可以通过两种方式传递给过程:

  • 拜尔 – 按值传递参数。 这意味着只有值(即参数的副本)被传递给过程,因此当过程退出时,对过程内的参数所做的任何更改都将丢失。
  • 引用 – 通过引用传递参数。 也就是说,参数位置在内存中的实际地址被传递给过程。 当程序退出时,对程序内的参数所做的任何更改都将被保存。

使用关键字 拜尔 or 引用 在过程声明中,您可以指定如何将参数传递给过程。 这在以下示例中显示:

Sub AddToCells(ByVal i As Integer) ... End Sub
在这种情况下,整数参数 i 按值传递。 离开程序后 小组 全部用 i 更改将丢失。
Sub AddToCells(ByRef i As Integer) ... End Sub
在这种情况下,整数参数 i 通过引用传递。 离开程序后 小组 全部用 i 更改将存储在传递给过程的变量中 小组.

请记住,VBA 中的参数默认通过引用传递。 换句话说,如果不使用关键字 拜尔 or 引用,则参数将通过引用传递。

在进行程序之前 功能 и 小组 更详细地说,再看看这两种程序之间的特征和区别将是有用的。 以下是VBA程序的简要讨论 功能 и 小组 并给出了简单的例子。

VBA 程序 «功能»

VBA 编辑器识别过程 功能当它遇到一组包含在以下开始和结束语句之间的命令时:

功能...结束功能

如前所述,程序 功能 在 VBA 中(相对于 小组) 返回一个值。 以下规则适用于返回值:

  • 返回值的数据类型必须在过程的头部声明 功能.
  • 包含返回值的变量必须与过程命名相同 功能. 该变量不需要单独声明,因为它始终作为过程的组成部分存在。 功能.

这在以下示例中得到了很好的说明。

VBA 函数示例:对 3 个数字执行数学运算

下面是一个 VBA 过程代码示例 功能,它接受三个类型的参数 (双精度浮点数)。 结果,该过程返回另一个数字类型 等于前两个参数的总和减去第三个参数:

函数 SumMinus(dNum1 As Double, dNum2 As Double, dNum3 As Double) As Double SumMinus = dNum1 + dNum2 - dNum3 结束函数

这个非常简单的 VBA 程序 功能 说明如何通过参数将数据传递给过程。 可以看到过程返回的数据类型定义为 (话是说 作为双 在参数列表之后)。 这个例子还显示了程序的结果如何 功能 存储在与过程名称同名的变量中。

调用 VBA 过程“函数”

如果上面的简单程序 功能 插入到 Visual Basic 编辑器中的模块中,它可以从其他 VBA 过程中调用或在 Excel 工作簿中的工作表上使用。

从另一个过程调用 VBA 过程“函数”

程序 功能 可以从另一个 VBA 过程中调用,只需将该过程分配给一个变量即可。 以下示例显示了对过程的调用 苏米纳斯,上面已经定义了。

Sub main() Dim total as Double total = SumMinus(5, 4, 3) End Sub

从工作表调用 VBA 过程“函数”

VBA 程序 功能 可以像任何其他内置 Excel 函数一样从 Excel 工作表调用。 因此,前面示例中创建的过程 功能苏米纳斯 可以通过在工作表单元格中输入以下表达式来调用:

=SumMinus(10, 5, 2)

VBA 程序 «子»

VBA编辑器明白前面有一个程序 小组当它遇到一组包含在以下开始和结束语句之间的命令时:

子...结束子

VBA 程序“Sub”:示例 1. 选定单元格范围内的中心对齐和字体大小更改

考虑一个简单的 VBA 过程的示例 小组,其任务是更改所选单元格区域的格式。 单元格居中(垂直和水平),字体大小更改为用户指定的:

Sub Format_Centered_And_Sized(Optional iFontSize As Integer = 10) Selection.Horizo​​ntalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Size = iFontSize End Sub

这个程序 小组 执行操作但不返回结果。

此示例还使用了一个可选参数 字体大小. 如果论证 字体大小 未传递给程序 小组,则其默认值为 10。但是,如果参数 字体大小 传递给程序 小组,则选定的单元格范围将设置为用户指定的字体大小。

VBA 子程序:示例 2:在选定的单元格范围内居中对齐和粗体字体

以下过程与刚刚讨论的过程类似,但这次不是调整大小,而是将粗体字体样式应用于选定的单元格区域。 这是一个示例过程 小组,不带参数:

Sub Format_Centered_And_Bold() Selection.Horizo​​ntalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Bold = True End Sub

在 Excel VBA 中调用“子”过程

从另一个过程调用 VBA 过程“Sub”

调用 VBA 过程 小组 从另一个 VBA 程序,你需要写关键字 电话联系, 过程名称 小组 括号中是过程的参数。 这在下面的示例中显示:

Sub main() 调用 Format_Centered_And_Sized(20) End Sub

如果程序 格式居中和大小 有多个参数,它们必须用逗号分隔。 像这样:

Sub main() 调用 Format_Centered_And_Sized(arg1, arg2, ...) End Sub

从工作表中调用 VBA 过程“Sub”

程序 小组 不能直接输入到 Excel 工作表单元格中,可以通过程序来完成 功能因为程序 小组 不返回值。 不过,手续 小组,它们没有参数并被声明为 公共 (如下所示)将提供给工作表的用户。 因此,如果上面讨论的简单程序 小组 插入到 Visual Basic 编辑器中的模块中,过程 格式居中和粗体 将可在 Excel 工作表中使用,并且该过程 格式居中和大小 – 将不可用,因为它有参数。

这是运行(或执行)过程的简单方法 小组,可从工作表访问:

  • 媒体 Alt + F8键 (按键 其他 并在按住它的同时按 键 F8).
  • 在出现的宏列表中,选择要运行的宏。
  • 媒体 运行 (跑)

执行程序 小组 您可以快速轻松地为其分配键盘快捷键。 为了这:

  • 媒体 Alt + F8键.
  • 在出现的宏列表中,选择要为其分配键盘快捷键的宏。
  • 媒体 参数 (选项)并在出现的对话框中输入键盘快捷键。
  • 媒体 OK 并关闭对话框 (宏)。

注意: 为宏分配键盘快捷键时,请确保它不是 Excel 中的标准(例如, 按Ctrl + C)。 如果您选择一个已经存在的键盘快捷键,它将被重新分配给宏,因此,用户可能会意外启动宏。

VBA 过程范围

本教程的第 2 部分讨论了变量和常量的范围以及关键字的作用。 公共 и 私做. 这些关键字也可以用于 VBA 过程:

Public Sub AddToCells(i As Integer) ... End Sub
如果过程声明前面有关键字 公共,则该过程将可用于该 VBA 项目中的所有模块。
Private Sub AddToCells(i As Integer) ... End Sub
如果过程声明前面有关键字 私做,则此过程将仅适用于当前模块。 在任何其他模块中或从 Excel 工作簿中都不能调用它。

请记住,如果在声明 VBA 过程之前 功能 or 小组 未插入关键字,为过程设置默认属性 公共 (也就是说,它将在此 VBA 项目中随处可用)。 这与变量声明相反,变量声明默认为 私做.

提前退出 VBA 程序“Function”和“Sub”

如果您需要终止 VBA 过程的执行 功能 or 小组,无需等待其自然结束,则为此有运算符 退出功能 и 退出小组. 下面以一个简单的过程为例说明这些运算符的使用。 功能A 期望收到一个肯定的参数来执行进一步的操作。 如果将非正值传递给过程,则无法执行进一步的操作,因此应向用户显示错误消息并且过程应立即退出:

Function VAT_Amount(sVAT_Rate As Single) As Single VAT_Amount = 0 If sVAT_Rate <= 0 Then MsgBox "Expected a Positive value of sVAT_Rate but Received" & sVAT_Rate 退出函数 End If ... End Function

请注意,在完成程序之前 功能 - 增值税金额,在代码中插入了一个内置的 VBA 函数 MSGBOX,向用户显示警告弹出窗口。

发表评论