VBA Sub Function完整指南
执行前检查
$ 要完成: Sub 是 VBA 中定义过程(Procedure)的核心关键字,用于封装一段可重复执行的代码,不返回值。... $ 适用范围: 对象模型
Sub 是 VBA 中定义过程(Procedure)的核心关键字,用于封装一段可重复执行的代码,不返回值。一个 Sub 过程以 Sub 名称() 开头,以 End Sub 结尾。调用时直接写过程名即可,不需要 Call 关键字(虽然 Call 也合法)。简单示例:
``vba Sub 显示提示() MsgBox "当前工作簿:" & ThisWorkbook.Name End Sub ``
调用:显示提示 或 Call 显示提示
整个过程不返回数据,适合执行一系列操作:格式化、数据清洗、生成报表、触发宏按钮等。你看到的绝大多数 Excel 宏按钮背后就是一个 Sub 过程。
Where to find it in Excel
VBA 编辑器的入口路径:
- 功能区路径: 开发工具 → Visual Basic(快捷键
Alt + F11) - 插入模块: 菜单栏 → 插入 → 模块(标准模块是存放
Sub的默认位置) - 代码窗格: 模块打开后,白色编辑区域就是写
Sub的地方
如果功能区没有"开发工具"选项卡:文件 → 选项 → 自定义功能区 → 勾选"开发工具"。
> 版本注意: Microsoft 365 Excel 桌面版和 Excel 2016/2019 的 VBA 编辑器界面布局一致,快捷键通用。Excel for web 不支持 VBA 执行。
Step-by-step example

下面用一个常见场景演示完整流程:读取某单元格内容,弹出消息框。
环境设定
假设 Sheet1 的 A1 单元格内容为 "Hello World"。
步骤 1:打开 VBA 编辑器
Alt + F11 打开编辑窗口。
步骤 2:插入标准模块
在左侧"工程资源管理器"中,右键 VBAProject (你的工作簿名) → 插入 → 模块。
步骤 3:写入 Sub 过程
在模块代码窗格粘贴以下内容:
``vba Sub 读取A1并显示() Dim 目标值 As String 目标值 = ThisWorkbook.Sheets("Sheet1").Range("A1").Value MsgBox 目标值 End Sub ``
步骤 4:执行
- 方法一:光标放在过程内部,按
F5(运行当前过程) - 方法二:切换回 Excel,
Alt + F8打开宏对话框,选中读取A1并显示后点"执行"
预期结果
弹出消息框,显示 Hello World。
常见坑 — 工作表名写错
如果 Sheet1 的实际名称是 Sheet1 但被用户重命名为 数据表,则 ThisWorkbook.Sheets("Sheet1") 会报错。改用 ThisWorkbook.Sheets(1)(按位置索引) 或检查表单标签名。建议先在立即窗口(Ctrl + G)输入 ? ThisWorkbook.Sheets(1).Name 验证。
Formula or shortcut examples
示例 1:带参数的 Sub
``vba Sub 填充颜色(目标区域 As Range, 颜色号 As Long) 目标区域.Interior.Color = 颜色号 End Sub ``
调用方式(在另一个 Sub 中):
``vba Sub 调用示例() 填充颜色 Range("A1:A10"), RGB(255, 255, 0) ' 黄色 End Sub ``
示例 2:遍历工作表并汇总
``vba Sub 汇总所有工作表A1() Dim ws As Worksheet Dim 汇总 As Double For Each ws In ThisWorkbook.Worksheets 汇总 = 汇总 + Val(ws.Range("A1").Value) Next ws MsgBox "所有工作表的 A1 合计:" & 汇总 End Sub ``
示例 3:使用 InputBox 交互
``vba Sub 输入行号并选中最左侧单元格() Dim 行号 As Variant 行号 = InputBox("请输入行号:", "行号输入", 1) If 行号 <> "" And IsNumeric(行号) Then Rows(CInt(行号)).Select Else MsgBox "无效输入。" End If End Sub ``
Common errors
下表列出新手最容易触碰的 5 个错误,附带原因与解决办法。
| 错误现象 | 典型原因 | 解决方法 | |----------|----------|----------| | 运行时错误 '91': 对象变量或 With 块变量未设置 | 引用的 Range 或 Worksheet 对象不存在 | 确认 Sheets("不存在") 中的名称拼写正确 | | 编译错误: 参数不是可选的 | 调用 Sub 时漏写了必要参数 | 检查 Sub 定义中的参数个数,调用时补齐 | | 运行时错误 '13': 类型不匹配 | 将文本赋值给数值变量 | 用 Val() 或 CDbl() 转换类型,或声明为 Variant | | Sub 过程无响应但未报错 | 宏被禁用或安全级别过高 | 文件需另存为 .xlsm;开发工具 → 宏安全性 → 启用所有宏(仅对受信任文件) | | 重复声明错误: 名称与模块中现有函数、Sub 或属性冲突 | 模块内已有同名过程 | 使用 VBA 编辑器左侧的"查找"(Ctrl + F)搜索名称,确认唯一性 |
Troubleshooting checklist
当 Sub 不按预期工作时,按这个顺序排查:
- 检查单元格格式:如果 Sub 读取的值与预期不符,先在 Excel 中查看该单元格是否为文本格式(尤其是"以文本形式存储的数字")。右键 → 设置单元格格式 → 常规后重输。
- 用微表测试:在空工作簿中先创建一个 3 行 3 列的测试表,逐步运行 Sub(
F8单步执行),观察每行代码的效果。 - 确认表名和区域名:在立即窗口(
Ctrl + G)输入? ActiveSheet.Name确认当前工作表名称。 - 检查宏是否被关闭:
Alt + F8查看宏列表是否存在。如果空白,VBA 代码可能写在ThisWorkbook或工作表对象而非模块中;将它们移动到标准模块即可出现在列表中。
FAQ
VBA Sub Function完整指南 是什么?
VBA Sub Function 完整指南 是一份面向职场 Office 用户的操作参考,涵盖 Sub 过程的定义位置、标准写法、参数传递、常见报错与排查流程。重点解决"写完后不知道怎么运行""报错看不懂"两个痛点。
VBA Sub Function完整指南 怎么操作?
核心操作三步:打开 VBA 编辑器(Alt + F11) → 插入模块 → 写入 Sub 代码并执行(F5 或 Alt + F8)。更细致用法参见上方"Step-by-step example"部分。
VBA Sub Function完整指南 常见错误有哪些?
最常见的 5 个错误:对象未设置、参数不匹配、数据类型冲突、宏被禁用、重名声明。每个错误的成因与对应修正方法已在上方"Common errors"表格中列出。
同站延伸
- 可以继续看 VBA Sub Function实战案例。
- 建议接着读 VBA Sub Function操作步骤。
- 适合搭配参考 VBA 变量与类型实战案例。