Excel VBA 子程序:如何在 VBA 中调用 Sub(附示例)

⚡ 智能摘要

Excel VBA 子程序是一组执行特定任务但不返回任何值的代码块。本页内容涵盖命名规则、子程序语法、如何通过命令按钮调用子程序,以及子程序与函数的区别。

  • 📦 定义: 子程序执行特定任务,但不向调用它的代码返回任何值。
  • ♻️ 可重用性: 一个子程序可以从项目中的任何位置多次调用。
  • 🔤 命名规则: 名称不包含空格,以字母或下划线开头,并且永远不是 VBA 关键字。
  • 🧾 语法: Private Sub name(ByVal arg As String) 打开代码块,End Sub 关闭代码块。
  • 🖱️ 致电: 命令按钮的点击事件会调用子程序并传递其参数。
  • ▶️ 直接运行: F5、宏对话框或 Call 关键字都可以在不使用按钮的情况下运行子程序。
  • 🔁 子程序或函数: 如果必须返回值,请选择函数;否则,请选择子程序。

Excel VBA 子程序

VBA 中的子程序是什么?

A VBA 中的子程序 是一段执行代码中描述的特定任务但不返回结果或值的代码。子程序用于将大段代码分解为可管理的小部分。子程序可以从程序中的任何位置多次调用。

假设您创建了一个带有文本框的用户界面,用于接受用户输入数据。您可以创建一个子程序来清除文本框的内容。在这种情况下,VBA 调用子程序是合适的,因为您不想返回任何结果。

为什么要使用子程序

  • 将代码分解为易于管理的小代码:普通计算机程序有成千上万行源代码。这增加了复杂性。子程序通过将程序分解为可管理的小代码块来帮助解决此问题。
  • Code 可重用性。假设您有一个需要访问数据库的程序,那么程序中的几乎所有窗口都需要与数据库交互。您可以创建一个处理所有数据库交互的函数,而不必为这些窗口编写单独的代码。然后您可以从任何您想要的窗口调用它。
  • 子程序和函数是自文档的。假设您有一个函数 calculateLoanInterest 和另一个函数 connectToDatabase。只需查看子例程/函数的名称,程序员就能知道该程序的作用。

在编写文件名之前,编译器会要求文件名遵循一组简短的规则。

子程序和函数的命名规则

要使用子程序和函数,必须遵循一系列规则。

  • 子程序或 VBA 调用函数名称不能包含空格
  • Excel VBA 调用子程序或函数名称应以字母或下划线开头。不能以数字或特殊字符开头
  • 子程序或函数名不能是关键字。关键字是在 VBA. Private、Sub、Function、End 等词都是关键字的例子。编译器使用它们来完成特定任务。

选择有效名称后,声明本身遵循固定的模式。

VBA 子程序语法

您需要在 Excel 中启用“开发人员”选项卡才能继续执行此示例。如果您不知道如何启用“开发人员”选项卡,请阅读 Excel中的VBA控件

语法中,

Private Sub mySubRoutine(ByVal arg1 As String, ByVal arg2 As String)
    'do something
End Sub

语法解释

Code 操作
  • “私人子程序 mySubRoutine(…)”
  • 这里使用关键字“Sub”声明一个名为“mySubRoutine”的子程序,并启动子程序的主体。
  • 关键字 Private 用于指定子程序的范围
  • “ByVal arg1 作为字符串,ByVal arg2 作为字符串”:
  • 它声明了两个字符串数据类型名称为 arg1 和 arg2 的参数
  • “结束”
  • “End Sub”用于结束子程序主体

以下子例程接受名字和姓氏并将它们显示在消息框中。

现在我们要编写并执行这个 Sub 过程。让我们看看这个。

如何在 VBA 中调用 Sub

下面是在 VBA 中如何调用 Sub 的逐步过程:

  1. 设计用户界面并设置用户控件的属性。
  2. 添加子程序
  3. 编写调用子程序的命令按钮的单击事件代码
  4. 测试应用程序

步骤1) 用户界面

设计用户界面,如下图所示。

如何在 VBA 中调用 Sub

设置以下属性。我们正在设置的属性:

S / N 通过积极争取让商标与其相匹配的域名优先注册来维护 特性 价值
1 命令按钮 1 姓名 btn显示全名
2 标题 全名子程序

您的界面现在应该如下所示。

如何在 VBA 中调用 Sub

步骤2) 添加子程序

  1. 按 Alt + F11 打开代码窗口
  2. 添加以下子程序
Private Sub displayFullName(ByVal firstName As String, ByVal lastName As String)
    MsgBox firstName & " " & lastName
End Sub

在代码中,

Code 行动
  • “私人子版块 displayFullName(…)”
  • 它声明了一个接受两个字符串参数的私有子程序 displayFullName。
  • “ByVal firstName 作为字符串,ByVal lastName 作为字符串”
  • 它声明了两个参数变量 firstName 和 lastName
  • MsgBox 名字 & ” ” & 姓氏”
  • 它调用 MsgBox 内置函数显示消息框。然后它将“firstName”和“lastName”变量作为参数传递。
  • 使用与号“&”连接两个变量并在它们之间添加空格。

步骤3) 调用子程序

从命令按钮单击事件调用子例程。

  • 如图所示,右键单击命令按钮。选择“查看”。 Code.
  • 代码编辑器将打开

如何在 VBA 中调用 Sub

在代码编辑器中为 btnDisplayFullName 命令按钮的单击事件添加以下代码。

Private Sub btnDisplayFullName_Click()
    displayFullName "John", "Doe"
End Sub

您的代码窗口现在应如下所示

如何在 VBA 中调用 Sub

保存更改并关闭代码窗口。

步骤4) 测试代码

在开发者工具栏上将设计模式设置为“关闭”。如下所示。

如何在 VBA 中调用 Sub

步骤5) 单击命令按钮‘FullName Subroutine’。

您将获得以下结果

如何在 VBA 中调用 Sub

下载上述Excel表格 Code

按钮虽然方便,但并不是启动子程序的唯一方法,而且在开发过程中,它很少是最快的。

如何不通过按钮运行子程序

在编写代码的过程中,仅仅为了测试子程序而向工作表中添加控件会浪费时间。VBA 提供了四种其他方法来运行子程序,每种方法都适用于开发周期中的不同阶段。

  • 在编辑器中按 F5: 将光标放在子程序内部的任意位置,然后按 F5 键。程序会立即运行。这仅在子程序不接受任何参数时有效,因为 VBA 没有值可以提供。
  • 按 F8 单步执行: 每次只执行一行,这样你就可以在“局部变量”窗口中观察每个变量的变化。当结果出错需要查找问题所在时,可以使用此功能。
  • 使用“宏”对话框: 在“开发工具”选项卡上,单击“宏”,选择名称,然后单击“运行”。此列表中仅显示不带参数的公共子程序,因此辅助子程序通常声明为私有程序。
  • 从另一个子程序调用: 这是所有带参数的子程序所使用的方法,也是上面命令按钮所依赖的方法。

最后一种方式有两种可接受的形式。一种是直接写出函数名,后面跟上参数;另一种是显式地使用 `Call` 关键字,但它们的括号规则有所不同。

Sub RunTheGreeting()
    ' Form 1: no Call keyword, no brackets
    displayFullName "John", "Doe"

    ' Form 2: Call keyword, brackets required
    Call displayFullName("Jane", "Roe")
End Sub

这两行代码的功能完全相同。如果混用这两种形式(即省略 Call 关键字直接使用括号),是导致 Sub 函数接受多个参数时出现“Expected: =”编译错误的最常见原因。

VBA 中 Sub 和 Function 的区别

Sub 和 Function 是 VBA 中的两种过程类型,初学者常常选错。决定性的问题很简单:调用代码是否需要返回值?

特性 小组 功能
返回一个值 没有 是的,已分配给函数名
已声明 子…结束子 函数…结束函数
被称为 一份独立声明 表达式的一部分,例如 x = myFunc(2)
可在工作表单元格中使用 没有 是的,作为用户自定义函数
典型用途 格式化工作表、清除输入、显示消息 计算总数、转换数值、查找数据

当代码操作工作簿时,请使用 Sub 语句。 VBA 函数 当代码产生一个结果,而这个结果又被其他程序使用时。

常见问题

私有子程序只能在声明它的模块内部调用。公共子程序对项目中的每个模块都可见,并且是唯一会显示在“宏”对话框中的子程序类型。

ByVal 传递的是变量的副本,因此子程序无法修改调用者的变量。ByRef 传递的是变量本身,因此任何更改对调用者都是可见的。如果两个关键字都未指定,则默认使用 ByRef。

使用 Exit Sub 语句。它会在该点停止过程并将控制权返回给调用它的对象,这在验证测试失败时提前退出非常有用。

是的。粘贴宏后,AI 助手会将相关行分组,为每个新子程序建议一个描述性名称,并将原始代码重写为一系列简短的调用。在工作簿副本上测试结果。

是的。提供错误文本和调用行,人工智能助手会识别出诸如未使用 Call 关键字的括号、错误的参数数量或不匹配的数据类型等原因,然后提供更正后的代码行。

总结一下这篇文章: